Scala / Hadoop: указание контекста для редуктора - PullRequest
7 голосов
/ 25 марта 2012

Прежде чем перейти к игре со 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], 

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

1 Ответ

11 голосов
/ 25 марта 2012

На первый взгляд, убедитесь, что значения java.lang.Iterable, а не scala Iterable.Либо импортируйте java.lang.Iterable, либо:

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