【发布时间】: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,谢谢!