Класс не найден исключение при использовании пользовательского формата вывода для hadoop Map Reduce

Я пытаюсь запустить работу по сокращению карты. Я создал исполняемый файл jar, используя eclipse, и мой класс входного формата и класс выходного формата находятся в одном пакете с классом, который запускает задание. Все они включены в банку. Я установил класс формата ввода и вывода следующим образом:

job.setInputFormatClass(fully_qualified_name_of_my_input_class.class);
job.setOutputFormatClass(fully_qualified_name_of_my_output_class.class);

Но когда я выполняю банку, используя hadoop jar myJar.jar я получаю исключение "класс не найден" для моего класса выходного формата, но я не получаю его для моего класса входного формата. Как исправить это?? Здесь трассировка стека

java.lang.RuntimeException: java.lang.ClassNotFoundException: my-class-name
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:867)
    at org.apache.hadoop.mapreduce.JobContext.getOutputFormatClass(JobContext.java:235)
    at org.apache.hadoop.mapred.Task.initialize(Task.java:513)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:353)
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:416)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121)
    at org.apache.hadoop.mapred.Child.main(Child.java:249)
Caused by: java.lang.ClassNotFoundException: my-class-name
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:266)
    at org.apache.hadoop.conf.Configuration.getClassByName(Configuration.java:820)
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:865)
    ... 8 more

2 ответа

Попробуйте добавить следующее при настройке своей работы.

job.setJarByClass(fully_qualified_name_of_my_input_class.class)

См. Hadoop запрос относительно метода setJarByClass класса Job для получения дополнительной информации.

ClassNotFoundException брошен, потому что JVM не может найти класс. Это может быть связано с:

  1. Действительно желание класс отсутствует.
  2. Класс есть, но из-за какой-то ошибки. JVM не может найти его.

В 1-м случае добавьте класс

Во втором случае удалите все файлы классов в папке bin и очистите проект.

Теперь перезапустите ваш код. Это разрешит исключение.

Другие вопросы по тегам