1.问题复现
如图,在yarn-site.xml中我设置的VCores是2个,每个节点提供2GB内存,在mapred-site.xml中设置的每个container是384M。提交了很多任务后,yarn调度器按照 (2GB * 1024)/ 384 = 5 余 128M ,每个节点申请了5个container,但我设置的VCores只有两个,怎么能有这么多container呢?
2.分析
是不是有什么参数没有限制住VCores的变化,去官方文档中yarn-site.xml和mapred-site.xml中找关于VCore的参数,没有找有关这个问题的。最后发现这个问题是在capacity的配置文件中设置的,如下:
yarn.scheduler.capacity.resource-calculator
The ResourceCalculator implementation to be used to compare Resources in the scheduler. The default i.e. org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator only uses Memory while DominantResourceCalculator uses Dominant-resource to compare multi-dimensional resources such as Memory, CPU etc. A Java ResourceCalculator class name is expected.
DefaultResourceCalculator它在申请Container时其实只会考虑内存而不考虑VCores,DominantResourceCalculator考虑多维资源例如内存和CPU,也就是它会考虑所设置的VCore的数量。
3.解决
在capacity-scheduler.xml中修改
将
org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator
修改为:
org.apache.hadoop.yarn.util.resource.DominantResourceCalculator
修改后:因为每个节点只有两个VCore,剩余了很多内存资源