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

16

mapred-site.xml文件的内容:

<configuration>
<property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
</property>

<property>
 <name>yarn.app.mapreduce.am.env</name>
 <value>HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0</value>
</property>

<property>
 <name>mapreduce.map.env</name>
 <value>HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0</value>
</property>

<property>
 <name>mapreduce.reduce.env</name>
 <value>HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0</value>
</property>

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

</configuration>
尽管我设置了yarn.app.mapreduce.am.env和其他参数,但我仍然收到“找不到或加载主类org.apache.hadoop.mapreduce.v2.app.MRAppMaster”的错误。 我正在尝试远程运行map reduce程序,在此过程中,hadoop已安装在Linux机器上,我正在从Windows机器上运行它。 以下是我的作业配置设置。
public class WordCount {
  public static void main(String[] args)
      throws IOException, ClassNotFoundException, InterruptedException {
    //
    UserGroupInformation ugi = UserGroupInformation.createRemoteUser("admin");
    ugi.doAs(new PrivilegedExceptionAction<Void>() {

      public Void run() throws Exception {
        try {
          Configuration configuration = new Configuration();

          configuration.set("yarn.resourcemanager.address", "192.168.33.75:50001"); // see step 3
          configuration.set("mapreduce.framework.name", "yarn");
          // configuration.set("yarn.app.mapreduce.am.env",
          // "HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0");
          // configuration.set("mapreduce.map.env", "HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0");
          // configuration.set("mapreduce.reduce.env",
          // "HADOOP_MAPRED_HOME=/home/admin/hadoop-3.1.0");
          configuration.set("fs.defaultFS", "hdfs://192.168.33.75:54310"); // see step 2
          configuration.set("mapreduce.app-submission.cross-platform", "true");
          configuration.set("mapred.remote.os", "Linux");
          configuration.set("yarn.application.classpath",
              "$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/*");

          Job job = Job.getInstance(configuration);

          job.setJarByClass(WordCount.class); // use this when uploaded the Jar to the server and
                                              // running the job directly and locally on the server
          job.setOutputKeyClass(Text.class);
          job.setOutputValueClass(IntWritable.class);
          job.setMapperClass(MapForWordCount.class);
          job.setReducerClass(ReduceForWordCount.class);

          Path input = new Path("/user/admin/wordCountInput.txt");
          Path output = new Path("/user/admin/output");
          FileInputFormat.addInputPath(job, input);
          FileOutputFormat.setOutputPath(job, output);
          System.exit(job.waitForCompletion(true) ? 0 : 1);
        } catch (Exception e) {
          e.printStackTrace();
        }
        return null;
      }

    });


  }

请帮帮我,我已经被这个问题困扰了6天。非常感谢您的帮助。

Hadoop版本:3.1.0


1
在这种情况下,将/home/admin/hadoop-3.1.0符号链接到/home/admin/hadoop可能会很方便...当您升级hadoop时,更改符号链接,但不必在所有配置文件中更改版本号。 - dannyman
6个回答

18

只需编辑mapred-site.xml文件:

添加以下属性:

  1. <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property>

  2. <property> <name>yarn.app.mapreduce.am.env</name> <value>HADOOP_MAPRED_HOME=你的Hadoop主目录地址</value> </property>

  3. <property> <name>mapreduce.map.env</name> <value>HADOOP_MAPRED_HOME=你的Hadoop主目录地址</value> </property>

  4. <property> <name>mapreduce.reduce.env</name> <value>HADOOP_MAPRED_HOME=你的Hadoop主目录地址</value> </property>

现在对于上述4个属性,将路径/Users/adityaatri/Applications/hadoop-3.1.3替换为你的Hadoop主目录地址。

现在添加第5个属性 :

  1. <property> <name>mapreduce.application.classpath</name> <value></value> </property>

在终端中执行以下命令后,必须填写<value>元素内容:

  1. export HADOOP_CLASSPATH=$(hadoop classpath)

  • echo $HADOOP_CLASSPATH

  • 我的终端输出:

    /Users/adityaatri/Applications/hadoop-3.1.3/etc/hadoop:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/common/lib/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/common/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/hdfs:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/hdfs/lib/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/hdfs/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/mapreduce/lib/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/mapreduce/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/yarn:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/yarn/lib/*:/Users/adityaatri/Applications/hadoop-3.1.3/share/hadoop/yarn/*

    将此内容复制到第5个属性的<value>元素中。

    现在,您将不会收到任何错误。:)


    16

    我也遇到过同样的问题,通过在mapred-site.xml中添加以下内容解决问题(因此请编辑您的mapreduce.application.classpath属性)

    <property> 
        <name>mapreduce.application.classpath</name>
        <value>$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*,$HADOOP_MAPRED_HOME/share/hadoop/common/*,$HADOOP_MAPRED_HOME/share/hadoop/common/lib/*,$HADOOP_MAPRED_HOME/share/hadoop/yarn/*,$HADOOP_MAPRED_HOME/share/hadoop/yarn/lib/*,$HADOOP_MAPRED_HOME/share/hadoop/hdfs/*,$HADOOP_MAPRED_HOME/share/hadoop/hdfs/lib/*</value>
    </property>
    

    1
    请确保您同时拥有share/hadoop/X/*share/hadoop/X/lib/*。我遇到了同样的问题,问题最终是由于拥有share/hadoop/yarn/*但缺少share/hadoop/yarn/lib/*引起的! - erwaman

    5
    我在yarn-site.xml文件中添加了以下属性。
    <property>
      <name>yarn.application.classpath</name>
      <value> $HADOOP_CONF_DIR,$HADOOP_COMMON_HOME/share/hadoop/common/*,$HADOOP_COMMON_HOME/share/hadoop/common/lib/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/*,$HADOOP_HDFS_HOME/share/hadoop/hdfs/lib/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*,
        $HADOOP_YARN_HOME/share/hadoop/yarn/*,$HADOOP_YARN_HOME/share/hadoop/yarn/lib/* 
      </value>
    </property>
    

    我在我的 MapReduce 程序中进行了一些更改。

      configuration.set("yarn.application.classpath",
                  "{{HADOOP_CONF_DIR}},{{HADOOP_COMMON_HOME}}/share/hadoop/common/*,{{HADOOP_COMMON_HOME}}/share/hadoop/common/lib/*,"
                      + " {{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/*,{{HADOOP_HDFS_HOME}}/share/hadoop/hdfs/lib/*,"
                      + "{{HADOOP_MAPRED_HOME}}/share/hadoop/mapreduce/*,{{HADOOP_MAPRED_HOME}}/share/hadoop/mapreduce/lib/*,"
                      + "{{HADOOP_YARN_HOME}}/share/hadoop/yarn/*,{{HADOOP_YARN_HOME}}/share/hadoop/yarn/lib/*");
    

    我的程序现在运行顺畅。如果你有任何问题,请随时问我细节。


    0
    我在mapred.xml中添加了mapreduce.application.classpath,但仍然无法正常工作。然后我从我的Linux服务器下载了core-site.xmlmapred-site.xmlyarn-site.xml文件,将这些文件放入您的IDEA中的resources路径中,然后它就可以正常工作了!

    0

    只需将以下内容添加到yarn-site.xml中,以便将环境变量传递下来。我遇到了相同的问题,并且这个方法解决了它。我正在运行Hadoop 3.3.6。

    <property>
        <name>yarn.nodemanager.env-whitelist</name>
        <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_HOME,PATH,LANG,TZ,HADOOP_MAPRED_HOME
        </value>
    </property>
    

    这个与被接受的答案有何不同? - Lajos Arpad
    被接受的答案使用了不必要的相对路径。它还建议在代码中设置路径,同样是不必要的。更简洁的解决方案是通过系统配置文件将所有环境变量传递给任何应用程序。改动较少 :-) - Amit Jain

    0
    问题在于您的资源管理器(yarn)无法加载Hadoop库(jars)。 我通过更新配置文件来解决这个问题。 将以下内容添加到yarn-site.xml中:
    <property>
    <name>yarn.application.classpath</name>
    <value>C:/hadoop-2.8.0/share/hadoop/mapreduce/*,C:/hadoop-2.8.0/share/hadoop/mapreduce/lib/*,C:/Hadoop-2.8.0/share/hadoop/common/*,C:/Hadoop-2.8.0/share/hadoop/common/lib/*,
        C:/hadoop-2.8.0/share/hadoop/hdfs/*,C:/hadoop-2.8.0/share/hadoop/hdfs/lib/*,C:/hadoop-2.8.0/share/hadoop/yarn/*,C:/hadoop-2.8.0/share/hadoop/yarn/lib/*</value>
    </property>
    
    请注意,这里使用的路径可以根据您的系统进行相对路径设置。

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接