Hadoop RPC框架
RPC协议假定某些传输协议的存在,如TCP或UDP。为通信程序之间携带信息数据。
在OSI网络通信模型中。RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加easy。
- 通信模块:实现请求应该协议。主要分为同步方式和异步方式。
- stub程序:client和server均包括stub程序,能够看做代理程序。使得远程函数表现的跟本地调用一样,对用户程序全然透明。
- 调度程序:接受来自通信模块的请求消息。依据标识选择stub程序处理。并发量大一般採用线程池处理。
- 客户程序/服务过程:请求发出者和请求的处理者。
| 服务 public interface MyBiz extends VersionedProtocol { long PROTOCOL_VERSION = 12321443L; String hello(String name); } public class MyBizImpl implements MyBiz { @Override public long getProtocolVersion(String arg0, long arg1) throws IOException { return PROTOCOL_VERSION; } @Override server public static void main(String[] args) throws IOException { client |
- ClientCache(成员变量):依据用户提供的SocketFactory来缓存Client对象。以便重用Client对象。
- Server(内部类):继承Server抽象类,利用反射实现了call方法。即client请求的方法和相应參数完毕方法调用。
- Invocation(内部类):将要调用的方法名和參数打包成可序列化的对象,方便client和server之间传递。
- Client-NameNode之间,当中NameNode是server
- Client-DataNode之间。当中DataNode是server
- DataNode-NameNode之间,当中NameNode是server
- DataNode-DateNode之间,当中某一个DateNode是server,还有一个是client
- Call(内部类):封装了一个RPC请求,包括5个成员变量,唯一表示id、函数调用信息param、函数返回值value、函数异常信息error、函数完毕标识done。
Hadoop rpc server採用异步方式处理client请求,使得远程过程调用的发生顺序和返回顺序无直接关系,而client正是通过id识别不同的函数调用。
当client向server发送请求。仅仅需填充id和param两个变量。其余3个变量由server端依据函数运行情况填充。
- Connection(内部类。一个线程):是client和server之间的一个通信连接。封装了连接先关的基本信息和操作。基本信息包括:通信连接唯一标识remoteId(ConnectionId)、与Server端通信的scoket、网络输入输出流in/out、保存RPC请求的哈希表calls(Hashtable<Integer, Call>)。操作包括:addCall将一个Call对象加入到哈希表中;sendParam想server端发送RPC请求;receiveResponse从server端接收已经处理完毕的RPC请求。run调用receiveResponse方法,等待返回结果。
- ConnectionId(内部类):连接的标记(包括server地址,协议,其它一些连接的配置项信息)
- ParallelCall(内部类):实现并行调用的请求
- ParallelResults(内部类):并行调用的运行结果
public Writable call(Writable param, ConnectionId remoteId) throws InterruptedException, IOExceptionpublic Writable call(Writable param, InetSocketAddress addr, Class<?> protocol, UserGroupInformation ticket,
int rpcTimeout, Configuration conf) throws InterruptedException, IOException
2)调用Connection类中的sendRpcRequest()方法将当前Call对象发送给Server端;
3)Server端处理完RPC请求后。将结果通过网络返回给Client端,Client端通过receiveRpcResponse()函数获取结果。
4)Client检查结果处理状态(成功还是失败),并将相应Call对象从哈希表中删除。
- Reactor:I/O事件的派发者。
- Acceptor:接受来自Client的连接。建立与Client相应的Handler。并向Reactor注冊此Handler。
- Handler:与一个Client通信的实体,并按一定的过程实现业务的处理。
Handler内部往往会有更进一步的层次划分,用来抽象诸如read、decode、compute、encode和send等过程。在Reactor模式中,业务逻辑被分散的I/O事件所打破。所以Handler须要有适当的机制在所需的信息还不全(读到一半)的时候保存上下文,并在下一次I/O事件到来的时候(还有一半可读)能继续上次中断的处理。
- Reader/Sender:为了加速处理速度,Reactor模式往往构建一个存放数据处理线程的线程池,这样数据读出后,马上扔到线程池中等待兴许处理就可以。为此,Reactor模式一般分离Handler中的读和写两个过程,分别注冊成单独的读事件和写事件。并由相应的Reader和Sender线程处理。
| package com.sohu.tv.nio;
import java.io.IOException; /** /** serverChannel.register(selector, SelectionKey.OP_ACCEPT); /** "); //在这里能够给client发送信息哦 // 获得了可读的事件 } } /** package com.sohu.tv.nio; import java.io.IOException; /** /** // client连接server,事实上方法运行并没有实现连接,须要在listen()方法中调 channel.register(selector, SelectionKey.OP_CONNECT); /** } //在这里能够给服务端发送信息哦 channel.register(this.selector, SelectionKey.OP_READ); // 获得了可读的事件 /** } |
该阶段主要任务是接收来自各个client的RPC请求,并将它们封装成固定的格式(Call类)放到一个共享队列(callQueue)中,以便进行兴许处理。该阶段内部又分为建立连接和接收请求两个子阶段,分别由Listener和Reader两种线程完毕。
整个Server仅仅有一个Listener线程,统一负责监听来自client的连接请求。一旦有新的请求到达。它会採用轮询的方式从线程池中选择一个Reader线程进行处理,而Reader线程可同一时候存在多个,它们分别负责接收一部分client连接的RPC请求,至于每一个Reader线程负责哪些client连接。全然由Listener决定,当前Listener仅仅是採用了简单的轮询分配机制。
Listener和Reader线程内部各自包括一个Selector对象。分别用于监听SelectionKey.OP_ACCEPT和SelectionKey.OP_READ事件。
对于Listener线程。主循环的实现体是监听是否有新的连接请求到达。并採用轮询策略选择一个Reader线程处理新连接。对于Reader线程。主循环的实现体是监听(它负责的那部分)client连接中是否有新的RPC请求到达,并将新的RPC请求封装成Call对象,放到共享队列callQueue中。
(2)处理请求
该阶段主要任务是从共享队列callQueue中获取Call对象,运行相应的函数调用,并将结果返回给client,这所有由Handler线程完毕。
Server端可同一时候存在多个Handler线程,它们并行从共享队列中读取Call对象,经运行相应的函数调用后。将尝试着直接将结果返回给相应的client。但考虑到某些函数调用返回结果非常大或者网络速度过慢。可能难以将结果一次性发送到client,此时Handler将尝试着将兴许发送任务交给Responder线程。
(3)返回结果
前面提到。每一个Handler线程运行完函数调用后,会尝试着将运行结果返回给client。但对于特殊情况。比方函数调用返回结果过大或者网络异常情况(网速过慢),会将发送任务交给Responder线程。
Server端仅存在一个Responder线程,它的内部包括一个Selector对象,用于监听SelectionKey.OP_WRITE事件。当Handler没能将结果一次性发送到client时。会向该Selector对象注冊SelectionKey.OP_WRITE事件,进而由Responder线程採用异步方式继续发送未发送完毕的结果。
Hadoop RPC框架的更多相关文章
- 【Hadoop】Hadoop RPC框架线程模型
1.线程模型 2.参考资料: 源码级强力分析hadoop的RPC机制:http://weixiaolu.iteye.com/blog/1504898Hadoop RPC框架:http://blog.c ...
- Hadoop系列番外篇之一文搞懂Hadoop RPC框架及细节实现
@ 目录 Hadoop RPC 框架解析 1.Hadoop RPC框架概述 1.1 RPC框架特点 1.2 Hadoop RPC框架 2.Java基础知识回顾 2.1 Java反射机制与动态代理 2. ...
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop的RPC框架介绍
为什么会引入RPC: RPC采用客户机/服务器模式.请求程序就是一个客户机,而服务提供程序就是一个服务器.当我们讨论HDFS的,通信可能发生在: Client-NameNode之间,其中NameNod ...
- 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo
hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...
- day07 hadoop里面的RPC框架使用
PS: RPC远程调用 Webservice啥的都是远程调用.下面简单介绍其使用过程 Hadoop已经实现了RPC框架,不用我们自己写,不过需要我们注意几点:1.发布服务端和客户端必须包名相同 1.服 ...
- RPC框架研究(二)Hadoop源代码-1
报名了阿里中间件性能大赛,我来说是一个全新的挑战.一切从空白学起,比赛的过程也是学习的过程 是的.想让自己学好.给自己报一个比赛吧~ 就像当初学围棋,也是报了围棋比赛,为了不至于输的太慘.一个星期里学 ...
- hadoop rpc基础
第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...
- Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
随机推荐
- CF1005F Berland and the Shortest Paths (树上构造最短路树)
题目大意:给你一个边权为$1$的无向图,构造出所有$1$为根的最短路树并输出 性质:单源最短路树上每个点到根的路径 ,一定是这个点到根的最短路之一 边权为$1$,$bfs$出单源最短路,然后构建最短路 ...
- 题解 UVA12206 【Stammering Aliens】
终于A了这道题啊(坑啊) 教练说:这道题不能用map吧,复杂度不一个O(nlogn)吗 于是我就一直想不出来,然后看题解代码,一看就是map... 所以我就在想,那复杂度是不是也不是O(nlogn)呢 ...
- FS,FT,DFT,DFS和DTFT的关系
对于初学数字信号(Digital Signal Processing,DSP)的人来说,这几种变换是最为头疼的,它们是数字信号处理的理论基础,贯穿整个信号的处理. FS:时域上任意连续的周期信号可以分 ...
- 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数
MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...
- python 工具包安装
(1)wxPython是python的常用gui yum install wxPython (2)numpy, scipy是常用的数学处理工具包 yum install scipy
- 《Spring技术内幕》笔记-Spring的设计理念和总体架构
1.Spring的主要子项目: -1.Spring Framework(Core):Spring项目的核心.提供IoC,AOP,MVC等核心功能. -2.Spring Web Flow ...
- Max Points on a Line(直线上最多的点数)
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上. 示例 1: 输入: [[1,1],[2,2],[3,3]] 输出: 3 解释: ^ | | o | o | ...
- 杭电OJ(HDU)-ACMSteps-Chapter Two-《An Easy Task》《Buildings》《decimal system》《Vowel Counting》
http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=2 1.2.5 #include<stdio.h> ...
- Dubbo分布式服务框架入门(附project)
要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...
- 数学之路-python计算实战(6)-numpy-ndarray
>>>> mya=np.zeros(shape=(2,2)) >>>> mya array([[ 0., 0.], [ 0., 0.]]) > ...