运行spark作业时不抢占基于公平共享的资源

34gzjxbg  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(442)

我在计划队列上重新平衡apachespark作业资源时遇到问题。
对于这些测试,我已经将hadoop2.6(也尝试了2.7)配置为在macos上使用本地hdfs以伪分布式模式运行。提交作业时使用了spark网站上的“pre-build spark 1.4 for hadoop 2.6及更高版本”(也试用了1.5)。
当在hadoopmapreduce作业上使用基本配置进行测试时,fair scheduler会按预期工作:当集群的资源超过某个最大值时,计算公平共享,并根据这些计算抢占和平衡不同队列中作业的资源。
同样的测试也适用于spark作业,在这种情况下,yarn对每个作业的公平份额进行了正确的计算,但spark容器的资源并没有重新平衡。
以下是我的conf文件:
$hadoop\u home/etc/hadoop/yarn-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\u home/etc/hadoop/fair-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\u home/etc/hadoop/core-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\u home/etc/hadoop/core-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>

测试用例是:
在权重为40的“prod”队列上运行一个作业(必须分配所有资源的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

之后,在权重为60的“dev.eng”队列上运行相同的作业,这意味着该作业必须分配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%。

wixjitnu

wixjitnu1#

fair scheduler不会为第一个作业终止容器,它只会等到一些资源释放出来并保留它们供第二个作业使用。如果第一个作业没有释放资源,调度程序就不能将这些资源分配给第二个作业。
在mapreduce作业中,每个map或reduce任务都需要示例化一个新容器,如果作业超出其引用(基于队列容量),调度程序可以阻止该作业示例化新容器。
在spark中,事情是不同的,在作业开始时启动执行者,并将不同的任务(阶段)发送给他们。那么资源就不能被释放,也就不能被重新分配。
动态分配可能有助于:http://spark.apache.org/docs/1.6.1/configuration.html#dynamic-分配

zysjyyx4

zysjyyx42#

您需要在分配xml中设置一个抢占超时。一个是最小份额,一个是公平份额,都是以秒为单位的。默认情况下,不设置超时。
来自hadoop:权威指南第4版
如果队列等待其最小共享抢占超时时间,而没有收到其最小保证共享,那么调度程序可能会抢占其他容器。通过分配文件中的DefaultMinSharePremptionTimeout顶级元素为所有队列设置默认超时,并通过为队列设置MinSharePremptionTimeout元素为每个队列设置默认超时。
同样地,如果队列在公平共享抢占超时的时间内保持在其公平共享的一半以下,那么调度程序可以抢占其他容器。通过分配文件中的defaultfairsharepreemptiontimeout顶级元素为所有队列设置默认超时,并通过在队列上设置fairsharepreemptiontimeout来为每个队列设置默认超时。通过设置defaultfairsharepreemptionthreshold和fairsharepreemptionthreshold(每个队列),也可以从默认值0.5更改阈值。

相关问题