在运行Spark作业时,YARN不会基于公平份额抢占资源

时间:2015-10-12 13:13:44

标签: hadoop apache-spark yarn job-scheduling

我在YARN Fair Scheduled队列上重新平衡Apache Spark作业资源时遇到问题。

对于测试,我已经配置Hadoop 2.6(也尝试过2.7)以在MacOS上使用本地HDFS以伪分布式模式运行。对于使用的作业提交"预构建Spark 1.4 for Hadoop 2.6及更高版本" (也试过1.5)来自Spark's website的分发。

在Hadoop MapReduce作业上使用基本配置进行测试时,Fair Scheduler按预期工作:当群集资源超过某个最大值时,将计算公平份额,并根据这些计算抢占和平衡不同队列中作业的资源。

使用Spark作业运行相同的测试,在这种情况下,YARN正在计算每个作业的公平份额,但Spark容器的资源没有重新平衡。

以下是我的conf文件:

$ HADOOP_HOME的/ etc / hadoop的/纱线-site.xml中

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>yarn.nodemanager.aux-services</name>
      <value>mapreduce_shuffle</value>
   </property>
   <property>
      <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
      <value>org.apache.spark.network.yarn.YarnShuffleService</value>
   </property>
   <property>
      <name>yarn.resourcemanager.scheduler.class</name>
      <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
   </property>
   <property>
      <name>yarn.scheduler.fair.preemption</name>
      <value>true</value>
   </property>
</configuration>

$ HADOOP_HOME的/ etc / hadoop的/公平scheduler.xml

<?xml version="1.0" encoding="UTF-8"?>
<allocations>
   <defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
   <queue name="prod">
      <weight>40</weight>
      <schedulingPolicy>fifo</schedulingPolicy>
   </queue>
   <queue name="dev">
      <weight>60</weight>
      <queue name="eng" />
      <queue name="science" />
   </queue>
   <queuePlacementPolicy>
      <rule name="specified" create="false" />
      <rule name="primaryGroup" create="false" />
      <rule name="default" queue="dev.eng" />
   </queuePlacementPolicy>
</allocations>

$ HADOOP_HOME的/ etc / hadoop的/芯-site.xml中

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>fs.defaultFS</name>
      <value>hdfs://localhost:9000</value>
   </property>
</configuration>

$ HADOOP_HOME的/ etc / hadoop的/芯-site.xml中

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
   <property>
      <name>dfs.replication</name>
      <value>1</value>
   </property>
</configuration>

测试用例是:

在&#34; prod&#34;上运行工作队列的权重为40(必须分配所有资源的40%),正如预期的那样,该作业需要所有需要的免费资源(62.5%的集群资源)。

./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--driver-memory 512M \
--executor-memory 768M \
--executor-cores 1 \
--num-executors 2 \
--queue prod \
lib/spark-examples*.jar 100000

之后在&#34; dev.eng&#34;上运行相同的工作。排队权重为60,这意味着工作必须分配所有资源的60%,并将第一份工作的资源减少到约40%。

./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn-cluster \
--driver-memory 512M \
--executor-memory 768M \
--executor-cores 1 \
--num-executors 2 \
--queue dev.eng \
lib/spark-examples*.jar 100000

不幸的是,集群资源没有变化 - 第一份工作为62.5%,第二份工作为37.5%。

2 个答案:

答案 0 :(得分:4)

您需要在分配xml中设置一个抢占超时。一个用于最小份额,一个用于公平份额,两者都在几秒钟内。默认情况下,未设置超时。

来自Hadoop:The Definitive Guide第4版

  

如果队列在没有收到最小保证份额的情况下等待其最小共享抢占超时,则调度程序可以   抢占其他容器。为所有队列设置默认超时   通过defaultMinSharePreemptionTimeout中的顶级元素   分配文件,并通过设置每个队列   队列的minSharePreemptionTimeout元素。

     

同样,如果队列长时间保持在其公平份额的一半以下   作为公平份额抢占超时,则调度程序可以抢占   其他容器。通过以下命令为所有队列设置默认超时   defaultFairSharePreemptionTimeout分配中的顶级元素   文件,并通过设置fairSharePreemptionTimeout基于每个队列   在队列上。阈值也可以从其默认值0.5更改   通过设置defaultFairSharePreemptionThreshold和   fairSharePreemptionThreshold(每个队列)。

答案 1 :(得分:0)

Fair Scheduler不会为第一个作业杀死容器,它只会等到某些资源空闲并保留它们供第二个作业使用。如果没有资源从第一个作业中释放出来,则调度程序无法将这些资源分配给第二个作业。

在MapReduce作业中,每个map或reduce任务都需要实例化一个新容器,并且调度程序可以阻止作业在超过其引用时实例化新容器(基于队列容量)。

在Spark中,事情是不同的,执行者在工作开始时被启动,并且不同的任务(阶段)被发送给他们。然后资源没有被释放,无法重新分配。

动态分配可能会有所帮助:http://spark.apache.org/docs/1.6.1/configuration.html#dynamic-allocation