#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])
}
}