经过长时间的搜索,我发现应用程序无法加载类的原因 org.apache.spark.deploy.yarn.ApplicationMaster 是因为这不是版本的 ApplicationMaster EMR核心实例使用 - 它使用 org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster ,这需要 CLASSPATH 输入中的段包括 /usr/lib/hadoop-yarn/* 。我更改了REST请求的输入XML中的两个参数,并成功启动。我仍然需要配置正确的 CLASSPATH 为了使EMR实现成功完成应用程序,但这个问题的主要挑战已经解决。
org.apache.spark.deploy.yarn.ApplicationMaster
ApplicationMaster
org.apache.hadoop.yarn.applications.distributedshell.ApplicationMaster
CLASSPATH
/usr/lib/hadoop-yarn/*
的 更新 强> :最终我决定向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()); } }