Я пытаюсь отправить задание mapreduce из затмения, задание отправлено, но с ошибкой ClassNotFoundException
.После некоторого исследования я нашел причину (пожалуйста, прочитайте объяснение ниже), и мне стало интересно, есть ли способ настроить затмение для решения этой проблемы.
Почему сбой задания с ClassNotFoundException
В коде драйвера mapreduce мы обычно устанавливаем Jar по имени класса, то есть с помощью функции JobConf.setJarByClass
.Эта функция принимает java.lang.Class
и находит jar, в котором она находится (вызывая ClassUtil.findContainedJar ).Этот файл позже загружается в HDFS как job.jar
.
Но проблема в том, что Eclipse запускает Java-программу, компилирует классы и помещает файлы .class
в каталог bin
, добавляет каталог bin
в CLASSPATH
и запускаетMain
класс.Из-за этого ClassUtil.findContainingJar
не находит ни одного файла, содержащего класс аргумента (он только ищет .jar
файлов) и возвращает null
.Из-за этого ничего не загружается в HDFS, и задания Mapreduce не выполняются с исключением ClassNotFound
.
Что ж, я могу написать простой метод, который может заархивировать требуемые классы и затем предоставить это имя фляги для JobConf
но если есть простой способ изменить поведение затмения, это было бы очень полезно.
PS: проект простой Java-проект, и я запускаю его по умолчанию "Запустить конфигурацию "