为什么 flink 容器 vcore 大小总是 1

Why flink container vcore size is always 1

我是 运行 flink on yarn(更准确地说是在 AWS EMR yarn 集群中)。

我阅读了flink文档和源代码,默认情况下对于每个任务管理器容器,flink在从yarn请求资源时会请求每个任务管理器的插槽数作为vcores数。 而且我也从源码中确认:

// Resource requirements for worker containers
            int taskManagerSlots = taskManagerParameters.numSlots();
            int vcores = config.getInteger(ConfigConstants.YARN_VCORES, 
Math.max(taskManagerSlots, 1));
            Resource capability = Resource.newInstance(containerMemorySizeMB, 
vcores);

            resourceManagerClient.addContainerRequest(
                new AMRMClient.ContainerRequest(capability, null, null, 
priority));

当我使用 -yn 1 -ys 3 启动 flink 时,我假设 yarn 将为唯一的任务管理器容器分配 3 个 vcores,但是当我检查 vcores 的数量时对于来自 yarn 资源管理器 web ui 的每个容器,我总是看到 vcores 的数量为 1。我也从 yarn 资源管理器日志中看到 vcore 为 1。

我把flink源码调试到下面粘贴的那一行,看到vcores的值为3。 真是一头雾水,谁能帮我解惑一下,谢谢

@yinhua.

使用命令开始一个session:./bin/yarn-session.sh,你需要添加-s arg.

-s,--slots Number of slots per TaskManager

详情:

  1. https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/deployment/yarn_setup.html
  2. https://ci.apache.org/projects/flink/flink-docs-release-1.4/ops/cli.html#usage

我终于得到答案了。 这是因为 yarn 使用 "DefaultResourceCalculator" 分配策略,所以 yarn RM 只计算内存,即使 flink 请求 3 个 vcores,但 yarn 只是忽略 cpu 核心数。

Kien Truong 的回答

嗨,

你必须在YARN中启用CPU调度,否则总是显示每个容器只分配了1个CPU, 不管有多少 Flink 尝试分配。所以你应该在capacity-scheduler.xml中添加(编辑)以下属性:

<property>
 <name>yarn.scheduler.capacity.resource-calculator</name>
 <!-- <value>org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator</value> -->
 <value>org.apache.hadoop.yarn.util.resource.DominantResourceCalculator</value>
</property>

另外,taskManager的内存例如是1400MB,但是Flink预留了一些堆外内存,所以实际的堆内存要小一些。

这由 2 个设置控制:

containerized.heap-cutoff-min: default 600MB

containerized.heap-cutoff-ratio: default 15% of TM's memory

这就是为什么您的 TM 的堆大小限制在 ~800MB (1400 - 600)