看来您正在看到 YARN 工作原理的产物之一;与 Hadoop 1 中 JobTracker 同时有效地扮演 Hadoop 2 的 AppMaster 和 ResourceManager 的角色不同,在 Hadoop 2 中,ResourceManager(在您的主节点上运行)实际上将一个全新的 AppMaster 按需打包到一个 YARN 容器中。 MapReduce 作业。
此外,另一个稍微改变的概念是,您永远不会完全拥有“插槽”,YARN 容器实际上会跨内存和 CPU 维度进行调度。这意味着如果打包到 YARN 上的单个任务请求大量内存但只有 1 个 CPU,它可能会占用资源占用空间,否则可能会打包多个 map 或 reduce 任务。
例如,假设您在每个 n1-standard-2 部署了 2 个 worker,您可能会http://<master-ip>:8088/cluster/nodes
在运行 mapreduce 时在 ResourceManager 页面下看到类似的内容:
... Containers Mem Used Mem Avail VCores Used VCores Avail Version
... 1 5.50 GB 0 B 1 1 2.6.0
... 2 5 GB 512 MB 2 0 2.6.0
在这种情况下,application_master
从 ResourceManager 访问链接表明 ResourceManager 确实被打包到报告5.5GB Mem Used, 0B Mem Avail, 1 VCores Used
. 同样,我发现我的地图任务仅在报告2 VCores Used
.
一般来说,这意味着如果你最感兴趣的是确保它随着工人数量的增加而扩展,你不必做任何特别的事情;你最终只会将你的 map 或 reduce 任务打包到NUM_WORKERS - 1
可能的机器上,而其中一台运行 AppMaster 来完成这项工作。
但是,根据您的工作,这可能会很浪费。默认设置最适合超大型作业,在这种情况下,拥有一个非常大的 AppMaster 以确保它不会 OOM 跟踪大量正在进行的任务是有意义的。NODEMANAGER_MEMORY_FRACTION
您可以通过覆盖、CORES_PER_MAP_TASK
、CORES_PER_REDUCE_TASK
和CORES_PER_APP_MASTER
在您的自定义*_env.sh
文件中(或内联hadoop2_env.sh
,但是这更难跟踪升级而不是维护类似的文件)来调整细粒度设置my_overrides_env.sh
。bdutil 中的注释hadoop2_env.sh
解释了这些设置:
# Fraction of worker memory to be used for YARN containers
NODEMANAGER_MEMORY_FRACTION=0.8
# Decimal number controlling the size of map containers in memory and virtual
# cores. Since by default Hadoop only supports memory based container
# allocation, each map task will be given a container with roughly
# (CORES_PER_MAP_TASK / <total-cores-on-node>) share of the memory available to
# the NodeManager for containers. Thus an n1-standard-4 with CORES_PER_MAP_TASK
# set to 2 would be able to host 4 / 2 = 2 map containers (and no other
# containers). For more details see the script 'libexec/configure-mrv2-mem.py'.
CORES_PER_MAP_TASK=1.0
# Decimal number controlling the size of reduce containers in memory and virtual
# cores. See CORES_PER_MAP_TASK for more details.
CORES_PER_REDUCE_TASK=2.0
# Decimal number controlling the size of application master containers in memory
# and virtual cores. See CORES_PER_MAP_TASK for more details.
CORES_PER_APP_MASTER=2.0
特别是如果您升级到像 n1-standard-4 这样的大型机器,您可以考虑简单地修改NODEMANAGER_MEMORY_FRACTION
为更小的值。