AWS EMR Spark Step 参数错误

AWS EMR Spark Step args bug

我正在通过 AWSCLI 向 EMR 提交 Spark 作业,EMR 步骤和 spark 配置作为单独的 json 文件提供。出于某种原因,我的 main class 的名称作为不必要的命令行参数传递到我的 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"
    ]
  }
]

我的主 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 中定义的主要 class 泄漏到我单独提供的命令行参数中。

怎么了?

我误解了 EMR 步骤的工作原理。有两种解决方法:

我可以将 Type = "CUSTOM_JAR" 与 Jar = "command-runner.jar" 一起使用,并向 Args 添加一个正常的 spark-submit 调用。

使用 Type = "Spark" 只需将 "spark-submit" 调用添加为第一个参数,仍然需要提供 master、jar 位置、main class 等...