为什么 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
详情:
我终于得到答案了。
这是因为 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)
我是 运行 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
详情:
我终于得到答案了。 这是因为 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)