3

我是 Hadoop 新手,非常感谢您对这个问题的帮助。

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

我发现 ssh 是从从站到主站和从站到从站设置的,这与从站到从站不同。

有人可以解释一下吗?

是通过像客户端到DN通信这样的hadoop数据传输协议吗?

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

4

2 回答 2

3

在深入研究hadoop源代码后,我发现datanodes使用BlockSender类来传输块数据。实际上Socket是在引擎盖下。

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

  • DataNode Line 946 是 offerService 方法,它是服务的主循环。 在此处输入图像描述

上面的代码是datanode向namenode发送心跳主要是为了告诉它还活着。返回值是datanode将处理的一些命令。这是发生块复制的地方。

  • 深入研究 processCommand 我们来到第 1160 行 在此处输入图像描述

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

  • 深入研究 transferBlocks,我们来到第 1257 行,一个私有方法。在方法的最后,

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

所以,我们知道datanode启动了一个新线程来做块复制。

  • 查看第 1424 行中的 DataTransfer,检查运行方法。在 run 方法的几乎结束时,我们找到以下代码段:

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

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

我已经完成了我的工作,您可以自行查找更多内容,例如BlockReader

于 2014-07-03T07:20:17.763 回答
-1

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

于 2013-09-08T18:38:02.607 回答