数据节点之间的通信如何在Hadoop集群中工作?

时间:2013-09-08 14:04:28

标签: hadoop

我是Hadoop的新手,对此问题的帮助表示赞赏。

群集中块的复制由具有块副本的各个数据节点处理,但是如何在不考虑namenode的情况下进行此传输。

我发现ssh是从从设备设置为主设备和主设备到从设备,而不是从设备到从设备。

有人可以解释一下吗?

是否通过hadoop数据传输协议,如客户端到DN通信?

http://blog.cloudera.com/blog/2013/03/how-to-set-up-a-hadoop-cluster-with-network-encryption/

2 个答案:

答案 0 :(得分:3)

在深入研究hadoop源代码之后,我发现数据节点使用BlockSender类来传输块数据。实际上,Socket是引人注目的。

下面是我找到这个的黑客方法。(这里使用了hadoop 1.1.2版)

  • DataNode第946行是offerService方法,它是一个主循环 为了服务。 enter image description here

上面的代码是datanode发送心跳到namenode主要是告诉它是alive.the返回值是datanode将处理的一些命令。这是块复制发生的地方。

  • 深入了解流程命令我们来到1160号线 enter image description here

这是一条评论,毫无疑问我们确定transferBlocks就是我们想要的。

  • 深入研究transferBlocks,我们来到第1257行,这是一种私人方法。在方法结束时,

new Daemon(new DataTransfer(xferTargets, block, this)).start();

所以,我们知道datanode开始一个新线程来进行块复制。

  • 查看第1424行的DataTransfer,检查run方法。 在即将结束的方法中,我们找到以下片段:

// send data & checksum blockSender.sendBlock(out, baseStream, null);

从上面的代码中,我们可以知道BlockSender是实际的工作者。

我完成了我的工作,您可以找到更多内容,例如BlockReader

答案 1 :(得分:-1)

每当必须在HDFS中写入块时,NameNode将在任何datanode上为该块分配空间。它还将为此块的副本在其他datanode上分配空间。然后,它将指示第一个datanode写入块,并在其他数据节点上复制块,其中为副本分配了空间。