DataNode与NameNode之间基本的通信就是rpc
(1)登记,dataNode一经启动就应该主动与namenode 建立rpc连接,并向其登记,让Namenode知道有这么一个DataNode已经在位了。
(2)向NameNode发送心跳信号并在这上面搭载各种报告,一来让它知道这个DataNode继续存在,二来让它知道这个DataNode上的存储发生了一些什么变化,特别是节点上有哪些数据块的副本,以及还有多少资源可供使用,这也总是由DataNode主动发起的。
(3)NameNode发回响应消息,由DataNode执行NameNode搭载在响应信息里的命令和要求。
心跳机制
Hadoop集群是master/slave模式,master包括NameNode和ResourceManager,slave包括DataNode和NodeManager。
master启动的时候,会开一个 rpc server那里,等待slave心跳。slave启动时,会连接master,并每隔3秒钟主动向master发送一个"心跳",这个时间可以通过"hearbeat.recheck.interval"属性来设置,将自己的状态信息告诉master,然后master也是通过这个心跳的返回值,向slave节点传达指令。
需要指出的是,namenode与datanode之间的通信,ResourceManager与NodeManager之间的通信,都是通过"心跳"完成的。
(一)DataNode与NameNode之间的心跳:
DataNode上对于每个NameNode都有个BPServiceActor线程,这个线程会定期向其NameNode发送心跳报告。
在NameNode端,DataNode这一边的BPServiceActor线程通过BP和Rpc机制将心跳报文发送到NameNode这一边,然后就睡眠等待Namenode发回响应报文。
在NameNode端,NameNode这一边由NameNodeRpcServer负责接收和处理来自各个DataNode的心跳和报告做出反应,所以NameNode上的pb层接收到来自DataNode的心跳报文以后会调用NameNodeRpcserver的sendHearbeat()方法。
DataNode这一边sendHearbeat,NameNode这一边receiveHearbeat,但是由于rpc要求两边的函数名相同,所以Namenode这一边也是sendHearbeat。但事实上,Namenode不会发送心跳信号。
hadoop通信机制:
hadoop的通信机制就是rpc
rpc是“Remote Peocedure Call”即"远地址过程调用"的缩写,这个机制的目的,是让一台机器上的程序像调用本地的"过程"那样来调用别的机器上的某些过程。
对rpc机制的要求:从程序代码上看,过程的调用者就好像在调用本地函数一样,但是被调用过程的代码实际上在别的机器上,被调用的过程是在别的机器上执行,然后返回执行的结果,对调用者而言就像从本地的函数调用返回一样,在这个过程中,调用者(线程)发动调用之后,就会进入睡眠,直至调用返回时才被唤醒。