我正在尝试从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”。该类完全存在于错误消息中显示的路径中。
我在这里做错了什么想法?
答案 0 :(得分:0)
我发现了如何从ApplicationMaster启动java进程。事实上,我的问题是基于启动流程的命令,即使这是Apache Hadoop项目提供的官方文档方式。
我所做的不是将packageResource指定为文件而不是存档:
packageResource.setType(LocalResourceType.FILE);
现在,节点管理器不提取资源,而是将其保留为文件。在我的情况下作为JAR。 为了开始这个过程,我打电话给:
java -jar primecalculator.jar
要在命令行中未指定主类的情况下启动JAR,您必须在MANIFEST文件中指定主类(手动或让maven为您执行此操作)。
总结一下:我没有将资源添加为存档而是添加为文件,我没有使用-cp命令添加由hadoop为解压缩的存档文件夹创建的syslink文件夹。我只是通过-jar参数启动JAR,就是这样。
希望它可以帮到你们!