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