我通过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中定义的主类会泄漏到我单独提供的命令行参数中。
怎么了?
答案 0 :(得分:1)
我误解了EMR步骤的工作原理。有两种方法可以解决这个问题:
我可以在Jar =“command-runner.jar”中使用Type =“CUSTOM_JAR”,并为Args添加正常的spark-submit调用。
使用Type =“Spark”只需添加“spark-submit”调用作为第一个参数,还需要提供一个master,jar位置,主类等...