【发布时间】:2015-06-05 10:33:47
【问题描述】:
我们知道 hadoop 中的客户端并行读取数据,但数据写入管道解剖结构,其中一个数据节点将数据写入另一个数据节点。我知道并行读取使系统更具容错性和更快的读取速度。但是管道写入有什么好处呢?为什么 HDFS 客户端本身不向每个节点写入数据?
【问题讨论】:
我们知道 hadoop 中的客户端并行读取数据,但数据写入管道解剖结构,其中一个数据节点将数据写入另一个数据节点。我知道并行读取使系统更具容错性和更快的读取速度。但是管道写入有什么好处呢?为什么 HDFS 客户端本身不向每个节点写入数据?
【问题讨论】:
1.客户端更有效的带宽消耗
在流水线写入中,客户端只需将一个副本传输到第一个数据节点,每个节点通过网络只获取和发送一个副本(最后一个数据节点只接收数据除外),从而拥有更多与客户端将三个副本写入三个不同的数据节点相比,平衡网络带宽消耗。
2。需要维护的发送/确认窗口更小
客户端维护一个小得多的滑动窗口来记录副本中的哪些块正在发送到数据节点,哪些块正在等待确认写入已完成。在管道写入中,客户端似乎只将数据写入一个数据节点。
3.加快写入操作以获得更快的写入响应时间
在写入64MB的chunk时,客户端将chunk分成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)------(ack DP1)
DN3-----------(get DP1/flush to disk)------(ack DP1)
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——> 时间
上图只展示了一个写流水线的并行度,实际上,不同的流水线写入不同的数据片,通过各种流水线的并行操作也可以节省很多,比如一个DataNode可以flush数据片2,获取数据片3从客户端,并同时确认数据块 1。下图展示了不同的流水线是如何并行工作的。
Client-(DP1)---(DP2)---(DP3)---
DN1---------(DP1)---(DP2)---(DP3)------------- --------(ack DP1)---------(ack DP2)---(ack DP3)
DN2--------------(DP1)---(DP2)---(DP3)------ -(ack DP1)---------(ack DP2)---(ack DP3)
DN3-----------(DP1)---(DP2)---(ack DP1) ---(DP3)---(ack DP2)---(ack DP3)
—— —— —— —— —— —— —— —— —— —— —— —— —— —— —— ——> 时间
对于这种并行处理,可以做很多优化,比如捎带前一个数据块的ack消息到流水线的返回消息——写入后一个数据块以节省网络传输。
【讨论】:
假设你有一个 128MB 的文件,你想把这个文件写到 HDFS 上。
客户端机器首先将文件拆分为块说块A,块B然后客户端机器与NameNode交互以询问放置这些块的位置(块A块B)。NameNode将数据节点列表提供给客户端写入数据。
然后客户端从这些列表中选择第一个数据节点并将第一个块写入数据节点,数据节点将块复制到 另一个数据节点,一旦第二个数据节点接收到复制的块,它就会将收到的块确认给主数据节点 主datanode将block信息更新到NameNode
NameNode 保存有关文件及其关联块的信息。
【讨论】: