【问题标题】:Start a java application from Hadoop YARN从 Hadoop YARN 启动一个 java 应用程序
【发布时间】: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


【解决方案1】:

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

我没有将 packageResource 指定为文件而不是存档:

packageResource.setType(LocalResourceType.FILE);

现在节点管理器不会提取资源,而是将其保留为文件。在我的情况下作为 JAR。 要开始我调用的过程:

java -jar primecalculator.jar

要启动 JAR 而不在命令行中指定主类,您必须在 MANIFEST 文件中指定主类(手动或让 maven 为您完成)。

总结一下:我没有将资源添加为存档,而是作为文件添加,并且我没有使用 -cp 命令添加由 hadoop 为提取的存档文件夹创建的 syslink 文件夹。我只需通过 -jar 参数启动 JAR 即可。

希望对大家有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多