我有一个关于文件写入和HDFS读取的基本问题。
例如,如果我使用默认配置编写文件,Hadoop内部必须将每个块写入3个数据节点。我的理解是,对于每个块,首先客户端将块写入管道中的第一个数据节点,然后通知第二个,依此类推。一旦第三个数据节点成功接收到块,它就会向数据节点2提供确认,最后通过数据节点1向客户端提供确认。只有在收到块的确认后,才认为写入成功,客户端继续写下一个块。
如果是这种情况,那么编写每个块所花费的时间不会超过传统的文件写入 - 由于 -
如果我理解错了,请纠正我。此外,以下问题如下:
答案 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
而不是顺序写入操作