为了账号安全,请及时绑定邮箱和手机立即绑定

通过 REST 提交 EMR Yarn 应用程序

通过 REST 提交 EMR Yarn 应用程序

森林海 2022-06-04 16:11:28
我在 AWS 中有一个带有 YARN 的 Hadoop 集群,我向其提交了 Spark 应用程序。我通过 REST 请求工作,提交本文档中指定的 XML:YARN REST API。它适用于常规集群。我目前正在做一个 POC 来使用 EMR 集群而不是通常的 POC,我使用现有的 REST 命令并简单地通过 SSH 与 EMR 的内部 YARN 通信,如下所示:内部 EMR 服务的 Web 访问。它适用于大多数 REST 命令,例如POST http://<rm http address:port>/ws/v1/cluster/apps/new-application,但是当我提交一个新应用程序时,它立即失败并报告它找不到 ApplicationMaster。日志类型:stderr日志上传时间:2019年2月3日星期日17:18:35 +0000日志长度:88错误:无法找到或加载主类 org.apache.spark.deploy.yarn.ApplicationMaster我怀疑这以某种方式连接到类路径,当我将类路径标志添加到 REST 提交应用程序节点时,带有所有 jar 的 EMR FS 位置(/usr/lib/spark/jars/*),它找到了 ApplicationMaster 但然后无法在核心实例中找到 Jars,并带有以下奇怪的错误日志:日志类型:stderr日志上传时间:2019年1月31日星期四15:11:21 +0000日志长度:89错误:无法找到或加载主类 .usr.lib.spark.jars.datanucleus-core-3.2.10.jar最不寻常的是它试图描述它找不到的 jar 的方式,而不是类。经过进一步调查,我找到了原因:当Java命令发送到Core实例时,它将类路径解析为它的三个文件:java -server -classpath /usr/lib/spark/jars/datanucleus-api-jdo-3.2.6.jar /usr/lib/spark/jars/datanucleus-core-3.2.10.jar /usr/lib/spark/jars/datanucleus-rdbms-3.2.9.jar ...因此尝试执行“/usr/lib/spark/jars/datanucleus-core-3.2. 10.jar”就好像它是一个可运行的。问题是,如果我尝试将类路径更改为更具体,或者如果我尝试删除它,应用程序会因为找不到 ApplicationMaster 而再次失败。
查看完整描述

1 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

经过长时间的搜索,我发现应用程序无法加载类org.apache.spark.deploy.yarn.ApplicationMaster的原因是因为这不是ApplicationMasterEMR 核心实例使用的版本 - 它使用org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster,这需要CLASSPATH输入中的段包含/usr/lib/hadoop-yarn/*。我更改了 REST 请求的输入 XML 中的两个参数,它成功启动。我仍然需要CLASSPATH为 EMR 实现配置正确的配置以使应用程序成功完成,但这个问题的主要挑战已经解决。


更新:最终我决定向 EMR 添加一个步骤并使用参数实际上是一种更简单的方法来处理它。我在 Maven 依赖项中添加了 EMR AWS Java SDK:


<dependency>

    <groupId>com.amazonaws</groupId>

    <artifactId>aws-java-sdk-emr</artifactId>

    <version>1.11.486</version>

</dependency>

并添加了以下代码:


AddJobFlowStepsResult result = emr.addJobFlowSteps(new AddJobFlowStepsRequest()

            .withJobFlowId(clusterId)

            .withSteps(new StepConfig()

                    .withName(name)

                    .withActionOnFailure(ActionOnFailure.CONTINUE)

                    .withHadoopJarStep(new HadoopJarStepConfig()

                            .withJar("command-runner.jar")

                            .withArgs(stepargs))));

stepargs 取自我的原始 REST 请求,包括要使用的 jar 和文件 - 只需使用 spark-submit:


List<String> stepargs = new ArrayList<String>();

stepargs.add("spark-submit");

stepargs.add("--class");

stepargs.add(mainClass);

stepargs.add("--deploy-mode");

stepargs.add("cluster");

stepargs.add("--master");

stepargs.add("yarn");

stepargs.add("--files");

stepargs.add(files);

stepargs.add("--jars");

stepargs.add(jars);

stepargs.add("--properties-file");

stepargs.add(confFileName);

stepargs.add(jar);

Iterator<String> itr = args.iterator();

while (itr.hasNext()) {

    String arg = itr.next();

    if (arg.equals("--arg")) {

        stepargs.add(itr.next());

    }

}


查看完整回答
反对 回复 2022-06-04
  • 1 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号