我正在尝试使用boto3客户端为EMR执行spark-submit。 执行下面的代码后,提交EMR步骤,几秒钟后失败。如果在EMR主站上手动执行,则步骤日志中的实际命令行正在运行。
控制器日志显示几乎不可读的垃圾,看起来像是同时写入的几个进程。
UPD:尝试 command-runner.jar 和EMR版本4.0.0和4.1.0
任何想法都赞赏。
代码片段:
class ProblemExample:
def run(self):
session = boto3.Session(profile_name='emr-profile')
client = session.client('emr')
response = client.add_job_flow_steps(
JobFlowId=cluster_id,
Steps=[
{
'Name': 'string',
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 's3n://elasticmapreduce/libs/script-runner/script-runner.jar',
'Args': [
'/usr/bin/spark-submit',
'--verbose',
'--class',
'my.spark.job',
'--jars', '<dependencies>',
'<my spark job>.jar'
]
}
},
]
)
答案 0 :(得分:10)
最后通过正确转义--jars值来解决问题。
spark-submit未能找到类,但在杂乱日志的背景下,错误并不明确。
有效的例子是:
class Example:
def run(self):
session = boto3.Session(profile_name='emr-profile')
client = session.client('emr')
response = client.add_job_flow_steps(
JobFlowId=cluster_id,
Steps=[
{
'Name': 'string',
'ActionOnFailure': 'CONTINUE',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args': [
'/usr/bin/spark-submit',
'--verbose',
'--class',
'my.spark.job',
'--jars', '\'<coma, separated, dependencies>\'',
'<my spark job>.jar'
]
}
},
]
)