Прежде чем перейти к игре со Scoobi или Scrunch, я подумал, что попробую перенести WordCount на scala (2.9.1), используя только привязки Java Hadoop (0.20.1).
Изначально у меня было:
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
Немного осмотревшись, я понял, что это потому, что я не определял правильный метод map
(должен был быть отключен из-за отсутствия 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],
Так что я не уверен, что делаю не так.