Как реализовать Hadoop Mapper в Scala 2.9.0?

#scala #hadoop #scala-2.9

#scala #hadoop #scala-2.9

Вопрос:

Когда я перешел на Scala 2.9.0 с 2.8.1, весь код был функциональным, за исключением Hadoop mappers. Поскольку у меня на пути стояли некоторые объекты-оболочки, я перешел к следующему примеру:

импортируйте org.apache.hadoop.mapreduce.{Mapper, задание}


объект MyJob { 
 def main(аргументы: Массив[строка]) {
 задание val = новое задание (новая конфигурация())
 job.setMapperClass(classOf[MyMapper])

 }
}

класс MyMapper расширяет Mapper[LongWritable,Текст,Текст,Text] {
 переопределить def map (ключ: LongWritable, значение: Text, контекст: Mapper[LongWritable,Text, Текст, Текст]#Контекст) {

 }
}

Когда я запускаю это в 2.8.1, оно работает довольно хорошо (и у меня много производственного кода в 2.8.1. В 2.9.0 я получаю следующую ошибку компиляции:

 error: type mismatch;
found   : java.lang.Class[MyMapper](classOf[MyMapper])
required: java.lang.Class[_ <: org.apache.hadoop.mapreduce.Mapper]
job.setMapperClass(classOf[MyMapper])
  

Сбой вызова происходит, когда я вызываю setMapperClass для объекта Job. Вот определение этого метода:

 public void setMapperClass(java.lang.Class<? extends org.apache.hadoop.mapreduce.Mapper> cls) throws java.lang.IllegalStateException { /* compiled code */ }
  

Определение самого класса Mapper таково:

 public class Mapper<KEYIN, VALUEIN, KEYOUT, VALUEOUT>
  

У кого-нибудь есть представление о том, что я делаю неправильно? Мне кажется, что тип в корне правильный: MyMapper действительно расширяет Mapper, и методу нужно что-то, что расширяет Mapper. И это отлично работает в 2.8.1…

Комментарии:

1. Черт возьми, я тоже не вижу ошибки. Убедитесь, что вы используете 2.9.0.Final, а не какой-нибудь ранний RC. Если вы действительно используете Final, проверьте что-нибудь в базе данных заявок или откройте заявку на это.

2. Большое спасибо, Дэниел! Я ввел запрос здесь: lampsvn.epfl.ch/trac/scala/ticket/4603

3. Scala мигрировала на Jira, поэтому проблема теперь в: issues.scala-lang.org/browse/SI-4603

4. Ошибка компилятора, лежащая в основе, исправлена в Scala 2.9.1 RC2

Ответ №1:

Каким бы глупым это ни казалось, вы можете обойти проблему, определив Mapper перед заданием. Следующее компилируется:

 import org.apache.hadoop._
import org.apache.hadoop.io._
import org.apache.hadoop.conf._
import org.apache.hadoop.mapreduce._

class MyMapper extends Mapper[LongWritable,Text,Text,Text] {
  override def map(key: LongWritable, value: Text, context: Mapper[LongWritable,Text,Text,Text]#Context) {
  }
}

object MyJob {
  def main(args:Array[String]) {
    val job = new Job(new Configuration())
    job.setMapperClass(classOf[MyMapper])
  }
}