Yarn FairScheduler 不在队列之间分配资源
Yarn FairScheduler doesn't distribute resources between queues
我尝试定义几个 Yarn 队列,这样集群将始终被充分利用,一旦将新任务添加到不同的队列,资源将被分配(第一个队列中的几个 worker 将被抢占)
为此,我使用 FairScheduler
并依赖文档:Hadoop-FairScheduler and Cloudera-FairScheduler.
我 运行 来自 Ambari 的 Yarn 和 Spark 以及已设置的有趣配置:
中纱-site.xml:
yarn.resourcemanager.scheduler.monitor.enable=true
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.scheduler.fair.preemption=true
我在公平中定义队列-scheduler.xml:
<?xml version="1.0"?>
<allocations>
<defaultMinSharePreemptionTimeout>1</defaultMinSharePreemptionTimeout>
<defaultFairSharePreemptionTimeout>1</defaultFairSharePreemptionTimeout>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<defaultFairSharePreemptionThreshold>0.5</defaultFairSharePreemptionThreshold>.
<queue name="team1" type="parent">
<minResources>20000 mb,2vcores</minResources>
<weight>1.0</weight>
</queue>
<queue name="team2" type="parent">
<minResources>20000 mb,2vcores</minResources>
</queue>
<queue name="team3" type="parent">
<minResources>20000 mb,2vcores</minResources>
<fairSharePreemptionThreshold>1.0</fairSharePreemptionThreshold>
<weight>10.0</weight>
</queue>
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault>
<!-- Queue 'secondary_group_queue' is a parent queue and may have
user queues under it -->
<user name="sample_user">
<maxRunningApps>30</maxRunningApps>
</user>
<userMaxAppsDefault>5</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="specified" />
<rule name="primaryGroup" create="false" />
<rule name="nestedUserQueue">
<rule name="secondaryGroupExistingQueue" create="false" />
</rule>
<rule name="default" queue="team5"/>
</queuePlacementPolicy>
</allocations>
我有一个 calcPi 示例的简单变体作为应用程序 I 运行(简单的 while 循环不断计算 pi):
while(true){
SparkSession spark = SparkSession
.builder()
.appName("JavaPipelineExample")
.getOrCreate();
List<Integer> l = new ArrayList<>(NUM_SAMPLES);
for (int i = 0; i < NUM_SAMPLES; i++) {
l.add(i);
}
JavaRDD<Integer> inputRDD = new JavaSparkContext(spark.sparkContext()).parallelize(l).coalesce(100).repartition(100);
System.out.println(String.format("Data split to %s partitions", inputRDD.partitions().size()) );
long count = inputRDD.filter(i -> {
double x = Math.random();
double y = Math.random();
return x*x + y*y < 1;
}).count();
System.out.println("Pi is roughly " + 4.0 * count / NUM_SAMPLES);
}
然后 运行 我打开两个不同的终端,首先我 运行 第一个应用程序(在队列 1 中)。然后我检查它是否占用了所有资源并启动第二个应用程序(在队列 2 中)。我怀疑调度程序抢占队列 1 中的应用程序并将资源共享到队列 2 但它没有发生:
运行 申请 1:
/usr/hdp/current/spark2-client/bin/spark-submit --master yarn --class com.comp.CalculatePi --num-executors 25 --executor-cores 6 --queue team2.aa /root/calcpi-1.0-SNAPSHOT.jar
在 运行 之后,我在 Yarn 管理面板中看到使用了 37/54 vcores。而我 运行:
/usr/hdp/current/spark2-client/bin/spark-submit --master yarn --class com.comp.CalculatePi --num-executors 10 --executor-cores 4 --queue team1.aa /root/calcpi-1.0-SNAPSHOT.jar
现在我看到使用了 38/54 vcores 并且应用程序已成功提交,尽管它没有启动并且我收到消息:
[Timer-0] WARN org.apache.spark.scheduler.cluster.YarnScheduler - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
这里有什么问题?为什么 Yarn 不 运行 这两个应用程序在一起并抢占第一个应用程序?
您将 Capacity Scheduler 属性与 Fair Scheduler 属性混合使用。
yarn.resourcemanager.scheduler.monitor.enable=true
用于容量调度。
yarn.scheduler.fair.preemption
用于公平调度。
在上游 Fair Scheduler 文档中您需要:
我尝试定义几个 Yarn 队列,这样集群将始终被充分利用,一旦将新任务添加到不同的队列,资源将被分配(第一个队列中的几个 worker 将被抢占)
为此,我使用 FairScheduler
并依赖文档:Hadoop-FairScheduler and Cloudera-FairScheduler.
我 运行 来自 Ambari 的 Yarn 和 Spark 以及已设置的有趣配置:
中纱-site.xml:
yarn.resourcemanager.scheduler.monitor.enable=true
yarn.resourcemanager.scheduler.class=org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.scheduler.fair.preemption=true
我在公平中定义队列-scheduler.xml:
<?xml version="1.0"?>
<allocations>
<defaultMinSharePreemptionTimeout>1</defaultMinSharePreemptionTimeout>
<defaultFairSharePreemptionTimeout>1</defaultFairSharePreemptionTimeout>
<defaultQueueSchedulingPolicy>fair</defaultQueueSchedulingPolicy>
<defaultFairSharePreemptionThreshold>0.5</defaultFairSharePreemptionThreshold>.
<queue name="team1" type="parent">
<minResources>20000 mb,2vcores</minResources>
<weight>1.0</weight>
</queue>
<queue name="team2" type="parent">
<minResources>20000 mb,2vcores</minResources>
</queue>
<queue name="team3" type="parent">
<minResources>20000 mb,2vcores</minResources>
<fairSharePreemptionThreshold>1.0</fairSharePreemptionThreshold>
<weight>10.0</weight>
</queue>
<queueMaxAMShareDefault>0.5</queueMaxAMShareDefault>
<queueMaxResourcesDefault>40000 mb,0vcores</queueMaxResourcesDefault>
<!-- Queue 'secondary_group_queue' is a parent queue and may have
user queues under it -->
<user name="sample_user">
<maxRunningApps>30</maxRunningApps>
</user>
<userMaxAppsDefault>5</userMaxAppsDefault>
<queuePlacementPolicy>
<rule name="specified" />
<rule name="primaryGroup" create="false" />
<rule name="nestedUserQueue">
<rule name="secondaryGroupExistingQueue" create="false" />
</rule>
<rule name="default" queue="team5"/>
</queuePlacementPolicy>
</allocations>
我有一个 calcPi 示例的简单变体作为应用程序 I 运行(简单的 while 循环不断计算 pi):
while(true){
SparkSession spark = SparkSession
.builder()
.appName("JavaPipelineExample")
.getOrCreate();
List<Integer> l = new ArrayList<>(NUM_SAMPLES);
for (int i = 0; i < NUM_SAMPLES; i++) {
l.add(i);
}
JavaRDD<Integer> inputRDD = new JavaSparkContext(spark.sparkContext()).parallelize(l).coalesce(100).repartition(100);
System.out.println(String.format("Data split to %s partitions", inputRDD.partitions().size()) );
long count = inputRDD.filter(i -> {
double x = Math.random();
double y = Math.random();
return x*x + y*y < 1;
}).count();
System.out.println("Pi is roughly " + 4.0 * count / NUM_SAMPLES);
}
然后 运行 我打开两个不同的终端,首先我 运行 第一个应用程序(在队列 1 中)。然后我检查它是否占用了所有资源并启动第二个应用程序(在队列 2 中)。我怀疑调度程序抢占队列 1 中的应用程序并将资源共享到队列 2 但它没有发生:
运行 申请 1:
/usr/hdp/current/spark2-client/bin/spark-submit --master yarn --class com.comp.CalculatePi --num-executors 25 --executor-cores 6 --queue team2.aa /root/calcpi-1.0-SNAPSHOT.jar
在 运行 之后,我在 Yarn 管理面板中看到使用了 37/54 vcores。而我 运行:
/usr/hdp/current/spark2-client/bin/spark-submit --master yarn --class com.comp.CalculatePi --num-executors 10 --executor-cores 4 --queue team1.aa /root/calcpi-1.0-SNAPSHOT.jar
现在我看到使用了 38/54 vcores 并且应用程序已成功提交,尽管它没有启动并且我收到消息:
[Timer-0] WARN org.apache.spark.scheduler.cluster.YarnScheduler - Initial job has not accepted any resources; check your cluster UI to ensure that workers are registered and have sufficient resources
这里有什么问题?为什么 Yarn 不 运行 这两个应用程序在一起并抢占第一个应用程序?
您将 Capacity Scheduler 属性与 Fair Scheduler 属性混合使用。
yarn.resourcemanager.scheduler.monitor.enable=true
用于容量调度。
yarn.scheduler.fair.preemption
用于公平调度。
在上游 Fair Scheduler 文档中您需要: