【发布时间】:2014-02-25 16:38:41
【问题描述】:
我正在尝试从 YARN 应用程序(详细信息:从 YARN 应用程序中的 ApplicationMaster)运行 java 应用程序。我发现的所有示例都处理运行的 bash 脚本。
我的问题似乎是我错误地将 JAR 文件分发到集群中的节点。我在 YARN 客户端中将 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”。该类存在于错误消息中显示的路径中。
有什么想法我在这里做错了吗?
【问题讨论】:
-
这看起来很复杂。你是如何开始你的 YARN 工作的?您是否尝试过将
-libjars [your jar here]添加为hadoop的参数?这将自动将您的文件分发到任务节点并使 jar 在类路径中可用。 -
您好丹尼尔,感谢您的回答。我想从 java 应用程序开始我的工作,所以命令行参数不是选项。
-
您是否正在使用
o.a.h.mapreduce.Job启动您的工作?如果是这样,您应该能够使用addArchiveToClassPath()和addFileToClassPath()等方法指定要添加到类路径的 jar,这应该等效于命令行选项。 -
不,我正在使用 YarnClient 和 YarnClientApplication 来测试新的 YARN 框架。实际上我想出了如何从 AM 启动一个 java 进程。很快就会发布答案。
标签: java hadoop hadoop-yarn