大数据之hadoop YARN 资源抢占 Preemption 机制配置与调优

大数据阿木 发布于 5 天前 1 次阅读


YARN 资源抢占(Preemption)机制配置与调优

在Hadoop YARN(Yet Another Resource Negotiator)中,资源抢占(Preemption)机制是一种重要的资源管理策略,它允许YARN在资源紧张的情况下,从某些应用程序中抢占资源,并将这些资源分配给其他更重要的应用程序。本文将围绕YARN的资源抢占机制,探讨其配置与调优的方法。

YARN 资源抢占机制概述

YARN的资源抢占机制主要基于以下概念:

1. 资源类型:YARN将资源分为CPU、内存和磁盘I/O等类型。

2. 资源分配:YARN根据应用程序的需求和资源池的可用资源,为应用程序分配资源。

3. 资源抢占:当资源池中的资源不足以满足所有应用程序的需求时,YARN会根据一定的策略抢占资源。

资源抢占策略

YARN提供了两种资源抢占策略:

1. 基于内存的抢占:当资源池中的内存资源不足时,YARN会从内存使用量较高的应用程序中抢占资源。

2. 基于容量的抢占:当资源池中的总资源量不足时,YARN会从资源使用量较高的应用程序中抢占资源。

配置与调优

1. 配置资源抢占

在Hadoop配置文件中,可以通过以下参数来配置资源抢占:

xml

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps</name>


<value>100</value>


<description>限制每个资源追踪器可以运行的最大应用程序数量</description>


</property>

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-mem</name>


<value>50</value>


<description>限制每个资源追踪器可以运行的最大内存使用应用程序数量</description>


</property>

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-vcore</name>


<value>50</value>


<description>限制每个资源追踪器可以运行的最大CPU使用应用程序数量</description>


</property>


2. 调优资源抢占

以下是一些调优资源抢占的策略:

2.1 调整内存抢占阈值

xml

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-mem-mb</name>


<value>500</value>


<description>内存使用量超过该值的程序将被抢占</description>


</property>


2.2 调整CPU抢占阈值

xml

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-vcore-mems</name>


<value>1000</value>


<description>当CPU使用量超过该值时,程序将被抢占</description>


</property>


2.3 调整抢占延迟

xml

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-mem-delay-sec</name>


<value>300</value>


<description>内存使用量超过阈值后,等待该时间后进行抢占</description>


</property>


2.4 调整抢占优先级

xml

<property>


<name>yarn.resourcemanager.resource-tracker.max-apps-mem-priority</name>


<value>100</value>


<description>抢占时的优先级,数值越小优先级越高</description>


</property>


总结

YARN的资源抢占机制是确保资源公平分配的重要手段。通过合理配置和调优,可以有效地提高资源利用率,保证关键任务的执行。在实际应用中,应根据具体场景和需求,对资源抢占机制进行细致的配置和调优。

代码示例

以下是一个简单的Java代码示例,用于展示如何通过YARN客户端API进行资源抢占的配置和调优:

java

import org.apache.hadoop.yarn.client.api.YarnClient;


import org.apache.hadoop.yarn.client.api.YarnClientApplication;


import org.apache.hadoop.yarn.conf.YarnConfiguration;

public class YarnPreemptionExample {


public static void main(String[] args) throws Exception {


YarnConfiguration conf = new YarnConfiguration();


conf.setBoolean(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_ENABLED, true);


conf.setInt(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_QUEUE_NAME, 100);


conf.setInt(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_QUEUE_MAX_APP_COUNT, 50);


conf.setInt(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_QUEUE_MAX_APP_COUNT_PER_USER, 50);


conf.setInt(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_QUEUE_MAX_APP_COUNT_PER_USER_PER_QUEUE, 50);


conf.setInt(YarnConfiguration.RM_SCHEDULER_MINICLUSTER_QUEUE_MAX_APP_COUNT_PER_USER_PER_QUEUE_PER_APP, 50);

YarnClient yarnClient = YarnClient.createYarnClient();


yarnClient.init(conf);


yarnClient.start();

YarnClientApplication application = yarnClient.createApplication();


ApplicationSubmissionContext appContext = application.getApplicationSubmissionContext();


// 设置应用程序的配置、资源需求等


// ...

yarnClient.submitApplication(appContext);


// 获取应用程序的状态和资源使用情况


// ...


}


}


以上代码展示了如何通过YARN客户端API配置资源抢占的相关参数,并提交一个应用程序。在实际应用中,可以根据具体需求调整参数值。