如何使用Elastic MapReduce API一步向Hadoop提交多个作业?

如何使用Elastic MapReduce API一步向Hadoop提交多个作业?,hadoop,amazon-web-services,hadoop-streaming,emr,Hadoop,Amazon Web Services,Hadoop Streaming,Emr,表示一个弹性MapReduce步骤可以向Hadoop提交多个作业。但是,建议单个步骤只能容纳hadoop-streaming.jar的一次执行(也就是说,HadoopJarStep是一个HadoopJarStepConfig,而不是一个HadoopJarStepConfig数组) 在一个步骤中向Hadoop提交多个作业的正确语法是什么?正如所说,您可以创建一个集群,在一个步骤中在主实例上运行一些脚本my_script.sh: aws emr create-cluster --name "Test

表示一个弹性MapReduce步骤可以向Hadoop提交多个作业。但是,建议单个步骤只能容纳hadoop-streaming.jar的一次执行(也就是说,HadoopJarStep是一个HadoopJarStepConfig,而不是一个HadoopJarStepConfig数组)

在一个步骤中向Hadoop提交多个作业的正确语法是什么?

正如所说,您可以创建一个集群,在一个步骤中在主实例上运行一些脚本
my_script.sh

aws emr create-cluster --name "Test cluster" --ami-version 3.11 --use-default-roles
    --ec2-attributes KeyName=myKey --instance-type m3.xlarge --instance count 3
    --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,Jar=s3://elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://mybucket/script-path/my_script.sh"]
my_script.sh
应该如下所示:

#!/usr/bin/env bash

hadoop jar my_first_step.jar [mainClass] args... &
hadoop jar my_second_step.jar [mainClass] args... &
.
.
.
wait

这样,多个作业在同一个步骤中提交给Hadoop——但不幸的是,EMR接口将无法跟踪它们。要做到这一点,您应该使用如图所示的Hadoop web界面,或者简单地对主实例使用
ssh
,并使用
mapred job

进行探索,您可以指定使用哪种api(语言)你想提交作业。我的意思是,你想用哪种语言编写代码来提交集群上的EMR作业。有一个JSON对象描述你的作业流,无论发生什么情况,EMR都会读取它,所以你最初用来描述作业流的语言并不重要——它会被翻译成JSON,比如,AWS CLI符合某些规范。我实际上不认为该规范明确允许在一个步骤中向Hadoop提交多个作业,但您可能可以使用script_runner.jar来完成它:。对此进行更深入探索的人可以写出一个答案。我接受一个好的。你有解决办法吗?我仍在研究如何使用AWS SDK实现这一点。我使用的是Javascript API。当我尝试在EMR集群中运行多个hadoop作业时,它们都会一个接一个地运行(我可以使用应用程序列表看到进度)。有没有办法并行运行所有这些hadoop作业?一步向他们传递多个hadoop作业会解决这个问题吗?如何在一个步骤中传递多个作业?@Karshit让我知道我刚才写的答案是否适用于您……这就像登录到集群并运行两个hadoop作业(不是作为步骤,而是使用命令“hadoop jar…”)在EMR集群中发生的事情是,两个作业中的一个正在进行,另一个一直等待进度为0%。@Karshit使用Fair Scheduler进行实验,该程序适用于在运行的作业之间均匀分配资源:。这需要你编辑Thread-site.xml,文档会告诉你怎么做。我会尝试一下,让你知道。是的,fair scheduler有效。两份工作同时显示出进步。谢谢