1 回答

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());
}
}
添加回答
举报