我已经安装了Apache Hadoop 2.x
个5个异构节点,其中一个节点完全专用于NameNode。
我使用以下命令将输入文件放入HDFS
。
$ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile
HDFS
在三个DataNodes (DN)
上复制此输入文件,这意味着第四个DataNode
没有输入块。如果我使用8个映射器(通过使用NLineInputFormat()
方法设置分割大小),则将这8个映射器分配给所有4个DN。我认为应该是。在这种情况下,来自其他DN的数据块将移动到第4个DN,由分配给它的映射器计算,这会增加总体执行时间。
我的问题是:
我们能否以某种方式设法在每个DN上放置数据块,以便不需要为特定DN上的映射器移动数据。可以通过hdfs的“put”命令完成吗?
同样在异构集群的情况下,我们可以根据节点的计算能力在不同的DN上放置不同大小的数据吗?
答案 0 :(得分:0)
我们无法设置在每个DN上放置数据块。您提到HDFS将文件复制到3个DN。仅当文件大小小于块大小时才会出现这种情况。 HDFS通过将文件分成多个块来复制数据。因此,文件数据(块)更有可能分布在所有4个DN上。
答案 1 :(得分:0)
块放置完全取决于hadoop,它将在内部管理块放置,您只能通过配置复制次数
dfs.replication.factor
或大小
阻止你完成你想要的东西。dfs.block.size
如果要检查块放置,可以打开HDFS的Web UI
的Namenode:50070
并浏览到此处的文件,它将显示所有节点中的块位置。