0

当我运行 distcp 将数据从 s3 移动到我的本地 hdfs 时,在启动 map reduce 作业以复制数据期间出现此异常:

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
任何建议的 jar?

4

3 回答 3

4

我遇到了同样的问题,花了几天时间解决。有一个缺失的问题

<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主机上由 yarn 配置中的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被打包。如果您不确定丢失的类属于哪个 jar,请在 MAVEN CENTRAL 中使用高级搜索。

我的猜测是它可能与yarn.nodemanager.env-whitelist选项有关。根据 Cloudera “容器可能覆盖而不是使用 NodeManager 的默认值的环境变量。”,但我不确定。

于 2016-01-14T17:27:26.953 回答
2

实际上,这是纱线类路径的问题。您可以在文档中查看默认值(https://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml搜索 yarn.application.classpath)。

所以要解决这个问题,请确保正确设置环境变量,尤其是应该指向 hadoop-mapreduce-client-app-.jar 所在目录的 HADOOP_MAPRED_HOME。

通常,以下应该有效:

纱线站点.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

我花了很长时间尝试在某个 docker 容器上使一切正常,最后我跳过了环境变量并将库目录硬编码到配置文件中并且它可以工作。

在我的环境中(但您需要替换为您的正确目录):

纱线站点.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>

也许你的问题就像我的问题,只是容器启动时没有应用一些环境变量。

于 2016-04-28T16:29:45.443 回答
0

我也遇到了这个问题。在我的hadoop发行版本中,没有目录$HADOOP_HOME/share/hadoop/mapreduce/$HADOOP_HOME/share/hadoop/mapreduce/lib/,但是有目录$HADOOP_HOME/share/hadoop/mapreduce1/$HADOOP_HOME/share /hadoop/mapreduce2/

修复目录路径,就OK了。

注意,不要复制yarn-default.xml中的默认值!!!</p>

于 2015-12-17T02:38:09.697 回答