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 个白银)时,它们最终都会挂起。

此致, 苏沃