Hadoop:HDFS文件写入&读

时间:2014-06-19 07:31:13

标签: hadoop hdfs

我有一个关于文件写入和HDFS读取的基本问题。

例如,如果我使用默认配置编写文件,Hadoop内部必须将每个块写入3个数据节点。我的理解是,对于每个块,首先客户端将块写入管道中的第一个数据节点,然后通知第二个,依此类推。一旦第三个数据节点成功接收到块,它就会向数据节点2提供确认,最后通过数据节点1向客户端提供确认。只有在收到块的确认后,才认为写入成功,客户端继续写下一个块

如果是这种情况,那么编写每个块所花费的时间不会超过传统的文件写入 - 由于 -

  1. 复制因子(默认为3)和
  2. 写入过程在块之后顺序发生。
  3. 如果我理解错了,请纠正我。此外,以下问题如下:

    1. 我的理解是Hadoop中的文件读/写没有任何并行性,它可以执行的最好是与传统的文件读取或写入相同(即,如果复制设置为1)+一些开销涉及到分布式通信机制。
    2. 并行性仅在数据处理阶段通过Map Reduce提供,但在客户端文件读/写期间不提供。

3 个答案:

答案 0 :(得分:1)

虽然上面对文件写入的解释是正确的,但 DataNode可以同时读写数据。来自HDFS Architecture Guide

  

DataNode可以从管道中的前一个接收数据   并同时将数据转发到管道中的下一个

写入操作比传统文件系统花费更多时间(由于带宽问题和一般开销),但不超过3倍(假设复制因子为3)。

答案 1 :(得分:1)

我认为你的理解是正确的。

有人可能期望一个简单的HDFS客户端写入一些数据,并且当写入至少一个块副本时,它会收回控件,而异步HDFS会生成其他副本。

但是在Hadoop中,HDFS是围绕“一次写入,多次读取”模式设计的,因此重点不在于写入性能。

另一方面,您可以在Hadoop MapReduce(也可以看作是HDFS客户端)中找到并行性,这样做可以明确地设计。

答案 2 :(得分:1)

HDFS写操作:

有两个参数

dfs.replication:默认块复制。创建文件时,可以指定实际的复制数。如果未在创建时间

中指定复制,则使用默认值

dfs.namenode.replication.min:最小块复制。

即使dfs.replication设置为3,一旦dfs.namenode.replication.min(default value : 1)被复制, 写入操作将被视为成功。

但是, 顺序管道 中的复制最多可达dfs.replication。第一个Datanode写入块并将其转发到第二个Datanode。第二个Datanode写入块并将其转发到第三个Datanode。

DFSOutputStream还维护一个等待数据节点确认的数据包内部队列,称为ack队列。 只有在管道中的所有Datanode确认后,才会从ack队列中删除数据包。

查看相关的SE问题:Hadoop 2.0 data write operation acknowledgement

HDFS读取操作:

HDFS读取操作发生在parallel而不是顺序写入操作