Hadoop put 命令写入文件需要多长时间

Posted

技术标签:

【中文标题】Hadoop put 命令写入文件需要多长时间【英文标题】:How long does Hadoop put command take to write a file 【发布时间】:2014-05-06 06:08:39 【问题描述】:

使用默认 Hadoop 设置,假设写入一个块需要 4 分钟,将 64Mb 文件写入 HDFS 需要多长时间。

根据我的默认块大小为 64Mb,客户端必须写入一个块,这需要 4 * 3[复制因子]=12 分钟。

原因 HDFS 使用流水线来实现其复制写入。当客户端从 NameNode 接收到 DataNode 列表时,客户端将块数据流式传输到第一个 DataNode(4 分钟),然后将数据镜像到下一个 DataNode(4 分钟),依此类推,直到数据到达所有 DataNode(再次 4 分钟)。来自 DataNode 的确认也以相反的顺序进行流水线传输。4+4+4=12 分钟

有人可以确认我的理解是否正确吗?

【问题讨论】:

【参考方案1】:

您的理解是正确的,但并不完全正确。在下面找到权威指南书的摘录

在写入一个块时,多个数据节点失败是可能的,但不太可能。 只要写入 dfs.replication.min 副本(默认为一个),写入 将成功,并且该块将在集群中异步复制,直到 达到其目标复制因子(dfs.replication,默认为三个)。

这表明 -put 命令所用的时间取决于 hdfs-default.xml 中的 dfs.replication.min 配置

默认情况下为 1。因此根据您的示例,大约需要 4 分钟才能完成。

As -put 将仅等待来自一个数据节点的 ack。

【讨论】:

【参考方案2】:

我同意 Sudarshan 的评论,只是为了添加时间方面 - 说你有 dfs.replication.min 设置为 2 和 dfs.replication 设置为 3,然后 put 操作与简单的 time 命令给出您花费了 2 次复制的时间。 例如 time hadoop fs -put filename destDir。 现在,您可以阅读文件了。 但是,您的文件仍将处于复制状态,namenode 将尝试将其复制到第三个数据节点。由于此操作是异步的,因此您永远不知道它可能需要多少时间。但是每当它完成时,namenode 会将其注册为一个普通块,您可以通过fsck看到它

【讨论】:

【参考方案3】:

我尝试将 6G 文件放入 HDFS 使用 hadoop fs -put filename destDir。完成后,我使用 df 查看硬盘使用情况,Used 不再增长。我认为 -put 将等待来自的 ack已完成 3 次复制。

验证我的。 我尝试将文件放入 HDFS 使用 3 次复制 3 次,需要 43s\35s\40s 。 然后,我将 dfs.replication 编辑为 1,需要 7s\5s\6s。 我使用相同的文件。

【讨论】:

以上是关于Hadoop put 命令写入文件需要多长时间的主要内容,如果未能解决你的问题,请参考以下文章

Hbase 客户端批量写入数据

将时间写入硬盘

php将日志写入一个按时间天来分类的文件put_file_contents()

Hadoop HDFS:读取正在写入的序列文件

file_put_contents() ——将一个字符串写入文件

深入分析hadoop hdfs命令之touchz