通过 REST 提交 EMR Yarn 应用程序

我在 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 而再次失败。


森林海
浏览 102回答 1
1回答

qq_笑_17

经过长时间的搜索,我发现应用程序无法加载类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>&nbsp; &nbsp; <groupId>com.amazonaws</groupId>&nbsp; &nbsp; <artifactId>aws-java-sdk-emr</artifactId>&nbsp; &nbsp; <version>1.11.486</version></dependency>并添加了以下代码:AddJobFlowStepsResult result = emr.addJobFlowSteps(new AddJobFlowStepsRequest()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withJobFlowId(clusterId)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withSteps(new StepConfig()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withName(name)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withActionOnFailure(ActionOnFailure.CONTINUE)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withHadoopJarStep(new HadoopJarStepConfig()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .withJar("command-runner.jar")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .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()) {&nbsp; &nbsp; String arg = itr.next();&nbsp; &nbsp; if (arg.equals("--arg")) {&nbsp; &nbsp; &nbsp; &nbsp; stepargs.add(itr.next());&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java