【问题标题】:FATAL [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster: Error starting MRAppMaster java.lang.NoClassDefFoundErrorFATAL [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:错误启动 MRAppMaster java.lang.NoClassDefFoundError
【发布时间】:2018-01-30 06:58:36
【问题描述】:

我是 hadoop 新手。

我正在尝试将 Giraph 设置为使用 yarn 在 hadoop-2.6.5 上运行。

当我提交 Giraph 作业时,该作业已成功提交但失败,并且我在容器系统日志中登录如下:

2018-01-30 12:09:01,190 信息 [主要] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:已创建 MRAppMaster 对于应用程序 appattempt_1517293264136_0002_000002 2018-01-30 12:09:01,437 警告 [主] org.apache.hadoop.util.NativeCodeLoader: 无法为您的平台加载 native-hadoop 库...使用 适用的内置 java 类 2018-01-30 12:09:01,471 信息 [主要] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:执行与 代币:2018-01-30 12:09:01,471 INFO [主] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:种类: YARN_AM_RM_TOKEN,服务:,标识:(appAttemptId { application_id { id: 2 cluster_timestamp: 1517293264136 } attemptId: 2 } keyId: -1485907628) 2018-01-30 12:09:01,583 INFO [main] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:使用 mapred 新的 ApiCommitter。 2018-01-30 12:09:02,154 信息 [主要] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:OutputCommitter 设置在 配置空 2018-01-30 12:09:02,207 致命 [主要] org.apache.hadoop.mapreduce.v2.app.MRAppMaster:启动错误 MRAppMaster java.lang.NoClassDefFoundError: io/netty/buffer/ByteBufAllocator 在 org.apache.giraph.bsp.BspOutputFormat.getOutputCommitter(BspOutputFormat.java:62) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:470) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster$1.call(MRAppMaster.java:452) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster.callWithJobClassLoader(MRAppMaster.java:1541) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster.createOutputCommitter(MRAppMaster.java:452) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster.serviceInit(MRAppMaster.java:371) 在 org.apache.hadoop.service.AbstractService.init(AbstractService.java:163) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster$4.run(MRAppMaster.java:1499) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth.Subject.doAs(Subject.java:422) 在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1692) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster.initAndStartAppMaster(MRAppMaster.java:1496) 在 org.apache.hadoop.mapreduce.v2.app.MRAppMaster.main(MRAppMaster.java:1429) 引起:java.lang.ClassNotFoundException: io.netty.buffer.ByteBufAllocator 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 13 更多 2018-01-30 12:09:02,209 信息 [主要] org.apache.hadoop.util.ExitUtil: 以状态 1 退出

日志中的诊断显示以下日志:

应用程序 application_1517293264136_0002 由于 AM 失败了 2 次 appattempt_1517293264136_0002_000002 的容器退出 exitCode: 1 如需更详细的输出,请查看应用程序跟踪 页面:http://172.16.0.218:8088/proxy/application_1517293264136_0002/Then, 单击指向每次尝试日志的链接。诊断:异常来自 容器启动。容器编号:container_1517293264136_0002_02_000001 退出代码:1 堆栈跟踪:ExitCodeException exitCode=1:at org.apache.hadoop.util.Shell.runCommand(Shell.java:575) 在 org.apache.hadoop.util.Shell.run(Shell.java:478) 在 org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:766) 在 org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor.launchContainer(DefaultContainerExecutor.java:212) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:302) 在 org.apache.hadoop.yarn.server.nodemanager.containermanager.launcher.ContainerLaunch.call(ContainerLaunch.java:82) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 容器以 非零退出代码 1 此尝试失败。申请失败。

它失败的类是io/netty/buffer/ByteBufAllocator,它在 netty-all jar 中:https://mvnrepository.com/artifact/io.netty/netty-all

从其他问题我尝试在 HADOOP_CLASSPATH 中添加 jar。

Yogin-Patel:hadoop yoginpatel$ echo $HADOOP_CLASSPATH
/Users/yoginpatel/Downloads/gradle-4.3/caches/modules-2/files-2.1/io.netty/netty-all/4.0.43.Final/9781746a179070e886e1fb4b1971a6bbf02061a4/netty-all-4.0.43.Final.jar
Yogin-Patel:hadoop yoginpatel$ 

它也会出现在hadoop classpath 中。

Yogin-Patel:hadoop yoginpatel$ hadoop classpath
/Users/yoginpatel/hadoop/etc/hadoop:/Users/yoginpatel/hadoop/share/hadoop/common/lib/*:/Users/yoginpatel/hadoop/share/hadoop/common/*:/Users/yoginpatel/hadoop/share/hadoop/hdfs:/Users/yoginpatel/hadoop/share/hadoop/hdfs/lib/*:/Users/yoginpatel/hadoop/share/hadoop/hdfs/*:/Users/yoginpatel/hadoop/share/hadoop/yarn/lib/*:/Users/yoginpatel/hadoop/share/hadoop/yarn/*:/Users/yoginpatel/hadoop/share/hadoop/mapreduce/lib/*:/Users/yoginpatel/hadoop/share/hadoop/mapreduce/*:/Users/yoginpatel/Downloads/gradle-4.3/caches/modules-2/files-2.1/io.netty/netty-all/4.0.43.Final/9781746a179070e886e1fb4b1971a6bbf02061a4/netty-all-4.0.43.Final.jar:/contrib/capacity-scheduler/*.jar
Yogin-Patel:hadoop yoginpatel$ 

我正在尝试在开发环境中进行设置。这是单节点设置。

我也试过了

job.addFileToClassPath(new Path("/Users/yoginpatel/Downloads/gradle-4.3/caches/modules-2/files-2.1/io.netty/netty-all/4.0.43.Final/9781746a179070e886e1fb4b1971a6bbf02061a4/netty-all-4.0.43.Final.jar"));

这些方法都没有帮助。如何让 hadoop 节点获得必要的 jar 访问权限?

这是一个 GiraphJob 提交代码,它将向集群提交 map reduce 作业:

    @Test
    public void testPageRank() throws IOException, ClassNotFoundException, InterruptedException {

        GiraphConfiguration giraphConf = new GiraphConfiguration(getConf());
        giraphConf.setWorkerConfiguration(1,1,100);
        GiraphConstants.SPLIT_MASTER_WORKER.set(giraphConf, false);

        giraphConf.setVertexInputFormatClass(JsonLongDoubleFloatDoubleVertexInputFormat.class);
        GiraphFileInputFormat.setVertexInputPath(giraphConf,
                                                 new Path("/input/tiny-graph.txt"));
        giraphConf.setVertexOutputFormatClass(IdWithValueTextOutputFormat.class);

        giraphConf.setComputationClass(PageRankComputation.class);

        GiraphJob giraphJob = new GiraphJob(giraphConf, "page-rank");
        giraphJob.getInternalJob().addFileToClassPath(new Path("/Users/yoginpatel/Downloads/gradle-4.3/caches/modules-2/files-2.1/io.netty/netty-all/4.0.43.Final/9781746a179070e886e1fb4b1971a6bbf02061a4/netty-all-4.0.43.Final.jar"));

        FileOutputFormat.setOutputPath(giraphJob.getInternalJob(),
                                       new Path("/output/page-rank2"));
        giraphJob.run(true);
    }

    private Configuration getConf() {
        Configuration conf = new Configuration();
        conf.set("fs.defaultFS", "hdfs://localhost:9000");

        conf.set("yarn.resourcemanager.address", "localhost:8032");

        // framework is now "yarn", should be defined like this in mapred-site.xm
        conf.set("mapreduce.framework.name", "yarn");
        return conf;
    }

【问题讨论】:

    标签: java hadoop classpath giraph


    【解决方案1】:

    我通过将 giraph 的 jar 与依赖项放在 hadoop lib 路径中来使其工作:

    cp giraph-1.3.0-SNAPSHOT-for-hadoop-2.6.5-jar-with-dependencies.jar ~/hadoop/share/hadoop/mapreduce/lib/
    

    【讨论】:

      猜你喜欢
      • 2021-09-13
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 2014-01-17
      • 2021-10-17
      • 1970-01-01
      • 2013-09-09
      相关资源
      最近更新 更多