Scala/Hadoop: определение контекста для редуктора

Прежде чем я начну играть со Scoobi или Scrunch, я решил попробовать портировать WordCount на scala (2.9.1), используя только Hadoop (0.20.1) привязки java.

Первоначально у меня было:

class Map extends Mapper[LongWritable, Text, Text, IntWritable] {
  @throws[classOf[IOException]]
  @throws[classOf[InterruptedException]]
  def map(key : LongWritable, value : Text, context : Context) {
    //...

Который скомпилировался нормально, но выдал ошибку во время выполнения:

java.io.IOException: Type mismatch in key from map: expected org.apache.hadoop.io.Text, recieved org.apache.hadoop.io.LongWritable

Немного осмотревшись, я понял, что это было из-за того, что я не определил правильную карту(должен был быть отмечен отсутствием override), поэтому я исправил его следующим образом:

override def map(key : LongWritable, value : Text, 
  context : Mapper[LongWritable, Text, Text, IntWritable]#Context) {

И вуаля, ошибки времени выполнения нет.

Но потом я посмотрел на вывод задания и понял, что мой редьюсер не запускается.

Итак, я посмотрел на свой редюсер и заметил, что сигнатура reduceимеет ту же проблему, что и мой преобразователь:

class Reduce extends Reducer[Text, IntWritable, Text, IntWritable] {
  @throws[classOf[IOException]]
  @throws[classOf[InterruptedException]]
  def reduce(key : Text, value : Iterable[IntWritable], context : Context) {
    //...

Поэтому я предположил, что идентификатор reduceиспользовался несоответствие.

Но когда я попытался исправить сигнатуру reduce:

override def reduce(key: Text, values : Iterable[IntWritable], 
  context : Reducer[Text, IntWritable, Text, IntWritable]#Context) {

, я получил ошибку компилятора:

[ERROR] /path/to/src/main/scala/WordCount.scala:32: error: method reduce overrides nothing
[INFO]     override def reduce(key: Text, values : Iterable[IntWritable], 

Так что я не уверен, что я делаю неправильно.

7
задан rampion 25 March 2012 в 01:57
поделиться