Yarn容量调度器并发度问题,解决一直卡在Running job

本文介绍如何通过调整YARN调度器参数提高并发度,包括增加ApplicationMaster资源比例及配置多队列的方法,有效解决资源争用问题。

一、问题描述

Yarn默认调度器为Capacity Scheduler(容量调度器),且默认只有一个队列——default。如果队列中执行第一个任务资源不够,就不会再执行第二个任务,一直等到第一个任务执行完毕。

(1)创建一张测试表 

create table student(id int, name string);

(2)启动1个hive客户端,执行以下插入数据的sql语句

insert into table student values(1,'abc');

执行该语句,hive会初始化一个Spark会话,用以执行hive on spark任务。由于未指定队列,故该Spark会话默认使用的就是default队列,且会一直占用该队列,直到退出hive客户端。

可访问ResourceManager的web页面查看相关信息。

查看yarn调度器

重点:Configured Max Application Master Limit:10.0表示这个队列当中Application Master所使用资源的上限为10%,每一个提交的任务都有一个Application Master,限制AM就是限制运行的任务的个数。其余90%是用来执行的任务,因为当提交一个任务时ResourceManager会分配多个Container给这个任务,其中一个Container跑AM,其他的Container跑task任务。

(3)在hive客户端开启的状态下,提交一个MR

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi 1 1

MR任务同样未指定队列,所以其默认也提交到了default队列

任务提交界面如下:执行任务会一直卡在Running Job

ResourceManager的web页面如下:

容量调度器default队列中,同一时间只有一个任务执行,并发度低,如何解决呢?

二、问题解决

1、增加ApplicationMaster资源比例

针对容量调度器并发度低的问题,考虑调整yarn.scheduler.capacity.maximum-am-resource-percent该参数。默认值是0.1,表示集群上AM最多可使用的资源比例,目的为限制过多的app数量。

1)在hadoop102的/opt/module/hadoop-3.1.3/etc/Hadoop/capacity-scheduler.xml文件中修改如下参数值

[atguigu@hadoop102 hadoop]$ vim capacity-scheduler.xml

<property>
    <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
    <value>0.5</value>
    <description>
      集群中用于运行应用程序ApplicationMaster的资源比例上限,
该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,
默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数
yarn.scheduler.capacity.maximum-am-resource-percent设置,而单个队列可通过参数yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent设置适合自己的值。
    </description>
  </property

(2)分发capacity-scheduler.xml配置文件

[atguigu@hadoop102 hadoop]$ xsync capacity-scheduler.xml

注:xsync是集群分发脚本,需要自己配置的shell脚本

(3)关闭正在运行的任务,重新启动yarn集群

[atguigu@hadoop103 hadoop-3.1.3]$ sbin/stop-yarn.sh
[atguigu@hadoop103 hadoop-3.1.3]$ sbin/start-yarn.sh

2、配置Yarn容量调度器多队列

在企业里面如何配置多队列:

按照计算引擎创建队列hive、spark、flink

按照业务创建队列:下单、支付、点赞、评论、收藏(用户、活动、优惠相关)

多队列有什么好处?

假如公司来了一个菜鸟,写了一个递归死循环,公司集群资源耗尽,大数据全部瘫痪。

可以使用队列统一管理任务优先级,保证重要的任务优先完成。(该问题解决思路:可以为集群的每个提交任务的用户设置集群资源的上限也可以为队列设置优先级,比如生产环境的队列优先级高于测试环境。)

1)增加容量调度器队列

1)修改容量调度器配置文件

默认Yarn的配置下,容量调度器只有一条default队列。在capacity-scheduler.xml中可以配置多条队列,修改以下属性,增加hive队列。

property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>default,hive</value>
    <description>
     再增加一个hive队列
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
<value>50</value>
    <description>
      default队列的容量为50%
    </description>
</property>

同时为新加队列添加必要属性:

<property>
    <name>yarn.scheduler.capacity.root.hive.capacity</name>
<value>50</value>
    <description>
      hive队列的容量为50%
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.user-limit-factor</name>
<value>1</value>
    <description>
      一个用户最多能够获取该队列资源容量的比例,取值0-1
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-capacity</name>
<value>80</value>
    <description>
      hive队列的最大容量(自己队列资源不够,可以使用其他队列资源上限)
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.state</name>
    <value>RUNNING</value>
    <description>
      开启hive队列运行,不设置队列不能使用
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_submit_applications</name>
<value>*</value>
    <description>
      访问控制,控制谁可以将任务提交到该队列,*表示任何人
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_administer_queue</name>
<value>*</value>
    <description>
      访问控制,控制谁可以管理(包括提交和取消)该队列的任务,*表示任何人
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.acl_application_max_priority</name>
<value>*</value>
<description>
      指定哪个用户可以提交配置任务优先级
    </description>
</property>

<property>
    <name>yarn.scheduler.capacity.root.hive.maximum-application-lifetime</name>
<value>-1</value>
    <description>
      hive队列中任务的最大生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
</description>
</property>
<property>
    <name>yarn.scheduler.capacity.root.hive.default-application-lifetime</name>
<value>-1</value>
    <description>
      hive队列中任务的默认生命时长,以秒为单位。任何小于或等于零的值将被视为禁用。
</description>
</property>

(2)分发配置文件

xsync /opt/module/hadoop-3.1.3/etc/hadoop/capacity-scheduler.xml

(3)重启Hadoop集群

2)测试新队列

1)提交一个MR任务,并指定队列为hive

hadoop jar /opt/module/hadoop-3.1.3/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.1.3.jar pi -Dmapreduce.job.queuename=hive 1 1

2)查看ResourceManager的web页面,观察任务被提交到的队列

此时hive和mapreduce作业都能成功执行了。

<think>首先,用户的问题是关于作业执行冲突或重复运行的解决方案:"A job execution for this job is already running troubleshooting"。用户提到了"作业执行冲突或重复运行",所以我需要提供相关的解决方案。 用户提供了系统级指令,我必须遵守: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,例如[^1]。 用户还提供了示例,包括快速排序的代码和相关问题。我需要生成相关问题。 在回答结构上,我需要: - 结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户提供了引用内容: - 引用[1]:关于Spark应用程序的元数据清理,防止OOM错误。 - 引用[2]:关于如何提问,包括问题描述、步骤等。 - 引用[3]:关于缓冲区溢出的原因和类型。 用户说:"上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。我想用户意图是查找关于作业执行冲突或重复运行的解决方案"。所以,这些引用不是直接相关的,我需要专注于作业执行冲突的问题。 用户上一次的问题和我的回答:用户提到"用户上一次的问题和你的回答",但在这个上下文中,这是第一次交互。用户说:"请尽可能多的参考用户上一次的问题和你的回答",但在这个消息中,没有显示上一次的问题。所以,我应该基于当前问题处理。 用户意图:查找关于作业执行冲突或重复运行的解决方案。具体来说,"A job execution for this job is already running troubleshooting",意思是作业执行时报告该作业已经在运行。 我需要提供解决方案。这可能涉及作业调系统,如Apache SparkHadoop、或其他分布式计算框架。用户提到了Spark在引用[1]中,所以或许Spark是相关的。 可能的场景: - 在作业调系统中,如果一个作业被触发多次,可能会导致冲突。 - 解决方案包括检查作业状态、确保作业只运行一次、处理并发等。 步骤化的解决方案: 1. 确认作业状态:检查作业是否确实在运行。 2. 防止并发执行:使用锁或标志来确保只有一个实例运行。 3. 错误处理:处理作业失败后的重试机制。 4. 系统配置:调整系统设置,如Spark的清理参数,但引用[1]是关于OOM的,不是直接关于作业冲突。 引用[1]提到spark.cleaner.ttl用于清理元数据,防止OOM。这可能间接相关,如果作业冲突导致资源问题,但核心问题是作业重复运行。 我应该提供一般性的解决方案,因为用户没有指定系统。但引用[1]提到Spark,所以或许Spark是上下文。 用户说:"我想用户意图是查找关于作业执行冲突或重复运行的解决方案",所以我需要专注于此。 结构化回答: - 解释问题:作业执行冲突的原因。 - 提供解决方案步骤。 - 生成相关问题。 在回答中,我需要使用中文。 生成相关问题:在回答末尾,添加相关问题部分,如示例。 引用标识:如果在回答中引用外部内容,添加引用标识。但用户提供的引用是站内的,我需要自然地融入。 用户说:"回答中引用的段落末尾自然地添加引用标识",所以我如果引用那些内容,需要添加。 但引用[1]是关于Spark OOM的,引用[2]是关于提问的,引用[3]是关于缓冲区溢出的,可能不直接相关。用户说它们仅供参考,所以我可以忽略或选择性参考。 为了相关性,我可以将引用[1]融入,因为它提到Spark的配置。 可能的解决方案: - 对于Spark作业,使用spark.scheduler.mode=FIFO或FAIR来控制作业调。 - 或者,使用外部锁机制,如数据库锁或文件锁。 - 在作业开始时检查是否有运行中的实例。 步骤: 1. 诊断:检查日志或监控工具,确认作业是否在运行。 2. 配置:设置作业调度器以避免并发。 3. 代码级别:在作业代码中添加检查,如果作业在运行,则跳过或等待。 4. 系统级别:使用工具如cron的锁文件,或分布式锁。 对于Spark特定: - 在Spark中,作业是由driver程序控制的。如果driver运行多次,可能导致冲突。 - 解决方案:确保driver只启动一次,或者使用集群模式管理。 生成相关问题: - 类似于示例,如: 1. 如何防止作业重复运行? 2. 作业冲突的常见原因是什么? 3. 在分布式系统中如何处理作业并发? 使用中文回答。 回答结构: - 开头:解释问题。 - 主体:逐步解决方案。 - 结尾:生成相关问题。</think>### 作业执行冲突或重复运行的解决方案 当系统报告“A job execution for this job is already running”时,这通常表示作业调或执行过程中出现了冲突或重复运行问题。这可能导致资源浪费、数据不一致或系统崩溃。根本原因包括作业调度器配置不当、并发控制缺失、作业状态监控失败等。以下我将基于一般分布式系统(如Apache SparkHadoop等)提供逐步解决方案。解决方案分为诊断、预防和处理三个步骤,确保结构清晰且可靠。我会参考相关技术文档和最佳实践[^1]。 #### 步骤1: 诊断问题(确认作业状态) 首先,确认作业是否确实在运行。这有助于排除误报或临时错误。 - **检查作业日志和监控工具**:使用系统提供的工具(如Spark UI、YARN ResourceManager或自定义监控)查看作业状态。例如,在Spark中,通过Web UI检查作业ID和运行时间。 - **查询作业调度器**:如果使用cron或类似调度器,检查其日志(如`/var/log/cron`)以识别重复触发。 - **验证资源占用**:通过系统命令(如`ps`或`top`)检查进程是否存在。如果发现多个实例,立即终止重复进程。 - 数学表达示例:作业状态概率可建模为$P(\text{running}) = \int_{0}^{t} f(s) \, ds$,其中$f(s)$是作业在时间$s$的运行概率密函数。 如果诊断显示作业未运行但报告冲突,可能是状态元数据未清理(如Spark的元数据堆积导致误判)。引用[1]提到,在Spark中设置`spark.cleaner.ttl`可清理元数据,防止过时对象引起错误[^1]。建议: ```bash # 在Spark配置中设置清理时间(单位:秒) spark.cleaner.ttl = 3600 # 清理1小时前的元数据 ``` #### 步骤2: 预防冲突
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

For_dongyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值