从Hadoop YARN启动Java应用程序

时间:2014-02-17 18:42:27

标签: java hadoop yarn

我正在尝试从YARN应用程序运行java应用程序(详细信息:来自YARN应用程序中的ApplicationMaster)。我发现的所有示例都是处理运行的bash脚本。

我的问题似乎是我错误地将JAR文件分发到我的集群中的节点。我在JARN客户端中将JAR指定为本地资源。

Path jarPath2 = new Path("/hdfs/yarn1/08_PrimeCalculator.jar");
jarPath2 = fs.makeQualified(jarPath2);

FileStatus jarStat2 = null;
try {
    jarStat2 = fs.getFileStatus(jarPath2);
    log.log(Level.INFO, "JAR path in HDFS is "+jarStat2.getPath());
} catch (IOException e) {
    e.printStackTrace();
}

LocalResource packageResource = Records.newRecord(LocalResource.class);
packageResource.setResource(ConverterUtils.getYarnUrlFromPath(jarPath2));
packageResource.setSize(jarStat2.getLen());
packageResource.setTimestamp(jarStat2.getModificationTime());
packageResource.setType(LocalResourceType.ARCHIVE);
packageResource.setVisibility(LocalResourceVisibility.PUBLIC);

Map<String, LocalResource> res = new HashMap<String, LocalResource>();
res.put("package", packageResource);

所以我的JAR应该被分发到ApplicationMaster并被解压缩,因为我将ResourceType指定为ARCHIVE。在AM上,我试着像这样从JAR调用一个类:

String command = "java -cp './package/*' de.jofre.prime.PrimeCalculator";

Hadoop日志告诉我运行应用程序时:“无法找到或加载主类de.jofre.prime.PrimeCalculator”。该类完全存在于错误消息中显示的路径中。

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:0)

我发现了如何从ApplicationMaster启动java进程。事实上,我的问题是基于启动流程的命令,即使这是Apache Hadoop项目提供的官方文档方式。

我所做的不是将packageResource指定为文件而不是存档:

packageResource.setType(LocalResourceType.FILE);

现在,节点管理器不提取资源,而是将其保留为文件。在我的情况下作为JAR。 为了开始这个过程,我打电话给:

java -jar primecalculator.jar

要在命令行中未指定主类的情况下启动JAR,您必须在MANIFEST文件中指定主类(手动或让maven为您执行此操作)。

总结一下:我没有将资源添加为存档而是添加为文件,我没有使用-cp命令添加由hadoop为解压缩的存档文件夹创建的syslink文件夹。我只是通过-jar参数启动JAR,就是这样。

希望它可以帮到你们!