Hadoop源码分析之一(RPC机制之Server)
来源:互联网 发布:淘宝全民抢购 编辑:程序博客网 时间:2024/05/16 11:16
网上已经有很多关于Hadoop源码分析的好文,在这记录的目的是把自己在看Hadoop源码时自己的一些体会,方便日后查询巩固。
想了解Hadoop是如何工作的,首先需要了解Hadoop RPC原理。Hadoop提供了一个统一的RPC机制来处理client-namenode, namenode-dataname,client-dataname之间的通信。整个机制中主要运用了如下技术:
- Java dynamic proxy:主要用于处理client的代理来统一向Server端发送信息;
- Google Protocal Buffer:主要用于把Request和Response序列化和反序列化成byte进行通信;
- Java NIO:主要用于RPC Client与Server之间的通信;
下面主要介绍RPC Server主要的实现逻辑:
如上图Server端主要Listener, Responer Thread和Handler, Reader Thread Pool。
- Listener Thread:Server端会启一个Listener线程主要用于监听Client发送过来的Request,Listener主要完成创建一个Connection Object并启动一组Reader Thread Pool,并把Connection通过NIO的SelectionKey传递给Reader,这样就解决了Listener单线程带来的可能的性能瓶颈,因为Listener只作了一层转发;
- Reader Thread Pool:主要用于读取Listener传过来的Connection,并调用Connection的readAndProcess方法来读取Request,并封装成一个Call放到Call Queue中;
- Hanlder Thread Pool:Server会启动一组线程组来处理Call Queue中Call,并把处理的Respone中放到response queue中,Hanlder怎么处理Call会在后续介绍;
- Responder Thread:主要处理response queue中的response,并把response发送给client,如果当前response queue为空,在加了新的response时会马上发送给client端,不会通过responer thread来发送。
下面主要结合实际代码来介绍一下Hadoop RPC Server端整个的处理过程:(整个核心逻辑都在org.apache.hadoop.ipc.Server这个类中实现)
首先在Server的start方法中启用相关的线程,start方法会在相关的Server中调用,如NameNode, DataNode等
public synchronized void start() { responder.start(); listener.start(); handlers = new Handler[handlerCount]; for (int i = 0; i < handlerCount; i++) { handlers[i] = new Handler(i); handlers[i].start(); } }如上可以看到启动了listener,responer和handler threand pool,可以通过ipc.server.handler.queue.size来配置handler的个数,默认为100个。
在Server中有一个Listener的内部类,Listener的创造函数中会启动相应的Reader Thread Pool,可以通过ipc.server.read.threadpool.size来配置Reader的线程数,默认为1个。Listener会监听OP_ACCEPT事件,并在doAccpet中创建一个Connection传递给Reader,如下:
while ((channel = server.accept()) != null) { channel.configureBlocking(false); channel.socket().setTcpNoDelay(tcpNoDelay); //get one reader instance for reader pool Reader reader = getReader(); try { //lock this reader reader.startAdd(); SelectionKey readKey = reader.registerChannel(channel); //build Connection instance c = new Connection(readKey, channel, Time.now()); readKey.attach(c); synchronized (connectionList) { connectionList.add(numConnections, c); numConnections++; } } finally { //unlock this reader reader.finishAdd(); } } }在Reader中主要通用Connection来读取Requeset并封装成Call,读取Request分为2种处理,一种为权限读取,另一种为普通读取,具体的实现可以查看hadoop源码,这里不粘出。但是这里会介绍一下整个request在整个传送过程中的结构,request由head和conent组成。
Head的组成如下:
* +----------------------------------+
* | "hrpc" 4 bytes |
* +----------------------------------+
* | Version (1 bytes) |
* +----------------------------------+
* | Authmethod (1 byte) |
* +----------------------------------+
* | IpcSerializationType (1 byte) |
* +----------------------------------+
* | "hrpc" 4 bytes |
* +----------------------------------+
* | Version (1 bytes) |
* +----------------------------------+
* | Authmethod (1 byte) |
* +----------------------------------+
* | IpcSerializationType (1 byte) |
* +----------------------------------+
conent主要有4 bytes的是date length和具体的data byte array组成。
Handler怎么处理具体的Call会在后续具体介绍,这里不做具体展开。
Responder主要处理Call产生的Response并通过NIO传输给具体的client, 使用的socket channel与request为同一个,Responder会做相应的check,如下:
//check select key channel is same as call.connection.channel if (key.channel() != call.connection.channel) { throw new IOException("doAsyncWrite: bad channel"); }
// Extract the first call call = responseQueue.removeFirst(); SocketChannel channel = call.connection.channel; // Using call channel to send as much data as we can in the non-blocking fashion int numBytes = channelWrite(channel, call.rpcResponse);
整个Hadoop RPC Server处理的机制就介绍到这里,后续会介绍call怎么处理到具体的处理及Client如何向Server发送信息。
- Hadoop源码分析之一(RPC机制之Server)
- Hadoop源码分析之一(RPC机制之Server)
- Hadoop源码分析之一(RPC机制之Server)
- Hadoop RPC源码分析之Server
- Hadoop RPC机制+源码分析
- Hadoop源码之RPC机制
- Hadoop源码分析之二(RPC机制之Call处理)
- Hadoop源码分析之二(RPC机制之Call处理)
- Hadoop基础之RPC机制以及HDFS源码分析
- hadoop的RPC机制源码分析
- Hadoop源代码分析之Hadoop RPC(Server)
- Hadoop源码分析 RPC Server端
- Hadoop RPC源码分析之Client
- hadoop源码解析之RPC分析
- Hadoop RPC源码分析
- Hadoop RPC源码分析
- Hadoop RPC源码分析
- Hadoop DFS源码研究之---Hadoop RPC机制
- git config命令使用第二篇——section操作,多个key值操作,使用正则
- 带标号的连通图计数
- zoj - 2511 - Design T-Shirt
- 声嘶力竭的孤魂
- 大内核锁将何去何从
- Hadoop源码分析之一(RPC机制之Server)
- c# 写入注册表 开机启动
- java编程思想_002内存管理
- background-position 用法详细介绍
- Java十个调试技巧
- 为什么hadoop一定是分布式的未来
- Qt编程之调试技术
- 如何保证数据库安全
- 不可或缺的xmlhttp.setRequestHeader()