0

我正在尝试使用来自 Google Cloud Storage 的文件FileInputFormat作为MapReduce工作的输入。该文件是Avro格式。

作为一个简单的测试,我使用该工具部署了一个小型 Hadoop2 集群bdutil,由主节点和两个工作节点组成,每个节点有两个插槽。

运行作业时,文件被拆分为多个部分。可以通过查看使用偏移量加载数据的日志来验证这一事实。结果,创建了多个地图任务。到目前为止没有什么异常。

但是这些地图任务不会在工作节点之间分配。相反,两个仅在一个节点上启动,而其他的则留在该Scheduled状态。

我希望每个工作人员上运行两个地图任务,因为数据在任何工作人员节点(它在云存储中)本地都不可用,这使得它们都是平等的候选者。

为什么会这样?

4

1 回答 1

0

看来您正在看到 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_TASKCORES_PER_REDUCE_TASKCORES_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为更小的值。

于 2015-06-15T18:16:34.063 回答