使用默认的Hadoop设置,假设编写块需要4分钟,将64Mb文件写入HDFS需要多长时间。
根据我的64Mb作为默认块大小,客户端必须编写一个块,该块需要4 * 3 [复制因子] = 12分钟。
原因
HDFS使用流水线来实现其复制写入。当客户端从NameNode接收DataNode列表时,客户端将块数据流式传输到第一个
DataNode(4分钟),它反过来将数据镜像到下一个DataNode(4分钟),依此类推,直到数据到达所有DataNode(再次4分钟)。来自DataNodes的致谢也以相反的顺序进行流水线操作
4 + 4 + 4 = 12 分钟
有人可以确认我的理解是否正确吗?
答案 0 :(得分:0)
您的理解是沿着正确的道路前进,但并非完全正确。在下面的“权威指南”中找到摘录
在写入块时,多个数据节点失败是可能的,但不太可能。 只要写入dfs.replication.min副本(默认为1),就写入 将成功,并且该块将在整个群集中异步复制,直到 达到目标复制因子(dfs.replication,默认为3)。
这表明-put命令所用的时间取决于hdfs-default.xml
中的dfs.replication.min配置默认情况下,这是1.因此,根据您的示例,大约需要4分钟才能完成。
As -put将仅从一个数据节点等待ack。
答案 1 :(得分:0)
我同意Sudarshan的评论,只是为了添加时间方面 - <
说你将dfs.replication.min
设置为2而dfs.replication
设置为3,然后put
使用简单time
命令进行操作可以让您花费2次重复的时间。例如time hadoop fs -put filename destDir
。
现在,您可以阅读文件。
但是你的文件仍然会被复制,namenode会尝试将它重新复制到第三个datanode。由于此操作是异步的,因此您永远不知道可能需要多长时间。但是无论何时完成,namenode都会将其注册为普通块,您可以通过fsck
答案 2 :(得分:0)
我不同意@Sudarshan和@Chandra kant关于hadoop put命令。我尝试将一个6G文件放到HDFS上使用hadoop fs -put filename destDir
。在竞争时,我使用df
查看硬盘使用情况,Used
不再增长。我认为-put将等待来自3次复制的ack竞争。
验证我的。 我尝试把文件放到HDFS使用3次复制三次,需要43s \ 35s \ 40s。 然后,我将dfs.replication编辑为1,需要7s \ 5s \ 6s。 我使用相同的文件。