我只是想了解一下下面的陈述。当我试图理解hdfs如何写入数据节点时。我得到了下面关于hdfs写作的解释。
为什么hdfs客户端发送4kb到数据节点,而不是发送整个64mb到数据节点?有人能详细解释一下吗?
为了获得更好的性能,数据节点维护一个用于数据传输的管道。数据节点1不需要等待完整的块到达,就可以开始传输到流中的数据节点2。事实上,对于给定的块,从客户机到数据节点1的数据传输是在4kb的较小块中进行的。当数据节点1从客户机接收到第一个4kb块时,它将该块存储在其本地存储库中,并立即开始将其传输到流中的数据节点2。同样,当数据节点2从数据节点1接收到第一个4kb块时,它将该块存储在其本地存储库中,并立即开始将其传输到数据节点3。这样,流中除最后一个数据节点外的所有数据节点都从上一个数据节点接收数据并将其传输到流中的下一个数据节点,从而避免了每个阶段的等待时间,从而提高了写性能。
2条答案
按热度按时间eqoofvh91#
在hadoop中,通常文件的大小很大,因此它们被配置为在接收到部分数据后立即传输数据,以便可以开始对其进行处理。
让我们用一个例子来讨论它,假设有3个数据节点,并且要执行一个Map作业。输入文件所在的数据或块位于节点1中,其复制位于节点2中(我们假设复制因子为2)。但是由于某些原因或可能是其他作业正在节点1和节点2上运行,由于它们都很忙,因此现在需要在没有输入文件的节点3上执行Map作业,而我们要在其上执行Map作业,因此现在需要将输入文件传输到此节点3。现在,如果节点管理器将等待整个可能64mb的fie传输到节点3,然后再开始map作业,那么它肯定会比传输4kb有更多的头。因为4kb的传输速度更快,而且只要节点3接收到它。它将启动Map作业。这是hadoop的一个简单场景。
如果您将研究hadoop流数据需要连续流,这就是为什么在不同的数据节点之间传输4kb的数据以保持传输短而快,这也是为什么spark流优于hadoop流的主要原因之一,因为hadoop不传输连续的数据,它传输的数据非常小看起来像是连续的数据块。
您可以访问http://javacrunch.in/yarn.jsp 如果您想了解节点管理器如何启动任何作业。
希望这能解决你的疑问。
6ojccjat2#
你的问题有答案。
在此图片中,我们假设文件大小等于块大小(128MB)。所以呢
**A, B, C .. are the chunks in block**
https://i.stack.imgur.com/reo6r.jpg
当数据节点1从客户机接收到第一个4kb(a)块时,它将该块存储在其本地存储库中,并立即开始将其传输到流中的数据节点2。同样,当数据节点2从数据节点1接收到第一个4kb块时,它将该块存储在其本地存储库中,并立即开始将其传输到数据节点3
这里的优点是数据节点2和3不需要等到128 mb的数据复制到数据节点1之后才开始复制。所以,延迟是因为复制将只是一个或两个chuck的复制时间,因为所有的块都并行地复制到节点。