Yarn 内存分配管理机制及相关参数配置

本文深入解析Yarn的内存管理机制,涵盖资源配置、任务提交流程及Container概念,结合实例阐述参数设定与优化策略,适合Hadoop集群运维与开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/suifeng3051/article/details/45477773

理解Yarn的内存管理与分配机制,对于我们搭建、部署集群,开发维护应用都是尤为重要的,对于这方面我做了一些调研供大家参考。

一、相关配置情况
关于Yarn内存分配与管理,主要涉及到了ResourceManage、ApplicationMatser、NodeManager这几个概念,相关的优化也要紧紧围绕着这几方面来开展。这里还有一个Container的概念,现在可以先把它理解为运行map/reduce task的容器,后面有详细介绍。

 

1.1  RM的内存资源配置, 配置的是资源调度相关
RM1:yarn.scheduler.minimum-allocation-mb 分配给AM单个容器可申请的最小内存

RM2:yarn.scheduler.maximum-allocation-mb 分配给AM单个容器可申请的最大内存

注:

l 最小值可以计算一个节点最大Container数量

l 一旦设置,不可动态改变

1.2 NM的内存资源配置,配置的是硬件资源相关
NM1:yarn.nodemanager.resource.memory-mb 节点最大可用内存

NM2:yarn.nodemanager.vmem-pmem-ratio 虚拟内存率,默认2.1

注:

l RM1、RM2的值均不能大于NM1的值

l NM1可以计算节点最大最大Container数量,max(Container)=NM1/RM2

l 一旦设置,不可动态改变

1.3 AM内存配置相关参数,配置的是任务相关
AM1:mapreduce.map.memory.mb 分配给map Container的内存大小

AM2:mapreduce.reduce.memory.mb 分配给reduce Container的内存大小

l 这两个值应该在RM1和RM2这两个值之间

l AM2的值最好为AM1的两倍

l 这两个值可以在启动时改变

AM3:mapreduce.map.java.opts 运行map任务的jvm参数,如-Xmx,-Xms等选项

AM4:mapreduce.reduce.java.opts 运行reduce任务的jvm参数,如-Xmx,-Xms等选项

注:

1.这两个值应该在AM1和AM2之间

二、对于这些配置概念的理解
知道有这些参数,还需理解其如何分配,下面我就一副图让大家更形象的了解各个参数的含义。

如上图所示,先看最下面褐色部分,

AM参数mapreduce.map.memory.mb=1536MB,表示AM要为map Container申请1536MB资源,但RM实际分配的内存却是2048MB,因为yarn.scheduler.mininum-allocation-mb=1024MB,这定义了RM最小要分配1024MB,1536MB超过了这个值,所以实际分配给AM的值为2048MB(这涉及到了规整化因子,关于规整化因子,在本文最后有介绍)。

AM参数mapreduce.map.java.opts=-Xmx 1024m,表示运行map任务的jvm内存为1024MB,因为map任务要运行在Container里面,所以这个参数的值略微小于mapreduce.map.memory.mb=1536MB这个值。

NM参数yarn.nodemanager.vmem-pmem-radio=2.1,这表示NodeManager可以分配给map/reduce Container 2.1倍的虚拟内存,安照上面的配置,实际分配给map Container容器的虚拟内存大小为2048*2.1=3225.6MB,若实际用到的内存超过这个值,NM就会kill掉这个map Container,任务执行过程就会出现异常。

AM参数mapreduce.reduce.memory.mb=3072MB,表示分配给reduce Container的容器大小为3072MB,而map Container的大小分配的是1536MB,从这也看出,reduce Container容器的大小最好是map Container大小的两倍。

NM参数yarn.nodemanager.resource.mem.mb=24576MB,这个值表示节点分配给NodeManager的可用内存,也就是节点用来执行yarn任务的内存大小。这个值要根据实际服务器内存大小来配置,比如我们hadoop集群机器内存是128GB,我们可以分配其中的80%给yarn,也就是102GB。

    上图中RM的两个参数分别1024MB和8192MB,分别表示分配给AM map/reduce Container的最大值和最小值。

三、关于任务提交过程
3.1 任务提交过程
步骤1:用户将应用程序提交到ResourceManager上;

步骤2:ResourceManager为应用程序ApplicationMaster申请资源,并与某个NodeManager通信,以启动ApplicationMaster;

步骤3:ApplicationMaster与ResourceManager通信,为内部要执行的任务申请资源,一旦得到资源后,将于NodeManager通信,以启动对应的任务。

步骤4:所有任务运行完成后,ApplicationMaster向ResourceManager注销,整个应用程序运行结束。

3.2 关于Container
(1) Container是YARN中资源的抽象,它封装了某个节点上一定量的资源(CPU和内存两类资源)。它跟Linux Container没有任何关系,仅仅是YARN提出的一个概念(从实现上看,可看做一个可序列化/反序列化的Java类)。

(2)  Container由ApplicationMaster向ResourceManager申请的,由ResouceManager中的资源调度器异步分配给ApplicationMaster;

(3) Container的运行是由ApplicationMaster向资源所在的NodeManager发起的,Container运行时需提供内部执行的任务命令(可以使任何命令,比如java、Python、C++进程启动命令均可)以及该命令执行所需的环境变量和外部资源(比如词典文件、可执行文件、jar包等)。

另外,一个应用程序所需的Container分为两大类,如下:

(1) 运行ApplicationMaster的Container:这是由ResourceManager(向内部的资源调度器)申请和启动的,用户提交应用程序时,可指定唯一的ApplicationMaster所需的资源;

(2) 运行各类任务的Container:这是由ApplicationMaster向ResourceManager申请的,并由ApplicationMaster与NodeManager通信以启动之。

以上两类Container可能在任意节点上,它们的位置通常而言是随机的,即ApplicationMaster可能与它管理的任务运行在一个节点上。

Container是YARN中最重要的概念之一,懂得该概念对于理解YARN的资源模型至关重要,望大家好好理解。

注意:如下图,map/reduce task是运行在Container之中的,所以上面提到的mapreduce.map(reduce).memory.mb大小都大于mapreduce.map(reduce).java.opts值的大小。

四、HDP平台参数调优建议
根据上面介绍的相关知识,我们就可以根据我们的实际情况作出相关参数的设置,当然还需要在运行测试过程中不断检验和调整。

以下是hortonworks给出的配置建议:

 http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.1/bk_installing_manually_book/content/rpm-chap1-11.html 

4.1 内存分配
Reserved Memory = Reserved for stack memory + Reserved for HBase Memory (If HBase is on the same node)

系统总内存126GB,预留给操作系统24GB,如果有Hbase再预留给Hbase24GB。

下面的计算假设Datanode节点部署了Hbase。

4.2containers 计算:
MIN_CONTAINER_SIZE = 2048 MB

containers = min (2*CORES, 1.8*DISKS, (Total available RAM) / MIN_CONTAINER_SIZE)

# of containers = min (2*12, 1.8*12, (78 * 1024) / 2048)

# of containers = min (24,21.6,39)

# of containers = 22

container 内存计算:

RAM-per-container = max(MIN_CONTAINER_SIZE, (Total Available RAM) / containers))

RAM-per-container = max(2048, (78 * 1024) / 22))

RAM-per-container = 3630 MB

4.3Yarn 和 Mapreduce 参数配置:
yarn.nodemanager.resource.memory-mb = containers * RAM-per-container

yarn.scheduler.minimum-allocation-mb  = RAM-per-container

yarn.scheduler.maximum-allocation-mb  = containers * RAM-per-container

mapreduce.map.memory.mb          = RAM-per-container

mapreduce.reduce.memory.mb      = 2 * RAM-per-container

mapreduce.map.java.opts          = 0.8 * RAM-per-container

mapreduce.reduce.java.opts          = 0.8 * 2 * RAM-per-container

yarn.nodemanager.resource.memory-mb = 22 * 3630 MB

yarn.scheduler.minimum-allocation-mb     = 3630 MB

yarn.scheduler.maximum-allocation-mb    = 22 * 3630 MB

mapreduce.map.memory.mb             = 3630 MB

mapreduce.reduce.memory.mb         = 22 * 3630 MB

mapreduce.map.java.opts             = 0.8 * 3630 MB

mapreduce.reduce.java.opts             = 0.8 * 2 * 3630 MB

 

附:规整化因子介绍
  为了易于管理资源和调度资源,Hadoop YARN内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子,如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量,也就是说,应用程序获得资源不会小于自己申请的资源,但也不一定相等;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为最小的整数倍对应的值,公式为ceil(a/b)*b,其中a是应用程序申请的资源,b为规整化因子。

    比如,在yarn-site.xml中设置,相关参数如下:

yarn.scheduler.minimum-allocation-mb:最小可申请内存量,默认是1024

yarn.scheduler.minimum-allocation-vcores:最小可申请CPU数,默认是1

yarn.scheduler.maximum-allocation-mb:最大可申请内存量,默认是8096

yarn.scheduler.maximum-allocation-vcores:最大可申请CPU数,默认是4

    对于规整化因子,不同调度器不同,具体如下:

FIFO和Capacity Scheduler,规整化因子等于最小可申请资源量,不可单独配置。

Fair Scheduler:规整化因子通过参数yarn.scheduler.increment-allocation-mb和yarn.scheduler.increment-allocation-vcores设置,默认是1024和1。

通过以上介绍可知,应用程序申请到资源量可能大于资源申请的资源量,比如YARN的最小可申请资源内存量为1024,规整因子是1024,如果一个应用程序申请1500内存,则会得到2048内存,如果规整因子是512,则得到1536内存。


--------------------- 
作者:Heaven-Wang 
来源:优快云 
原文:https://blog.youkuaiyun.com/suifeng3051/article/details/45477773 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>好的,用户现在想了解如何在Fink的YARN Session模式下设置TaskManager的JVM内存大小。首先,我需要回想一下之前用户的问题和我的回答。之前用户询问了JobManager和TaskManager日志的区别,现在转向了资源配置,尤其是内存设置。这说明用户可能正在实际部署Flink应用,遇到了性能调优的问题,或者正在准备环境配置。 接下来,我需要确认Flink在YARN Session模式下的配置方式。YARN作为资源管理框架,Flink作为其上的应用,需要遵循YARN的资源管理机制YARN负责分配容器,每个TaskManager对应一个容器,容器的资源包括内存和CPU。Flink的配置参数需要与YARN的资源配置协调,否则可能出现资源不足或浪费的情况。 用户的问题集中在TaskManager的JVM内存设置。这里有几个关键点:首先,Flink的内存模型包括总内存、JVM堆内存、堆外内存等部分。其次,在YARN模式下,需要同时设置Flink的参数和YARN的资源请求参数,因为YARN会根据请求分配容器资源。如果只设置Flink参数而忽略YARN的配置,可能会导致容器内存不足,从而引发OOM错误。 我需要拆解配置步骤。首先,确定TaskManager的总内存,这包括JVM堆内存、堆外内存、网络缓冲、框架堆外等部分。然后,通过Flink的配置文件或启动参数设置这些值。同时,YARN的容器内存需要至少等于TaskManager的总内存,否则YARN会杀死超用内存的容器。 常见的参数包括taskmanager.memory.process.size(或taskmanager.memory.flink.size,取决于版本),这个参数决定了Flink认为TaskManager需要的内存总量。同时,YARN的参数yarn.containers.vcores和yarn.container.memory需要对应设置,确保YARN分配的容器足够大。 另外,需要注意不同Flink版本之间的差异。例如,1.10之后的版本内存配置有所变化,引入了更细粒度的内存控制。用户可能使用的是较新版本,因此需要确认参数的正确性。同时,堆外内存的设置对于某些应用(如大量网络传输或使用原生内存的组件)非常重要,需要合理分配,避免OOM。 用户可能的误区是只设置JVM堆内存,而忽略了总内存和其他部分,导致YARN容器内存不足。因此,在回答中需要强调同时配置Flink和YARN参数的重要性,并提供示例配置,帮助用户理解各部分的关系。此外,常见问题如内存分配不足、参数冲突等也需要提及,帮助用户避免典型错误。 最后,应该总结步骤,强调验证方法,比如检查YARN的Web UI确认容器资源,或者查看日志中的内存分配信息,确保配置生效。这样用户可以实际操作并验证他们的配置是否正确。</think>在 Flink 的 **YARN Session 模式**下,设置 TaskManager 的 JVM 内存分配大小需要通过 Flink 的配置参数和 YARN 的资源请求参数协同完成。以下是具体配置方法和原理说明: --- ### 一、核心配置参数 Flink 的 TaskManager 内存由多个部分组成,需通过以下参数定义: | **参数名** | **作用** | |------------------------------------|-------------------------------------------------------------------------| | `taskmanager.memory.process.size` | **总内存**(JVM进程总内存,包括堆内外内存、网络缓冲、框架内存等,必须与 YARN 容器内存一致) | | `taskmanager.memory.jvm-metaspace` | JVM Metaspace 内存大小(默认 256MB) | | `taskmanager.memory.jvm-overhead` | JVM 开销内存(用于线程栈、本地内存等,默认总内存的 10%) | --- ### 二、配置步骤(YARN Session 模式) #### 1. **设置 Flink 配置文件(`flink-conf.yaml`)** 在 `flink-conf.yaml` 中直接定义 TaskManager 的内存参数: ```yaml # 设置 TaskManager 总内存(必须 <= YARN容器内存) taskmanager.memory.process.size: 4096m # 4GB # 可选:调整堆内存(默认总内存的约40%~50%) taskmanager.memory.jvm.heap.size: 2048m # 2GB # 可选:调整堆外内存(Direct Memory,用于网络缓冲等) taskmanager.memory.managed.fraction: 0.3 # 托管内存占比(默认0.4) ``` #### 2. **启动 YARN Session 时指定资源** 在启动命令中通过 `-D` 参数覆盖配置,并指定 YARN 容器的资源: ```bash ./bin/yarn-session.sh \ -D taskmanager.memory.process.size=4096m \ -D yarn.containers.vcores=2 \ # 每个容器的vCPU数量 -D yarn.container.memory=4096 \ # 每个容器的总内存(单位MB,必须 >= taskmanager.memory.process.size) -n 4 # 启动的TaskManager数量 ``` --- ### 三、内存分配逻辑 #### 1. **内存组成公式** Flink 会按以下规则分配内存: $$ \text{总内存} = \text{堆内存} + \text{堆外内存} + \text{网络缓冲} + \text{Metaspace} + \text{JVM开销} $$ #### 2. **参数优先级** - 如果显式指定 `taskmanager.memory.jvm.heap.size`,堆内存按指定值分配。 - 否则,堆内存按总内存的默认比例计算(例如:总内存的 40%)。 --- ### 四、验证配置是否生效 #### 1. **通过 YARN Web UI 检查** 访问 YARN ResourceManager Web UI(如 `http://<yarn-rm-host>:8088`),查看容器分配的内存是否与配置一致。 #### 2. **查看 TaskManager 日志** 在 TaskManager 启动日志中搜索以下内容: ```log INFO org.apache.flink.runtime.taskexecutor.TaskManagerRunner - Starting TaskManager with ResourceID: {...} JVM Memory Settings: - Total Process Memory: 4096mb - JVM Heap Size: 2048mb - Managed Memory Size: 1228mb ... ``` --- ### 五、常见问题与调优建议 1. **容器被 YARN 杀死(OOM)** - 原因:`yarn.container.memory` < `taskmanager.memory.process.size`。 - 解决:确保 YARN 容器内存 >= Flink 配置的总内存。 2. **堆外内存不足(`OutOfMemoryError: Direct buffer memory`)** - 原因:网络缓冲或 RocksDB 使用过多 Direct Memory。 - 解决:增大 `taskmanager.memory.process.size` 并调整 `taskmanager.memory.managed.fraction`。 3. **Metaspace 溢出** - 原因:动态加载类过多(如频繁部署作业)。 - 解决:显式设置 `taskmanager.memory.jvm-metaspace.size=512m`。 --- ### 六、完整配置示例 ```yaml # flink-conf.yaml taskmanager.memory.process.size: 8192m # 总内存 8GB taskmanager.memory.jvm.heap.size: 4096m # 堆内存 4GB taskmanager.memory.managed.fraction: 0.4 # 托管内存占40% taskmanager.memory.jvm-metaspace.size: 512m taskmanager.memory.jvm-overhead.min: 512m ``` 启动命令: ```bash ./bin/yarn-session.sh \ -D yarn.container.memory=8192 \ -D yarn.containers.vcores=4 \ -n 6 ``` --- ### 总结 - **核心原则**:确保 YARN 容器内存 >= Flink TaskManager 配置的总内存。 - **调优重点**:根据作业特性(如批处理/流处理、状态后端类型)平衡堆内存与堆外内存。 - **验证手段**:通过 YARN UI 和 TaskManager 日志双重确认配置生效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值