AWS EMR Spark Step args错误

时间:2017-06-09 07:43:47

标签: amazon-web-services apache-spark emr amazon-emr

我通过AWSCLI向EMR提交Spark作业,EMR步骤和spark配置作为单独的json文件提供。由于某种原因,我的主类的名称作为不必要的命令行参数传递给我的Spark jar,导致作业失败。

AWSCLI命令:

aws emr create-cluster \
    --name "Spark-Cluster" \
    --release-label emr-5.5.0 \
    --instance-groups \
    InstanceGroupType=MASTER,InstanceCount=1,InstanceType=m3.xlarge \
    InstanceGroupType=CORE,InstanceCount=20,InstanceType=m3.xlarge \
    --applications Name=Spark \
    --use-default-roles \
    --configurations file://conf.json \
    --steps file://steps.json \
    --log-uri s3://blah/logs \

描述我的EMR步骤的json文件:

[
  {
    "Name": "RunEMRJob",
    "Jar": "s3://blah/blah.jar",
    "ActionOnFailure": "TERMINATE_CLUSTER",
    "Type": "CUSTOM_JAR",
    "MainClass": "blah.blah.MainClass",
    "Args": [
      "--arg1",
      "these",
      "--arg2",
      "get",
      "--arg3",
      "passed",
      "--arg4",
      "to",
      "--arg5",
      "spark",
      "--arg6",
      "main",
      "--arg7",
      "class"
    ]
  }
]

我的主类中的参数解析器抛出一个错误(并打印提供的参数):

Exception in thread "main" java.lang.IllegalArgumentException: One or more parameters are invalid or missing:

blah.blah.MainClass --arg1 these --arg2 get --arg3 passed --arg4 to --arg5 spark --arg6 main --arg7 class

因此,由于某种原因,我在steps.json中定义的主类会泄漏到我单独提供的命令行参数中。

怎么了?

1 个答案:

答案 0 :(得分:1)

我误解了EMR步骤的工作原理。有两种方法可以解决这个问题:

我可以在Jar =“command-runner.jar”中使用Type =“CUSTOM_JAR”,并为Args添加正常的spark-submit调用。

使用Type =“Spark”只需添加“spark-submit”调用作为第一个参数,还需要提供一个master,jar位置,主类等...