Hadoop: HDFS文件写入和读取

6

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

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

如果是这种情况,那么写入每个块所需的时间难道不比传统文件写入更长吗,因为 -

  1. 复制因子(默认为3)和
  2. 写入过程是按块顺序进行的。

如果我对理解有误,请纠正我。另外,以下是一些问题:

  1. 我理解的是,在Hadoop中,文件读/写没有任何并行性,它能够执行的最佳操作与传统文件读/写相同(即如果将复制设置为1)+涉及分布式通信机制的一些开销。
  2. 仅在数据处理阶段通过Map Reduce提供并行性,而不是在客户端进行文件读/写时提供并行性。
3个回答

1

HDFS写操作:

有两个参数

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

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

即使将dfs.replication设置为3,只要dfs.namenode.replication.min(默认值:1)被复制,写操作就被视为成功。

但是,这种复制最多到达dfs.replication,并且会在顺序流水线中发生。第一个数据节点写入块并将其转发给第二个数据节点。第二个数据节点写入块并将其转发给第三个数据节点。

DFSOutputStream还维护一个内部队列,其中包含等待由数据节点确认的数据包,称为确认队列。只有在所有数据节点都确认了数据包时,才从确认队列中删除数据包。

请查看相关的SE问题:Hadoop 2.0数据写操作确认 HDFS读取操作: HDFS读取操作是并行进行的,而不像写入操作是顺序进行的。

1

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

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

写入操作需要比传统文件系统更长时间(由于带宽问题和一般开销),但不会超过3倍(假定副本因子为3)。


因此,与传统的文件读取/写入相比,Hadoop中的写入或读取操作的性能较慢。而且,群集大小并不重要。副本因子越多,写入数据所需的时间就越长。我正在想如何在如此缓慢的性能下将PB级别的数据按顺序复制到/从Hadoop群集中。仅仅实现处理性能还不够,因为我们仍然会受到将数据复制到/从Hadoop的速度所限制。 - Vijay Bhoomireddy

1
我认为你的理解是正确的。
人们可能期望一个简单的HDFS客户端写入一些数据,当至少写入一个块副本时,它会重新获得控制,而异步地生成其他副本。
但在Hadoop中,HDFS围绕“写一次,多次读取”的模式设计,因此重点不在写入性能上。
另一方面,在Hadoop MapReduce中可以找到并行性(也可以看作是HDFS客户端),专门设计用于此目的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接