在 Apache Flink 中使用DominantResourceCalculator策略配置 YARN 容器的 vCore 数,需通过以下步骤实现:
JobManager 1 个,占用 1 个容器,vcore = 1
TaskManager 3 个,占用 3 个容器,每个容器 vcore = 3,总 vcore = 3*3 = 9
1. 理解 DominantResourceCalculator
该策略基于主导资源公平性(DRF)算法,计算公式为: $$ \text{主导资源占比} = \max\left( \frac{\text{任务CPU需求}}{\text{集群总CPU}}, \frac{\text{任务内存需求}}{\text{集群总内存}} \right) $$ 资源分配优先满足主导资源占比更高的任务。
2. 关键配置参数
在 Flink 的flink-conf.yaml中配置:
# 启用 DominantResourceCalculator yarn.scheduler.capacity.resource-calculator: org.apache.hadoop.yarn.util.resource.DominantResourceCalculator # 指定容器 vCore 数量 yarn.containers.vcores: 4 # 设为实际需要的核心数3. 提交任务时的资源配置
在提交 Flink 作业时指定资源需求(以命令行示例):
./bin/flink run \ -m yarn-cluster \ -ys 2 \ # 每个 TaskManager 的 Slot 数 -yjm 2048 \ # JobManager 内存 (MB) -ytm 4096 \ # TaskManager 内存 (MB) -yD yarn.containers.vcores=4 \ # 显式覆盖配置 ./examples/streaming/WordCount.jar4. YARN 侧的配置验证
在 YARN 的capacity-scheduler.xml中确保:
<property> <name>yarn.scheduler.capacity.resource-calculator</name> <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value> </property>5. 资源分配逻辑
- Flink 根据
yarn.containers.vcores向 YARN 申请容器。 - YARN 使用 DRF 策略比较各任务的资源占比: $$ \text{CPU占比} = \frac{\text{vCore请求}}{\text{集群总vCore}}, \quad \text{内存占比} = \frac{\text{内存请求}}{\text{集群总内存}} $$
- 选择 $\max(\text{CPU占比}, \text{内存占比})$ 最大的任务优先分配。
6. 性能调优建议
- vCore 与物理核心:若物理核心超线程(如 1:2),建议设置: $$ \text{yarn.containers.vcores} = 2 \times \text{物理核心数} $$
- 避免过度分配:单个容器的 vCore 不应超过 YARN 节点总 vCore 的 70%,即满足: $$ \text{单容器vCore} \leq 0.7 \times \text{yarn.nodemanager.resource.cpu-vcores} $$
通过上述配置,Flink 作业将基于 DRF 策略在 YARN 集群中高效分配 vCore 资源。