Spark EMR:需要配置多个 spark-submits 才能在 EMR 集群中并行工作
Spark EMR: Need to configure multiple spark-submits to work parallel in EMR cluster
我是 AWS EMR 的新手,我遇到了将多个火花提交 运行 并行的问题。
我有一些作业计划每 10 分钟 运行 一次,还有一项作业 运行 每 6 小时一次。集群有足够的资源同时 运行 它们,但默认配置将它们放入单个根中。使它们按顺序 运行 的默认队列。这不是我想要的。
我必须在配置文件中写什么?
我已经尝试将队列“1”、“2”和“3”添加到根队列(在 yarn-site.xml 中)并将每个作业提交到一个单独的队列中。但它们仍然 运行 顺序(不是我想要的平行)。
spark-submit --queue 1 --num-executors 1 s3://bucket/some-job.py
spark-submit --queue 2 --num-executors 1 s3://bucket/some-job.py
简单说一下队列的配置。当您创建 EMR 时,您可以给出 yarn.scheduler 的配置。如果您有首选配置,请指定它。 For example、
"Classification": "capacity-scheduler",
"Properties": {
"yarn.scheduler.capacity.root.queues": "default, gold, silver, bronze"
}
这会给你几个队列通道。
另一种选择是修改已经是 运行 的 EMR。与上述类似,但可以通过 AWS CLI 或其他 SDK 完成。 See the article.
它使用命令
aws emr modify-instance-groups --cli-input-json file://some.json
与some.json
的形式如:
{
"ClusterId":"j-MyClusterID",
"InstanceGroups":[
{
"InstanceGroupId":"ig-MyMasterId",
"Configurations":[
{
"Classification":"capacity-scheduler",
"Properties":{
"yarn.scheduler.capacity.root.queues":"default, bronze, silver, gold"
},
"Configurations":[]
}
]
}
]
}
我发现了一个意想不到的解决方案。
似乎当前的 Hadoop 文档没有反映 AWS EMR 中 yarn 的正确配置,所以我使用反复试验的方法来找到使其工作的方法。
我使用了公平调度程序而不是容量调度程序。但它仍然将所有应用程序放在同一个队列中 ("pool"),所以我不得不手动将每个作业安排到单独的队列中,并配置这些队列以消耗适当数量的资源。
这就是我所做的:
纱-site.xml
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>fair-scheduler.xml</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
Fair scheduler的目的——公平的调度任务和分配资源。但是(令 lmao 感到惊讶)如果没有启用抢占,它就不会这样做。如果您明确不要求它们,第一个任务会吃掉所有资源,并且在完成之前不会放弃它们。
这就是我管理抢占的方式:
公平-scheduler.xml
<allocations>
<pool name="smalltask">
<schedulingMode>FAIR</schedulingMode>
<maxRunningApps>4</maxRunningApps>
<weight>1</weight>
<fairSharePreemptionThreshold>0.4</fairSharePreemptionThreshold>
<fairSharePreemptionTimeout>1</fairSharePreemptionTimeout>
</pool>
<pool name="bigtask">
<schedulingMode>FAIR</schedulingMode>
<maxRunningApps>2</maxRunningApps>
<fairSharePreemptionThreshold>0.6</fairSharePreemptionThreshold>
<fairSharePreemptionTimeout>1</fairSharePreemptionTimeout>
<weight>2</weight>
</pool>
</allocations>
现在我有2个队列(大的和小的),小队列可以运行 4个小任务,大队列可以同时运行 2个大任务。大队列的权重更大,因此需要更多的资源。如果小队列占用了超过 40% 的资源,其他队列开始 "nationalizing" 它并带走资源。大队列(60%)也是如此。
我不确定每个队列中发生了什么,但似乎资源试图在应用程序之间平均分配。
我的新年愿望是 hadoop 和 EMR 的详细文档。
我都做了,但 none 对我有用。
最近的是 CAPACITY SCHEDULER。我有 4 个队列,默认、金、银、铜。个人 spark 提交(实际上,我的单元系列中有 4 个)与每个队列一起使用 --queue gold|silver
选项很好地工作。
但是当我 运行 设置 2 个(比如 1 个黄金和 1 个白银)时,它们最终都会挂起。
此致,
苏沃
我是 AWS EMR 的新手,我遇到了将多个火花提交 运行 并行的问题。
我有一些作业计划每 10 分钟 运行 一次,还有一项作业 运行 每 6 小时一次。集群有足够的资源同时 运行 它们,但默认配置将它们放入单个根中。使它们按顺序 运行 的默认队列。这不是我想要的。 我必须在配置文件中写什么?
我已经尝试将队列“1”、“2”和“3”添加到根队列(在 yarn-site.xml 中)并将每个作业提交到一个单独的队列中。但它们仍然 运行 顺序(不是我想要的平行)。
spark-submit --queue 1 --num-executors 1 s3://bucket/some-job.py
spark-submit --queue 2 --num-executors 1 s3://bucket/some-job.py
简单说一下队列的配置。当您创建 EMR 时,您可以给出 yarn.scheduler 的配置。如果您有首选配置,请指定它。 For example、
"Classification": "capacity-scheduler",
"Properties": {
"yarn.scheduler.capacity.root.queues": "default, gold, silver, bronze"
}
这会给你几个队列通道。
另一种选择是修改已经是 运行 的 EMR。与上述类似,但可以通过 AWS CLI 或其他 SDK 完成。 See the article.
它使用命令
aws emr modify-instance-groups --cli-input-json file://some.json
与some.json
的形式如:
{
"ClusterId":"j-MyClusterID",
"InstanceGroups":[
{
"InstanceGroupId":"ig-MyMasterId",
"Configurations":[
{
"Classification":"capacity-scheduler",
"Properties":{
"yarn.scheduler.capacity.root.queues":"default, bronze, silver, gold"
},
"Configurations":[]
}
]
}
]
}
我发现了一个意想不到的解决方案。
似乎当前的 Hadoop 文档没有反映 AWS EMR 中 yarn 的正确配置,所以我使用反复试验的方法来找到使其工作的方法。
我使用了公平调度程序而不是容量调度程序。但它仍然将所有应用程序放在同一个队列中 ("pool"),所以我不得不手动将每个作业安排到单独的队列中,并配置这些队列以消耗适当数量的资源。 这就是我所做的:
纱-site.xml
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<property>
<name>yarn.scheduler.fair.allocation.file</name>
<value>fair-scheduler.xml</value>
</property>
<property>
<name>yarn.scheduler.fair.preemption</name>
<value>true</value>
</property>
Fair scheduler的目的——公平的调度任务和分配资源。但是(令 lmao 感到惊讶)如果没有启用抢占,它就不会这样做。如果您明确不要求它们,第一个任务会吃掉所有资源,并且在完成之前不会放弃它们。
这就是我管理抢占的方式:
公平-scheduler.xml
<allocations>
<pool name="smalltask">
<schedulingMode>FAIR</schedulingMode>
<maxRunningApps>4</maxRunningApps>
<weight>1</weight>
<fairSharePreemptionThreshold>0.4</fairSharePreemptionThreshold>
<fairSharePreemptionTimeout>1</fairSharePreemptionTimeout>
</pool>
<pool name="bigtask">
<schedulingMode>FAIR</schedulingMode>
<maxRunningApps>2</maxRunningApps>
<fairSharePreemptionThreshold>0.6</fairSharePreemptionThreshold>
<fairSharePreemptionTimeout>1</fairSharePreemptionTimeout>
<weight>2</weight>
</pool>
</allocations>
现在我有2个队列(大的和小的),小队列可以运行 4个小任务,大队列可以同时运行 2个大任务。大队列的权重更大,因此需要更多的资源。如果小队列占用了超过 40% 的资源,其他队列开始 "nationalizing" 它并带走资源。大队列(60%)也是如此。 我不确定每个队列中发生了什么,但似乎资源试图在应用程序之间平均分配。
我的新年愿望是 hadoop 和 EMR 的详细文档。
我都做了,但 none 对我有用。
最近的是 CAPACITY SCHEDULER。我有 4 个队列,默认、金、银、铜。个人 spark 提交(实际上,我的单元系列中有 4 个)与每个队列一起使用 --queue gold|silver
选项很好地工作。
但是当我 运行 设置 2 个(比如 1 个黄金和 1 个白银)时,它们最终都会挂起。
此致, 苏沃