我们知道hadoop中的客户端并行读取数据,但数据是在管道解剖中写入的,其中一个数据节点将数据写入另一个数据节点。我知道并行读取使系统具有更强的容错能力和更快的读取速度。但是管道写入的好处是什么?为什么HDFS客户端本身不会将数据写入每个节点?
答案 0 :(得分:2)
<强> 1。为客户提供更高效的带宽消耗
在管道写入中,客户端只需要将一个副本传输到第一个数据节点,每个节点只能通过网络获取和发送一个副本(除了最后一个数据节点只接收数据),从而拥有更多与客户端将三个副本写入三个不同的数据节点相比,平衡网络带宽消耗。
<强> 2。较小的发送/确认窗口以维护
客户端维护一个小得多的滑动窗口,以记录副本中的哪些块正在发送到DataNode,哪些块正在等待确认写入已完成。在管道写入中,客户端似乎只将数据写入一个数据节点。
第3。加快写操作以加快写入响应时间
当写入64MB的块时,客户端将块分成大小为4KB的块并且并行发送数据块,这大大地使得许多耗时的操作(通过网络传输,将数据刷新到磁盘)同时运行,如下图所示。
动作(DN = DataNode,DP = Data Piece)
Client
- (send DP1
)
DN1
---------(get DP1
/ send to DN2
/ flush to disk
)-------------- ----(ack DP1
)
DN2
--------------(get DP1
/ send to DN2
/ flush to disk
)------({{ 1}})
ack DP1
-----------------------(DN3
/ get DP1
)------ (flush to disk
)
- - - - - - - - - - - - - - - - - &gt;时间
上图仅显示了一个写入流水线的并行性,实际上,用于写入不同数据块的不同流水线也可以通过各种流水线的并行操作节省很多,例如DataNode可以刷新数据块2,获取数据块3从客户端,同时确认数据1。下图显示了不同管道如何并行工作。
ack DP1
- (Client
)---(DP1
)---(DP2
)---
DP3
---------(DN1
)---(DP1
)---(DP2
)------ ----------------(DP3
)---------(ack DP1
)---(ack DP2
)< / p>
ack DP3
--------------(DN2
)---(DP1
)---(DP2
) - ---------(DP3
)---------(ack DP1
)---(ack DP2
)
ack DP3
-----------------------(DN3
)---(DP1
) - - (DP2
)---(ack DP1
)---(DP3
)---(ack DP2
)
- - - - - - - - - - - - - - - - - &gt;时间
可以对这种并行处理进行许多优化,例如将先前数据块的ack消息捎带到管道的返回消息 - 写入后一数据块以节省网络传输。
答案 1 :(得分:0)
假设您有一个128MB的文件,并且您想在HDFS上写这个文件。
客户端机器首先将文件拆分为块说块A,块B然后客户机与NameNode交互以询问放置这些块的位置(块A块B).NameNode给clinet写一个数据节点列表数据。
然后客户端从这些列表中选择第一个datanode并将第一个块写入datanode,datanode将块复制到 另一个数据节点,一旦第二个数据节点接收到复制块,它就会向主节点提供块接收确认 主数据节点将块信息更新为NameNode
NameNode保存有关文件及其关联块的信息。