设为首页 加入收藏

TOP

Hadoop底层机制
2018-11-29 01:42:46 】 浏览:69
Tags:Hadoop 底层 机制

1. RPC机制

1.1 RPC协议

把某些接口和接口中的方法称为协议,客户端和服务端只要实现这些接口中的方法就可以进行通信了

重点接口介绍如下:

VersionedProtocol:它是所有RPC协议接口的父接口,其中只有一个方法:getProtocolVersion()

(1)HDFS相关
ClientDatanodeProtocol
:一个客户端和datanode之间的协议接口,用于数据块恢复
ClientProtocol:client与Namenode交互的接口,所有控制流的请求均在这里,如:创建文件、删除文件等;
DatanodeProtocol: Datanode与Namenode交互的接口,如心跳、blockreport等;
NamenodeProtocol:SecondaryNode与Namenode交互的接口。

(2)Mapreduce相关
InterDatanodeProtocol
:Datanode内部交互的接口,用来更新block的元数据;
InnerTrackerProtocol:TaskTracker与JobTracker交互的接口,功能与DatanodeProtocol相似;
JobSubmissionProtocol:JobClient与JobTracker交互的接口,用来提交Job、获得Job等与Job相关的操作;
TaskUmbilicalProtocol:Task中子进程与母进程交互的接口,子进程即map、reduce等操作,母进程即TaskTracker,该接口可以回报子进程的运行状态

1.2 ipc.RPC源码分析

ipc.RPC类中有一些内部类,重点介绍如下:

Invocation:用于封装方法名和参数,作为数据传输层。
ClientCache:用于存储client对象,用socket factory作为hash key,存储结构为hashMap <SocketFactory, Client>。
Invoker:是动态代理中的调用实现类,继承了InvocationHandler。
Server:是ipc.Server的实现类。

Invocation类仅作为VO,ClientCache类只是作为缓存,而Server类用于服务端的处理,他们都和客户端的数据流和业务逻辑没有关系。那么,RPC.Invoker类中的invoke()方法就实现动态代理,将数据发送给服务端,服务端将处理的结果再返回给客户端,所以这里的invoke()方法必然需要进行网络通信

由此引出如下三个问题:

1. 客户端和服务端的连接是怎样建立的?
2. 客户端是怎样给服务端发送数据的?
3. 客户端是怎样获取服务端的返回数据的?

1.3 ipc.Client源码分析

重点介绍Client类的几个内部类:

Call:用于封装Invocation对象,作为VO,写到服务端,同时也用于存储从服务端返回的数据
Connection:用以处理远程连接对象。继承了Thread
ConnectionId:唯一确定一个连接

问题1:客户端和服务端的连接是怎样建立的?

Client类中的call()方法:

public Writable call(Writable param, ConnectionId remoteId)
throws InterruptedException, IOException {
Call call = new Call(param); //将传入的数据封装成call对象
Connection connection = getConnection(remoteId, call); //获得一个连接

//如果connections连接池中有对应的连接对象,就不需重新创建了;如果没有就需重新创建一个连接对象。
//但请注意,该连接对象只是存储了remoteId的信息,其实还并没有和服务端建立连接。将call对象放入对应连接中的calls池,才是真正的完成了和服务端建立连接。

//客户端的连接其实就是创建一个普通的socket进行通信

connection.sendParam(call); // 向服务端发送call对象
boolean interrupted = false;
synchronized (call) {
while (!call.done) {
try {
call.wait(); // 等待结果的返回,在Call类的callComplete()方法里有notify()方法用于唤醒线程
} catch (InterruptedException ie) {
// 因中断异常而终止,设置标志interrupted为true
interrupted = true;
}
}
......
}
}

问题2:客户端是怎样给服务端发送数据的?

Client.Connection类的sendParam()方法来实现,其实就是java io的socket发送数据的一般过程

问题3:客户端是怎样获取服务端的返回数据的?

Client.Connection类和Client.Call类中的相关方法来实现,启动一个处理线程,读取从服务端传来的call对象,将call对象读取完毕后,唤醒client处理线程。就这么简单,客户端就获取了服务端返回的数据了

1.4 ipc.Server源码分析

ipc.Server的一些内部类如下:

Call:用于存储客户端发来的请求
Listener: 监听类,用于监听客户端发来的请求,同时Listener内部还有一个静态类,Listener.Reader,当监听器监听到用户请求,便让Reader读取用户请求。
Responder:响应RPC请求类,请求处理完毕,由Responder发送给请求客户端。
Connection:连接类,真正的客户端请求读取逻辑在这个类中。
Handler:请求处理类,会循环阻塞读取callQueue中的call对象,并对其进行操作。

1.4.1 初始化Server

RPC的server对象是通过ipc.RPC类的getServer()方法获得的getServer()是一个创建Server对象的工厂方法,但创建的却是RPC.Server类的对象
1.4.2 运行Server

初始化Server后,Server端就运行起来了

1.4.3 Server处理请求

1)建立连接
分析过ipc.Client源码后,我们知道Client端的底层通信直接采用了阻塞式IO编程,当时我们曾做出猜测:Server端是不是也采用了阻塞式IO。现在我们仔细地分析一下吧,如果Server端也采用阻塞式IO,当连接进来的Client端很多时,势必会影响Server端的性能。hadoop的实现者们考虑到了这点,所以他们采用了java NIO来实现Server端,java NIO可参考博客:
http://weixiaolu.iteye.com/blog/1479656 。那Server端采用java NIO是怎么建立连接的呢?分析源码得知,Server端采用Listener监听客户端的连接

在启动Listener线程时,服务端会一直等待客户端的连接

2)接收请求
Server.Listener.Reader类中的doRead()方法和Server.Connection类中的readAndProcess()方法

3)获得call对象
Server.Connection类中的processOneRpc()方法和processData()方法

4)处理call对象
Server类中还有个Handler内部类,负责对call对象的处理。Server.Handler类中run()方法。

5)返回请求
Server.Responder类中的doRespond()方法

2. Hadoop心跳机制

2.1 心跳机制

hadoop集群是master/slave模式,master包括Namenode和Jobtracker,slave包括Datanode和Tasktracker。
master启动的时候,会开一个ipc server在那里,等待slave心跳。
slave启动时,会连接master,并每隔3秒钟主动向master发送一个“心跳”,这个时间可 以通过”heartbeat.recheck.interval”属性来设置。将自己的状态信息告诉master,然后master也是通过这个心跳的返回值,向slave节点传达指令。
需要指出的是:namenode与datanode之间的通信,jobtracker与tasktracker之间的通信,都是通过“心跳”完成的。

2.2 Datanode、Namenode心跳

既然“心跳”是Datanode主动给Namenode发送的。那Datanode是怎么样发送的呢?

循环调用“发送心跳”方法,直到shutdown
发送心跳的对象并不是datanode,而是一个名为namenode的对象,难道在datanode端就直接有个namenode的引用吗?其实不然,namenode其实是一个DatanodeProtocol的引用是一个Datanode端对Namenode的代理对象,正是这个代理完成了“心跳”。代理的底层实现就是RPC机制了。

2.3 Tasktracker、Jobtracker心跳

Tasktracker利用InterTrackerProtocol协议用于定义Tasktracker和Jobtracker的通信。同样,它也是一个代理对象代理的底层实现也是RPC机制。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hadoop中的Context使用 下一篇hadoop及hive常用命令查询

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目