我已经设置了一个hadoop集群,它有4个节点,其中一个节点既是hdfs的namenode,也是yarn主节点。这个节点也是最强大的。
现在,我已经分发了两个文本文件,一个在node01(namenode)上,一个在node03(datanode)上。在运行基本wordcount mapreduce作业时,我可以在日志中看到只有node01在进行任何计算。
我的问题是,为什么hadoop没有决定对node03执行mapreduce并传输结果,而不是将整本书传输到node01。我还检查了,复制被禁用,这本书只在node03上可用。
那么,hadoop如何在传输数据和设置作业之间做出决定?在这个决定中,它是否检查了哪台机器的计算能力更强(例如,它是否决定传输到node01,因为node01是4核4gig ram机器,而node03上是2核1G)?
我找不到关于这个主题的任何东西,所以任何指导都将不胜感激。
谢谢您!
更多说明:node01运行的是namenode、datanode、resourcemanager和nodemanager。因此,它既是“主节点”又是“计算节点”。
通过运行以下命令,我确保在node01上放置一个文件,在node03上放置一个文件: hdfs dfs -put sample1.txt samples
在节点01和 hdfs dfs -put sample02.txt samples
在节点03上。由于复制被禁用,这将导致数据(在node01和node03上本地可用)只存储在那里。
我使用hdfswebinterface验证了这一点。对于sample1.txt,它说这些块只在node01上可用;对于sample2.txt,它说这些块只在node03上可用。
关于@cricket\u007:我担心sample2.txt只在node03上可用。yarn-webinterface告诉我,对于应用程序尝试,node01上只分配了一个容器。如果Map文件sample2.txt的任务,node03上也会有一个容器。
因此,node01需要从node03获取sample2.txt文件。
是的,我知道hadoop在1gig的ram上运行得不好,但是我正在使用raspberry pi集群来摆弄和学习一些东西。这不是用于生产用途。
2条答案
按热度按时间laik7k3q1#
yarn应用程序主节点根据存储文件的namenode提供的信息随机选择一个节点来运行计算。datanodes和NodeManager应该在同一台机器上运行。
如果文件不大于hdfs块大小,则没有理由从其他节点获取数据。
注意:hadoop服务仅在1g内存上运行不太好,需要为不同大小的节点调整不同的设置。
polkgigr2#
其他人想知道:
至少对我来说,historyserverui(需要手动启动)正确地显示node03和node01正在运行Map作业。因此,我的说法是不正确的。我仍然想知道为什么应用程序尝试ui会提到一个容器,但我猜这并不重要。
谢谢你们!