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 等...
我正在通过 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 等...