【问题标题】:How does Hadoop distribute the data/tasks for MapReduce jobs?Hadoop 如何为 MapReduce 作业分配数据/任务?
【发布时间】:2020-01-14 16:28:22
【问题描述】:

我设置了一个有 4 个节点的 Hadoop 集群,其中一个用作 HDFS 的 NameNode 以及 Yarn 主节点。这个节点也是最强大的。

现在,我已经分发了 2 个文本文件,一个在 node01 (namenode) 上,一个在 node03 (datanode) 上。在运行基本 WordCount MapReduce 作业时,我可以在日志中看到只有 node01 正在执行任何计算。

我的问题是为什么 Hadoop 没有决定在 node03 上做 MapReduce 并传输结果,而不是将整本书传输到 node01。我还检查了,复制被禁用,这本书只在 node03 上可用。

那么,Hadoop 如何在传输数据和设置作业之间做出决定,并且在此决定中,它是否检查哪台机器具有更大的计算能力(例如,它是否决定传输到 node01,因为 node01 是一个 4 核 4gig ram 机器vs 2core 1 gig on node03)?

我找不到有关此主题的任何内容,因此不胜感激。

谢谢!


更多说明: node01 正在运行一个 NameNode 以及一个 DataNode 和一个 ResourceManager 以及一个 NodeManager。因此,它既是“主节点”,又是“计算节点”。

我通过运行确保将一个文件放在 node01 上,将一个文件放在 node03 上: hdfs dfs -put sample1.txt samples 在 node01 上和 hdfs dfs -put sample02.txt samples 在 node03 上。由于复制被禁用,这会导致数据 - 在 node01 和 node03 上本地可用 - 仅存储在那里。

我使用 HDFS Web 界面验证了这一点。对于 sample1.txt,它表示这些块仅在 node01 上可用;对于 sample2.txt,它表示这些块仅在 node03 上可用。

关于@cricket_007: 我担心的是 sample2.txt 仅在 node03 上可用。 YARN Web 界面告诉我,对于应用程序尝试,node01 上只分配了一个容器。如果文件 sample2.txt 的 map 任务,那么 node03 上也会有一个容器。

因此,node01 需要从 node03 获取 sample2.txt 文件。

是的,我知道 Hadoop 在 1gig 的 RAM 上运行不佳,但我使用 Raspberry Pi 集群只是为了摆弄和学习一点。这不适用于生产用途。

【问题讨论】:

  • 你说“我已经分发了 2 个文本文件”是什么意思?您是如何将它们带到这些节点的?你能指定你执行的实际命令吗?另外,当 MapReduce 作业运行时,您在日志中看到了什么实际上认为只有 node01 在做一些工作?
  • Namenode 不存储 HDFS 数据文件,那么您是如何获得该文件的呢?
  • @cricket_007 我已经在编辑中联系了你们的 cmets,谢谢!

标签: hadoop hdfs


【解决方案1】:

YARN 应用程序主节点根据存储文件的 Namenode 提供的信息随机选择一个节点来运行计算。 DataNodes 和 NodeManagers 应该在同一台机器上运行。

如果您的文件不大于 HDFS 块大小,则没有理由从其他节点获取数据。

注意:Hadoop 服务仅在 1G 的 RAM 上运行不佳,您需要针对不同大小的节点调整不同的 YARN 设置。

【讨论】:

    【解决方案2】:

    对于其他想知道的人:

    至少对我而言,HistoryServer UI(需要手动启动)正确显示 node03 和 node01 正在运行地图作业。因此,我的陈述是不正确的。我仍然想知道为什么应用程序尝试 UI 会提到一个容器,但我想这并不重要。

    谢谢你们!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 2013-10-18
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多