我在纱线上运行flink(更准确地说是在AWS EMR纱线集群中)。
我读取了默认情况下每个任务管理器容器的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时,我假设纱线将为唯一的任务管理器容器分配3个vcores,但当我检查每个容器的vcores数量时资源管理器web ui,我总是看到vcores的数量是1.我还看到vcore从纱线资源管理器日志中得到1。
我将flink源代码调试到下面粘贴的行,我看到 vcores 的值 3 。 这真让我感到困惑,任何人都可以帮我澄清一下,谢谢。
答案 0 :(得分:2)
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)
此致
健
答案 1 :(得分:0)
@yinhua。
使用该命令启动会话:./bin/yarn-session.sh
,您需要添加-s
arg。
-s, - slots每个TaskManager的插槽数
详细信息:
答案 2 :(得分:0)
我终于得到了答案。 这是因为使用纱线&#34; DefaultResourceCalculator&#34;分配策略,因此只有内存计算为纱线RM,即使flink请求3个vcores,但纱线只是忽略cpu核心数。