2017-06-09 40 views
0

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

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 \ 

JSON文件描述我EMR步骤:

[ 
    { 
    "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

我误解了EMR的工作原理。有两个选项可以解决这个问题:

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

使用Type =“Spark”只是简单地将“spark-submit”调用添加为第一个参数,但仍然需要提供master,jar位置,主类等...