我是 Hadoop 新手,非常感谢您对这个问题的帮助。
集群中块的复制由具有块副本的各个数据节点处理,但是在不考虑名称节点的情况下如何进行此传输。
我发现 ssh 是从从站到主站和从站到从站设置的,这与从站到从站不同。
有人可以解释一下吗?
是通过像客户端到DN通信这样的hadoop数据传输协议吗?
http://blog.cloudera.com/blog/2013/03/how-to-set-up-a-hadoop-cluster-with-network-encryption/
我是 Hadoop 新手,非常感谢您对这个问题的帮助。
集群中块的复制由具有块副本的各个数据节点处理,但是在不考虑名称节点的情况下如何进行此传输。
我发现 ssh 是从从站到主站和从站到从站设置的,这与从站到从站不同。
有人可以解释一下吗?
是通过像客户端到DN通信这样的hadoop数据传输协议吗?
http://blog.cloudera.com/blog/2013/03/how-to-set-up-a-hadoop-cluster-with-network-encryption/
在深入研究hadoop源代码后,我发现datanodes使用BlockSender类来传输块数据。实际上Socket是在引擎盖下。
下面是我找到这个的黑客方法。(这里使用的 hadoop 版本 1.1.2)
上面的代码是datanode向namenode发送心跳主要是为了告诉它还活着。返回值是datanode将处理的一些命令。这是发生块复制的地方。
这是一条评论,我们可以毫无疑问地确定 transferBlocks 是我们想要的。
new Daemon(new DataTransfer(xferTargets, block, this)).start();
所以,我们知道datanode启动了一个新线程来做块复制。
// send data & checksum
blockSender.sendBlock(out, baseStream, null);
从上面的代码中,我们可以知道 BlockSender 是实际的 worker。
我已经完成了我的工作,您可以自行查找更多内容,例如BlockReader
每当必须在 HDFS 中写入一个块时,NameNode 将在任何数据节点上为该块分配空间。它还将在其他数据节点上为该块的副本分配空间。然后它将指示第一个数据节点写入块,并在其他为副本分配空间的数据节点上复制该块。