我在纱线上运行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时,我认为Yarn将为唯一的任务管理器容器分配3个VCORS,但是当我从yarn中检查每个容器的VCORES数量时Resource Manager Web UI,我总是看到VCORS的数量为1。我还认为VCORE是YARN Resource Manager Logs的VCORE。
。我将flink源代码调试到下面粘贴的行,我看到 vcores 的值是 3 。这真的让我感到困惑,任何人都可以帮我澄清吗,谢谢。
kien truong
的答案嗨,
您必须在YARN 中启用 CPU调度,否则,它总是显示为每个容器分配1个CPU,不管有多少弗林克尝试分配。因此,您应该在 coppation-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)
@yinhua。
使用命令开始一个会话: ./bin/yarn-session.sh
,您需要添加 -s
arg。
-s, - 每个Taskmanager插槽的插槽
详细信息:
- https://ci.apache.org/projects/flink/flink/flink-docs-release-1.4/ops/deployment/yarn_setup.html
- https://ci.apache.org/projects/flink/flink/flink-docs-release-1.4/ops/cli.html#usage
我最终得到答案。这是因为纱线使用" Defaultresourcecalculator"分配策略,因此,即使Flink请求3个VCORES,也只能计算YARN RM的内存,但是Yarn只是忽略了CPU核心编号。