Нет такого исключения метода Hadoop

Когда я запускаю файл Hadoop .jar из командной строки, он генерирует исключение, не указывающее такой метод StockKey метода.

StockKey – мой пользовательский class, определенный для моего собственного типа ключа.

Вот исключение:

12/07/12 00:18:47 INFO mapred.JobClient: Task Id : attempt_201207082224_0007_m_000000_1, Status : FAILED java.lang.RuntimeException: java.lang.NoSuchMethodException: SecondarySort$StockKey. () at org.apache.hadoop.util.ReflectionUtils.newInstance(ReflectionUtils.java:115) at org.apache.hadoop.io.WritableComparator.newKey(WritableComparator.java:109) at org.apache.hadoop.io.WritableComparator.(WritableComparator.java:95) at org.apache.hadoop.io.WritableComparator.get(WritableComparator.java:51) at org.apache.hadoop.mapred.JobConf.getOutputKeyComparator(JobConf.java:795) at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.(MapTask.java:817) at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:383) at org.apache.hadoop.mapred.MapTask.run(MapTask.java:325) at org.apache.hadoop.mapred.Child$4.run(Child.java:270) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1127) at org.apache.hadoop.mapred.Child.main(Child.java:264) 

Вы должны указать пустой конструктор по умолчанию в своем ключевом classе. Hadoop использует reflection, и он не может угадать какие-либо параметры для подачи.

Поэтому просто добавьте конструктор по умолчанию:

 public StockKey(){} 

Есть еще одна вещь, которую нужно проверить при получении таких ошибок для classов, которые являются записываемыми, картографами, редукторами и т. Д.

Если class является внутренним classом , убедитесь, что он объявлен static (т. Е. Не нужен экземпляр classа-оболочки). В противном случае Hadoop не сможет создать экземпляр вашего внутреннего classа и даст такую ​​же ошибку – нужен конструктор с нулевым аргументом.

Для scala тоже я исправил проблему с добавлением конструктора по умолчанию, как показано ниже,

 class IntPair (first : IntWritable, second : IntWritable) extends WritableComparable[IntPair] { def this() = this(first = new IntWritable(), second = new IntWritable()) def getFirst () : IntWritable = { first } def getSecond () : IntWritable = { second } } 

Убедитесь, что у вас есть конструктор по умолчанию, но мне также пришлось добавить static ключевое слово в объявление classа. То есть,

 public class SecondarySort { public static void main(String[] args) {...} public static class StockKey extends ... {} } 

Никакой ответ мне не помог.

В моем случае это произошло, когда я уменьшил видимость конструктора по ошибке или спешил.

Например, родительский конструктор является общедоступным, а унаследованный class – по умолчанию или защищен!

Столкнулся с этой же проблемой. Исправлено следующими указателями от @Thomas и @Chris.

Похоже, оба эти решения необходимы для решения проблемы:

  • Ответ от @Thomas требуется, поскольку Hadoop использует reflection и при создании крупных проектов.

  • Ответ от @Chris требуется при использовании внутренних classов и вызове Mappers / Reducers из main ().

  • Размер разделения входов Hadoop и размер блока
  • Карта - снижение производительности в MongoDb 2.2, 2.4 и 2.6
  • размер блока данных в HDFS, почему 64 МБ?
  • Как Hadoop выполняет входные расщепления?
  • Почему Spark быстрее, чем Hadoop Map Reduce
  • Hadoop DistributedCache устарел - какой предпочтительный API?
  • Проверьте, соответствует ли каждый элемент массива условию
  • Поддержка gzip в Spark
  • Единовременный эквивалент сохраненной процедуры MongoDB
  • объединить выходные файлы после фазы уменьшения
  • Является ли структура агрегации Mongodb быстрее, чем карта / сокращение?
  • Давайте будем гением компьютера.