我们知道hadoop中的客户机并行读取数据,但数据是在一个管道解剖结构中写入的,其中一个数据节点将数据写入另一个。我知道并行读取使系统更具容错性和更快的读取速度。但是管道写入的好处是什么?为什么hdfs客户机本身不向每个节点写入数据?
tvz2xvvm1#
--------( ack DP1 ) DN2
ack DP1
DN2
vmjh9lq92#
假设你有一个128mb的文件,你想把这个文件写在hdfs上。客户机首先将文件分为块,例如块a、块b,然后客户机与namenode交互,请求放置这些块的位置(块a、块b)。namenode向clinet提供一个datanode列表以写入数据。然后客户机从这些列表中选择第一个datanode,并将第一个块写入datanode,datanode将该块复制到另一个datanode,一旦第二个datanode接收到复制的块,它将接收到的块确认给主datanode,主datanode将块信息更新到namenodenamenode保存有关文件及其关联块的信息。
ruarlubt3#
--( ack DP1 )---------( ack DP2 )---( ack DP3 ) DN2
ack DP2
ack DP3
44u64gxh4#
---( get DP1 / flush to disk )------( ack DP1 )---->-->时间上图只显示了一条写流水线的并行性,实际上,不同的流水线写不同的数据段,也可以通过不同流水线的并行操作节省很多,比如一个数据节点可以刷新数据段2,从客户端获取数据段3,同时确认数据段1。下图显示了不同管道如何并行工作。 Client -( DP1 )---( DP2 )---( DP3 )--- DN1 ---------( DP1 )---( DP2 )---( DP3 )
get DP1
flush to disk
Client
DP1
DP2
DP3
DN1
elcex8rz5#
1为客户端提供更高效的带宽消耗在流水线写入中,客户端只需将一个副本传输到第一个数据节点,每个节点只需在网络上获取和发送一个副本(除了最后一个数据节点只接收数据),因此与客户端将三个副本写入三个不同的数据节点相比,具有更均衡的网络带宽消耗。2要维护的发送/确认窗口较小客户机维护一个小得多的滑动窗口来记录副本中哪些块正在发送到datanodes,哪些块正在等待ack来确认写入已经完成。在管道写入中,客户端似乎只向一个数据节点写入数据。三。加快写入操作以获得更快的写入响应时间在写入64mb的数据块时,客户端将数据块划分为4kb大小的数据块并并行发送数据块,这使得许多耗时的操作(通过网络传输、将数据刷新到磁盘)同时运行,如下图所示。动作(dn=数据节点,dp=数据块) Client -( send DP1 ) DN1 ---------( get DP1 / send to DN2 / flush to disk )
send DP1
send to DN2
9o685dep6#
----( get DP1 / send to DN2 / flush to disk )------( ack DP1 ) DN3
DN3
4nkexdtk7#
( ack DP1 )---------( ack DP2 )---( ack DP3 ) DN3
w8ntj3qf8#
----( DP1 )---( DP2 )---( DP3 )
j13ufse29#
---( DP1 )---( DP2 )---( ack DP1 )---( DP3 )---( ack DP2 )---( ack DP3 )---->-->时间对于这种并行处理,可以进行许多优化,例如将前一个数据段的ack消息携带到流水线写入后一个数据段的返回消息中,以节省网络传输。
9条答案
按热度按时间tvz2xvvm1#
--------(
ack DP1
)DN2
vmjh9lq92#
假设你有一个128mb的文件,你想把这个文件写在hdfs上。
客户机首先将文件分为块,例如块a、块b,然后客户机与namenode交互,请求放置这些块的位置(块a、块b)。namenode向clinet提供一个datanode列表以写入数据。
然后客户机从这些列表中选择第一个datanode,并将第一个块写入datanode,datanode将该块复制到另一个datanode,一旦第二个datanode接收到复制的块,它将接收到的块确认给主datanode,主datanode将块信息更新到namenode
namenode保存有关文件及其关联块的信息。
ruarlubt3#
--(
ack DP1
)---------(ack DP2
)---(ack DP3
)DN2
44u64gxh4#
---(
get DP1
/flush to disk
)------(ack DP1
)---->-->时间
上图只显示了一条写流水线的并行性,实际上,不同的流水线写不同的数据段,也可以通过不同流水线的并行操作节省很多,比如一个数据节点可以刷新数据段2,从客户端获取数据段3,同时确认数据段1。下图显示了不同管道如何并行工作。
Client
-(DP1
)---(DP2
)---(DP3
)---DN1
---------(DP1
)---(DP2
)---(DP3
)elcex8rz5#
1为客户端提供更高效的带宽消耗
在流水线写入中,客户端只需将一个副本传输到第一个数据节点,每个节点只需在网络上获取和发送一个副本(除了最后一个数据节点只接收数据),因此与客户端将三个副本写入三个不同的数据节点相比,具有更均衡的网络带宽消耗。
2要维护的发送/确认窗口较小
客户机维护一个小得多的滑动窗口来记录副本中哪些块正在发送到datanodes,哪些块正在等待ack来确认写入已经完成。在管道写入中,客户端似乎只向一个数据节点写入数据。
三。加快写入操作以获得更快的写入响应时间
在写入64mb的数据块时,客户端将数据块划分为4kb大小的数据块并并行发送数据块,这使得许多耗时的操作(通过网络传输、将数据刷新到磁盘)同时运行,如下图所示。
动作(dn=数据节点,dp=数据块)
Client
-(send DP1
)DN1
---------(get DP1
/send to DN2
/flush to disk
)9o685dep6#
----(
get DP1
/send to DN2
/flush to disk
)------(ack DP1
)DN3
4nkexdtk7#
(
ack DP1
)---------(ack DP2
)---(ack DP3
)DN3
w8ntj3qf8#
----(
DP1
)---(DP2
)---(DP3
)j13ufse29#
---(
DP1
)---(DP2
)---(ack DP1
)---(DP3
)---(ack DP2
)---(ack DP3
)---->-->时间
对于这种并行处理,可以进行许多优化,例如将前一个数据段的ack消息携带到流水线写入后一个数据段的返回消息中,以节省网络传输。