hadoop distcp 引发无法找到或加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

tmn*_*d91 0 hadoop amazon-s3 distcp

当我运行 distcp 将数据从 s3 移动到本地 hdfs 时,我在启动映射减少作业以复制数据期间遇到此异常:

Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
Run Code Online (Sandbox Code Playgroud)

我检查了所有可能的在线文章。我的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包含任何建议的 jar 的那个org.apache.hadoop.mapreduce.v2.app.MRAppMaster

use*_*158 5

我遇到了同样的问题,花了几天时间才解决。出现了缺失的问题

<property>
    <name>mapreduce.application.classpath</name>
    <value>
       $HADOOP_MAPRED_HOME/*,
       $HADOOP_MAPRED_HOME/lib/*,
       $MR2_CLASSPATH,
       $CDH_MR2_HOME
    </value>
</property>
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

我还注意到错误:在作业执行日志中找不到或加载主类 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 。如果您不确定丢失的类属于哪个 jar,请使用 MAVEN CENTRAL 中的高级搜索。

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