Прежде чем я начну играть со 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],
Так что я не уверен, что я делаю неправильно.