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