NameNode和DatNode的通信

来源:互联网 发布:php是什么文件格式 编辑:程序博客网 时间:2024/06/07 02:13


   1) NameNode启动的时候,开启一个ipc server。


   2) DataNode启动时,通过“握手”的方式与NameNode节点连接,之所以采用“握手”方式(参Datanode.java的handshake()),是为了验证DataNode的namespaceID以及layoutVersion。如果一个节点的namespaceID或者layoutVersion不匹配,那么DataNode节点就会自动关闭。namespaceID是在文件系统format的时候就分配好的。namespaceID被在集群内的所有节点上都有持久化存储。


    3)handshake之后,DataNode被注册到NameNode(参考Datanode.java的register())。DataNode持久化保存其唯一的storageID。storageID是一个DataNode的内部标识符,该标识符能够确保即使是服务器用不同的IP地址或者端口启动,仍然可以被识别。storageID在DataNode首次注册到NameNode时即被分配,一旦分配后便无法更改,一个DataNode节点中所有存储路径的storageID是一样的。我们可以通过查看DataNode启动日志:DatanodeRegistration(192.168.0.100:50010, storageID=DS-649749109-192.168.0.100-50010-1364779669993, infoPort=50075, ipcPort=50020)In DataNode.run, data = FSDataset{dirpath='/usr/hadoop/tmp/dfs/data/current'}。查看NameNode日志:BLOCK* NameSystem.registerDatanode: node registration from 192.168.0.100:50010 storage DS-649749109-192.168.0.100-50010-1364779669993。我们还可以查看NameNode和DataNode的VERSION文件。


     4)DataNode采用发送block report的形式,向NameNode标识其所包含的块副本。块报告包含了blockID,timestamp,以及每个块副本的长度等等。 第一个块报告会在DataNode注册后立即发送。在offerService()中,DatanodeCommand cmd = namenode.blockReport(...),cmd为NameNode向DatNode传达的指令。当然我们也可以通过DataNode的日志查看到如下内容:BlockReport of 30 blocks took 1 msec to generate and 10 msecs for RPC and NN processing。随后的块报告会每小时发送一次,以确保NameNode能够知道集群中块副本的最新情况。在正常情况下,DataNode向NameNode发送“心跳信号”,以确认DataNode运行正常,以及其所包含的块数据可用。默认的“心跳信号”的时间间隔是3秒。如果NameNode长达10分钟没有接受到来自于DataNode的心跳信号,那么久会认为为该DataNode节点已经失效,其所包含的块(block)已经无法使用。DatanodeCommand[] cmds = namenode.sendHeartbeat(dnRegistration, data.getCapacity(),data.getDfsUsed(), data.getRemaining(),xmitsInProgress.get(), getXceiverCount()),心跳信号包括总存储容量,存储使用量,当前数据传输进度等附加信息。这些统计数据可用于NameNode块分配,以及作为负载均衡决策的参考。并每隔3秒钟主动向NameNode发送一个“心跳”,将自己的状态信息告诉NameNode,然后NameNode也是通过这个心跳的返回值,向DataNode节点传达指令。指令的内容包括,将块移到其他节点,移除本地块副本,重新注册和发送即时块报告,关闭当前节点等等。






原创粉丝点击