首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在运行Spark作业时,YARN不会基于公平份额抢占资源

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

Stack Overflow用户
提问于 2015-10-12 21:13:44
回答 1查看 2.2K关注 0票数 20

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

对于测试,我将Hadoop2.6(也尝试了2.7 )配置为在伪分布式模式下运行,并在MacOS上使用本地HDFS。对于作业提交,使用了来自Spark's website的"Pre-build Spark1.4for Hadoop2.6和更高版本“(也尝试了1.5 )发行版。

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

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

下面是我的conf文件:

$HADOOP_HOME/etc/hadoop/yarn-site.xml

代码语言:javascript
复制
<?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/aircheduler.xml

代码语言:javascript
复制
<?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/core-site.xml

代码语言:javascript
复制
<?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/core-site.xml

代码语言:javascript
复制
<?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%)。

代码语言:javascript
复制
./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%。

代码语言:javascript
复制
./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%。

EN

回答 1

Stack Overflow用户

发布于 2016-09-18 04:18:42

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

在MapReduce作业中,每个map或reduce任务都需要实例化一个新容器,如果作业超出了其报价(基于队列容量),则调度程序可以阻塞该作业以实例化新容器。

在Spark中,事情是不同的,执行器在作业开始时被启动,不同的任务(阶段)被发送给它们。那么资源就不能被释放,也不能被重新分配。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33082088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档