我已安装 Apache Hadoop 2.x
共有5个异构节点,其中一个节点专门用于namenode。
我正在使用下面的命令将我的输入文件放入 HDFS
.
$ hdfs dfs -put /home/hduser/myspace/data /user/hduser/inputfile
``` `HDFS` 在三个磁盘上复制此输入文件 `DataNodes (DN)` ,意思是四分之一 `DataNode` 没有输入块。如果我使用8个Map器(通过使用 `NLineInputFormat()` 方法),然后将这8个Map器分配给所有4个dns。我想应该是的。在这种情况下,来自其他dn的数据块将移动到第4个dn,由分配给它的Map器计算,这增加了总体执行时间。
我的问题是:
我们是否可以设法在每个dns上放置数据块,这样就不需要为特定dn上的Map者移动数据。它可以通过hdfs的“put”命令来完成吗?
同样在异构集群的情况下,我们可以根据节点的计算能力在不同的dns上放置不同大小的数据吗?
2条答案
按热度按时间5cnsuln71#
我们无法在每个dn上放置数据块。您提到的hdfs会将文件复制到3个dn。只有当文件大小小于块大小时才是这样。hdfs通过将文件划分为多个块来复制数据。因此,文件数据(块)分布在所有4个dns上的可能性更大。
ygya80vv2#
块的放置完全依赖于hadoop,它将在内部管理块的放置您只能通过配置复制的数量
dfs.replication.factor文件
或大小
dfs.block.size文件
去完成你想要的。
如果你想检查块的位置,你可以打开hdfs的webui
namenode:50070
浏览到文件,它会显示所有节点中的块位置。