Flink 细粒度资源管理(On Yarn)
简介
Flink 细粒度资源管理从 Flink 1.16 开始支持,旨在解决 TaskManger 资源的更精细化管理,比如:- 简单的 Source、Sink 希望少用一些资源
- Aggregate、双流 Join 希望多用一些内存资源
- 复杂的字符串解析希望多用一些 CPU 资源
本文通过介绍 On YARN 中 Flink 细粒度管理是如何进行资源隔离及其底层原理来方便用户更好的理解 Flink 设计背后的考量。
本文并未直接介绍如何在 Flink Application 中使用该特性,具体的使用方式可以参考官方文档:Flink 1.20:细粒度资源管理。
YARN 的资源配置和细粒度资源管理
YARN 中一个通过 yarn-site.xml 配置 Node 节点的资源数量,NodeManager 负责管理这些资源,并上报给 ResourceManager。<!-- yarn-site.xml 示例(仅做示例演示) -->
<!-- 每个容器请求的最小内存(单位:MB) -->
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<!-- 每个容器请求的最大内存(可选,建议设为 >=2048) -->
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<!-- 每个容器请求的最小 vcore 数 -->
<property>
<name>yarn.scheduler.minimum-allocation-vcores</name>
<value>1</value>
</property>
<!-- 每个容器请求的最大 vcore 数(可选) -->
<property>
<name>yarn.scheduler.maximum-allocation-vcores</name>
<value>4</value>
</property>
<!-- NodeManager 可用的总物理内存(单位:MB) -->
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>16384</value> <!-- 例如:16GB,根据机器实际内存调整 -->
</property>
<!-- NodeManager 可用的总 vcore 数 -->
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>8</value> <!-- 根据机器 CPU 核心数调整 -->
</property>
YARN 通过 vcore 表示 CPU 计算资源,通常 vcore 设置的数量等于当前 CPU 的物理核心数。生产环境中为了方便整个大数据计算集群资源和成本的管理,通常是按照一个标准的比例配置单个 Node 下的 vcore 和内存。比如:1 vcore = 1 core + 2GB。然后再根据不同物理机的性能不同部署标配下不同数量的 NodeManager 节点,保证资源的充分利用。
默认情况下 TaskManager 申请的 vcore 数量等于配置的 slots 数量(numberOfSlots)。如下图所示,一个 TaskManager 配置了 3 个 slot,即一个 TaskManager 占用 3 个 vcore。
Caused by: org.apache.flink.configuration.IllegalConfigurationException: The number of requested virtual cores per node 16 exceeds the maximum number of virtual cores 8 available in the Yarn Cluster. Please note that the number of virtual cores is set to the number of task slots by default unless configured in the Flink config with 'yarn.containers.vcores.'

如上图所示,一个 TaskManager 是一个进程,一个 Task Slot 中运行的 Task(Task 即 subtask = Operator 或 OperatorGroup 的一个并发)是一个线程。多个 Task Slots 共享 TaskManager 中的资源。这种 slots 共享资源的模式是 Flink 资源管理的默认模式——粗粒度的资源管理(Coarse-Grained Resource Management)。

粗粒度模式下,资源分配最细粒度是 TaskManager(通过启动参数指定)。细粒度模式下,资源分配的最细粒度 Slot,隔离仍然是 TaskManager 粒度(底层依赖 cgroup 能力,只能做到进程粒度)。不过细粒度下的内存可以做到 slots 粒度。
如下图所示,通过指定不同 slots 下的资源量来进行分配:
- CPU Core 隔离:只是通过 cgroup 进行 TM CPU 用量的管理,slots 之间 Flink 内部没有软管理能力
- Memory 隔离:Flink 内部通过 MemorySegment 等一系列机制进行软管理,从内存申请流程中对单个 slot 的内存用量进行管理(由 SlotManager 申请)
软管理:文中指的是通过逻辑管理的方式对资源进行管理和隔离
硬管理:文中指的是通过 cgroup 技术在系统内核级别进行资源的管理和隔离

使用限制
Flink 开源版本只将该能力作为一个 MVP 版本开放出来供社区使用。并且使用有一些限制:- 只提供了 Flink DataStream API 使用方式
- 细粒度资源模式下 Flink 的弹性扩缩容能力不可用
- Flink Web UI 中不支持对细粒度的资源配置进行展示,只展示 Slots 的数量

浙公网安备 33010602011771号