hadoop管道写入和并行读取?

wsewodh2  于 2021-06-02  发布在  Hadoop
关注(0)|答案(9)|浏览(651)

我们知道hadoop中的客户机并行读取数据,但数据是在一个管道解剖结构中写入的,其中一个数据节点将数据写入另一个。我知道并行读取使系统更具容错性和更快的读取速度。但是管道写入的好处是什么?为什么hdfs客户机本身不向每个节点写入数据?

tvz2xvvm

tvz2xvvm1#

--------( ack DP1 ) DN2

vmjh9lq9

vmjh9lq92#

假设你有一个128mb的文件,你想把这个文件写在hdfs上。
客户机首先将文件分为块,例如块a、块b,然后客户机与namenode交互,请求放置这些块的位置(块a、块b)。namenode向clinet提供一个datanode列表以写入数据。
然后客户机从这些列表中选择第一个datanode,并将第一个块写入datanode,datanode将该块复制到另一个datanode,一旦第二个datanode接收到复制的块,它将接收到的块确认给主datanode,主datanode将块信息更新到namenode
namenode保存有关文件及其关联块的信息。

ruarlubt

ruarlubt3#

--( ack DP1 )---------( ack DP2 )---( ack DP3 ) DN2

44u64gxh

44u64gxh4#

---( get DP1 / flush to disk )------( ack DP1 )
---->-->时间
上图只显示了一条写流水线的并行性,实际上,不同的流水线写不同的数据段,也可以通过不同流水线的并行操作节省很多,比如一个数据节点可以刷新数据段2,从客户端获取数据段3,同时确认数据段1。下图显示了不同管道如何并行工作。 Client -( DP1 )---( DP2 )---( DP3 )--- DN1 ---------( DP1 )---( DP2 )---( DP3 )

elcex8rz

elcex8rz5#

1为客户端提供更高效的带宽消耗
在流水线写入中,客户端只需将一个副本传输到第一个数据节点,每个节点只需在网络上获取和发送一个副本(除了最后一个数据节点只接收数据),因此与客户端将三个副本写入三个不同的数据节点相比,具有更均衡的网络带宽消耗。
2要维护的发送/确认窗口较小
客户机维护一个小得多的滑动窗口来记录副本中哪些块正在发送到datanodes,哪些块正在等待ack来确认写入已经完成。在管道写入中,客户端似乎只向一个数据节点写入数据。
三。加快写入操作以获得更快的写入响应时间
在写入64mb的数据块时,客户端将数据块划分为4kb大小的数据块并并行发送数据块,这使得许多耗时的操作(通过网络传输、将数据刷新到磁盘)同时运行,如下图所示。
动作(dn=数据节点,dp=数据块) Client -( send DP1 ) DN1 ---------( get DP1 / send to DN2 / flush to disk )

9o685dep

9o685dep6#

----( get DP1 / send to DN2 / flush to disk )------( ack DP1 ) DN3

4nkexdtk

4nkexdtk7#

( ack DP1 )---------( ack DP2 )---( ack DP3 ) DN3

w8ntj3qf

w8ntj3qf8#

----( DP1 )---( DP2 )---( DP3 )

j13ufse2

j13ufse29#

---( DP1 )---( DP2 )---( ack DP1 )---( DP3 )---( ack DP2 )---( ack DP3 )
---->-->时间
对于这种并行处理,可以进行许多优化,例如将前一个数据段的ack消息携带到流水线写入后一个数据段的返回消息中,以节省网络传输。

相关问题