Hadoop distcp поднимает Не удалось найти или загрузить основной класс org.apache.hadoop.mapreduce.v2.app.MRAppMaster

Когда я запускаю distcp для перемещения данных из s3 в мои локальные hdfs, я получаю это исключение во время задания уменьшения карты, запущенного для копирования данных:

Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster

Я проверил все возможные статьи в Интернете. Мой файл yarn-site.xml содержит

<property> <name>yarn.application.classpath</name> <value> $HADOOP_CONF_DIR, $HADOOP_COMMON_HOME/*, $HADOOP_COMMON_HOME/lib/*, $HADOOP_HDFS_HOME/*, $HADOOP_HDFS_HOME/lib/*, $HADOOP_MAPRED_HOME/*, $HADOOP_MAPRED_HOME/lib/*, $HADOOP_YARN_HOME/*, $HADOOP_YARN_HOME/lib/*, $HADOOP_HOME/share/hadoop/mapreduce/, $HADOOP_HOME/share/hadoop/mapreduce/lib/ </value> </property> для каждого узла кластера я проверил, и эти переменные установлены и указывают на нужную папку, на самом деле $HADOOP_HOME/share/hadoop/mapreduce/это та, которая указывает на hadoop-mapreduce-client-app-2.7.1.jarэто банка, содержащая org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Есть предложения??


person tmnd91    schedule 13.08.2015    source источник


Ответы (3)


У меня была такая же проблема, и я потратил несколько дней на ее решение. Возникла проблема с отсутствием

<property>
    <name>mapreduce.application.classpath</name>
    <value>
       $HADOOP_MAPRED_HOME/*,
       $HADOOP_MAPRED_HOME/lib/*,
       $MR2_CLASSPATH,
       $CDH_MR2_HOME
    </value>
</property>

в mapred-site.xml

Вот весь путь, который мне пришлось пройти (на случай, если кому-то придется исследовать подобные проблемы): После запуска задания я мог увидеть ошибку в журнале клиента, например:

Исключение из запуска контейнера:

org.apache.hadoop.util.Shell$ExitCodeException: 
    org.apache.hadoop.util.Shell$ExitCodeException: 
        at org.apache.hadoop.util.Shell.runCommand(Shell.java:505)
        at org.apache.hadoop.util.Shell.run(Shell.java:418)
        at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:650)
        at org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:195)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:283)
        at org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:79)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)

    Container exited with a non-zero exit code 1

Также я заметил Ошибку: не удалось найти или загрузить основной класс org.apache.hadoop.mapreduce.v2.app.MRAppMaster в журнале выполнения задания.

Чтобы выяснить это, вы можете перейти в каталог журналов на хосте NodeManager, определенном параметром hadoop.log.dir в конфигурации пряжи (в моем случае это /var/ log/cloudera_logs/hadoop-yarn/). Там вы увидите файл hadoop-cmf-yarn-NODEMANAGER*. Это может помочь вам следить за всем рабочим процессом, включая запуск скриптов и процесс очистки в каталоге ./container. Здесь хорошо обратить внимание на скрипт default_container_executor.sh. Этот скрипт обычно выполняет экспорт всех системных переменных перед выполнением задания. В моем случае все, что связано с $HADOOP_MAPRED_*, отсутствовало.

Затем я начал просматривать параметры конфигурации своего сервера, чтобы найти параметр mapreduce.application.classpath, который уже указывал на правильные переменные. По какой-то причине они не были применимы, когда задание выполнялось.

После этого я попытался добавить те же самые переменные на стороне клиента в mapred-site.xml, и это сработало.

Обратите внимание, что ваш $HADOOP_MAPRED_HOME должен указывать на действительное местоположение hadoop-mapreduce-client-app-.jar, где org.apache.hadoop.mapreduce. v2.app.MRAppMaster был упакован. Используйте расширенный поиск в MAVEN CENTRAL, если вы не уверены, к какой банке относится ваш отсутствующий класс.

Я предполагаю, что это может быть как-то связано с опцией yarn.nodemanager.env-whitelist. Согласно Cloudera «Переменные среды, которые контейнеры могут переопределять, а не использовать по умолчанию NodeManager», но я не уверен в этом.

person user3504158    schedule 14.01.2016

По сути, это проблема пути к классам пряжи. Вы можете увидеть значения по умолчанию в документе (https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml найдите yarn.application.classpath).

Поэтому, чтобы решить эту проблему, убедитесь, что переменные среды установлены правильно, особенно HADOOP_MAPRED_HOME, который должен указывать на каталог, в котором находится hadoop-mapreduce-client-app-.jar.

Обычно должно работать следующее:

yarn-site.xml

<property>
 <name>yarn.application.classpath</name>
 <value>$HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/*,$HADOOP_COMMON_HOME/lib/*,$HADOOP_HDFS_HOME/*,$HADOOP_HDFS_HOME/lib/*,$HADOOP_YARN_HOME/*,$HADOOP_YARN_HOME/lib/*,$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*</value>
</property>

mapred-site.xml

<property>
<name>mapreduce.application.classpath</name>
<value>$HADOOP_MAPRED_HOME/*,$HADOOP_MAPRED_HOME/lib/*</value>
</property>

Например, если HADOOP_MAPRED_HOME указывает на /usr/lib/hadoop-mapreduce

Мне потребовалось много времени, чтобы попытаться сделать все в порядке в каком-то контейнере докеров, и, наконец, я пропускаю переменные среды и жестко запрограммировал каталоги библиотек в файлах конфигурации, и это работает.

В моей среде (но вам нужно заменить правильный каталог для вашего):

yarn-site.xml

<property>
<name>yarn.application.classpath</name>
<value>/etc/hadoop/conf,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*</value>
</property>

mapred-site.xml

<property>
<name>mapreduce.application.classpath</name>
<value>/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*</value>
</property>

Возможно, ваша проблема похожа на мины, просто некоторые переменные среды не применяются при запуске контейнера.

person loicmathieu    schedule 28.04.2016

Я также столкнулся с этой проблемой. В моей версии выпуска Hadoop нет каталога $HADOOP_HOME/share/hadoop/mapreduce/ и $HADOOP_HOME/share/hadoop/mapreduce/lib/, но есть каталог $HADOOP_HOME/share/hadoop/mapreduce1/ и $HADOOP_HOME/share/hadoop/mapreduce2/.

Исправьте путь к каталогу, просто ОК.

Будьте осторожны, не копируйте значение по умолчанию в yarn-default.xml!!!

person wankunde    schedule 17.12.2015