2014-06-19 161 views
6

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

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

  1. 复制因子(默认为3)和
  2. 的写入过程在块后依次发生。

如果我的理解错了,请纠正我。此外,下面的下列问题:

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

回答

1

虽然你上面的文件写入说明是正确的,但是一个DataNode可以同时读写数据。从HDFS Architecture Guide

一个数据管理部可以与前一个在管道 ,并在同一时间将数据转发到在管道中的下一个来接收数据

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

+0

那么有效,一与传统的文件读/写相比,hadoop中的写或读操作性能较低。另外,集群的大小并不重要。复制因子越多,写入数据所需的时间就越多。我只是想知道如何将数据以PB级的顺序复制到hadoop集群,或者性能如此之慢。只是在处理过程中实现性能并不足够,因为我们仍将根据数据复制到/离开hadoop的速度来决定。 –

1

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

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

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

另一方面,您可以在Hadoop MapReduce(也可以看作HDFS客户端)中找到并行性,并设计明确性来执行此操作。

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还维护一个等待被datanodes确认的数据包的内部队列,称为ack队列。 仅当数据包已被流水线中的所有Datanode确认后,才从确认队列中删除数据包。

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

HDFS读操作:

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