Hadoop中RPC机制

HadoopRPC机制

RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。Hadoop底层的交互都是通过rpc进行的。例如:datanode和namenode 、tasktracker和jobtracker、secondary namenode和namenode之间的通信都是通过rpc实现的。下面是rpc交互过程图: 

1.客服端调用的总过程:

Hadoop的RPC客户端代码其实就一个类:org.apache.hadoop.ipc.Client。这个类使用Java的动态代理技术,生成服务器的业务接口的代理,通过socket将调用的业务方法和参数传送到服务器端,并且等待服务器端的响应。

客户端调用的序列图如下:

 

 例如:TaskTracker请求与JobTracker的通信:

TaskTracker通过:

      this.jobClient = (InterTrackerProtocol)

          RPC.waitForProxy(InterTrackerProtocol.class, InterTrackerProtocol.versionID,

                       jobTrackAddr, this.fConf);

中的InterTrackerProtocol 去和JobTracker通信。

在RPC中通过:

       VersionedProtocol proxy =

            (VersionedProtocol) Proxy.newProxyInstance(

            protocol.getClassLoader(), new Class[] { protocol },

            new Invoker(addr, ticket, conf, factory));

产生一个动态代理完成JobTracker和TaskTracker之间的心跳交流。

2.客服端向服务器发送连接

    客户端(C)要发起对服务端(S)方法的调用主要通过:

    public Writable call(Writable param, InetSocketAddress addr,

                       Class<?> protocol, UserGroupInformation ticket) 

                       throws InterruptedException, IOException 实现

2.1首先在该方法调用中:

    Call call = new Call(param); //将param转换成Call对象  其实就是将Invocation(用来序列化和反序列化RPC客户端的调用信息,包括方法名和参数信息)转化为Call 。

2.2 客服端创建一个通向服务端的连接connection,Connection connection = getConnection(addr, protocol, ticket, call);然后将此次调用放入CallList里,这样客户端就可以同时发生很多调用,每个调用用ID来识别。

(1) 根据RPC服务端的地址和接口从连接池中获取一个,如果取到Connection则直接返回。

(2) 否则新建一个Connection,并将它放入到连接池中

(3) 然后通过SocketFactory创建一个Socket,并建立到RPC服务端的连接,如果连接不成功,则重试。

(4) 创建和关联输入和输出流对象。

2.3 发送调用参数connection.sendParam(call)。调用参数是Client的调用方(比如NameNode,DataNode等)指定的,一般就是一个Invocation对象,里面包含要调用的方法和参数。

2.4等待调用结果.Client.Connection是个线程类,启动了之后唯一做的事情就是等待调用结果。

    synchronized (call) {   

          while (!call.done){   //done就是服务器端返回该call的结果,判断该call是否处理

          ……………………           

          ………………

       }

    }

3.服务器端对客服端的call请求处理

对于服务器端,其有一个方法start指定了启动服务器开始监听,这个start被四个类调用,分别是TaskTracker.initialize,Namenode.initialize,Jobtracker.offerService,Datanode.startDatanode,显然,任何两者之间的通信都是考这个client-server模型实现的。

3.1 server start后,干了三件事,就是启动三个线程

1.启动listener,监听客户端Call

2.启动response,随时准备将处理结果发回client

3.启动10个handler,处理具体的请求。

3.2上面三个线程的具体工作过程

3.2.1. Listener线程

该线程负责监听客户端请求以及数据的接收,然后将接收到的数据组成一个Call实例,放到请求队列里面。具体做法如下:

1) Listener线程循环等待RPC客户端的发送数据过来

2) 当有数据可以接收时,调用Connection的readAndProcess()方法。readAndProces()又调用processData()方法

3) Connection边接收边对数据进行处理,如果接收到一个完整的Call包,则构建一个Call对象。readAndProcess()调用processData()方法把Call对象加入到Call队列的,并将这个Call对象PUSH到Call队列中,由Handler线程来处理Call队列中的所有Call。

3.2.2.Handler线程

该线程负责从请求队列中取出调用请求,通过调用抽象方法

1) Handler线程循环监听Call队列,如果Call队列为空,则进入wait状态,否则按FIFO规则从Call队列取出Call

2) 将Call交给RPC.Server处理(调用RPC.Server的public Writable call(Class<?> protocol, Writable param, long receivedTime)

    throws IOException ),因为RPC对Server的一些功能进行了实现

3) 借助java里的反射机制,完成对目标方法的调用

4) 返回响应。由于响应需要通过SOCKET返回给RPC客户端,所以响应的类型必须是Writable。

3.2.2. Response线程   

 Response也监视responselist,如果responselist中某个call需要将结果写入客户端就写出,当某个call的结果被发送完毕,从responselist中删除该call对象。

注意:handler完成call之后就开始向客户端写call结果,但是结果可能太多,无法通过一次性发送完毕,而发送之后还要等待client接受完毕才能再发,如果现在handler在那里等待客户端接受完毕,然后再发,效率不高。解决办法是handler处理完毕之后,只向client发送一次处理结果。如果这一次将处理结果发送完毕,接下来就没有response的事情了,如果没有发送完毕,接下来response负责将剩下的处理结果发送给客户端。这样handler的并发量会大一些。

服务器实现中大量利用监视队列,比如handler就直观坚持calllist,一旦发现数据就开始处理,而response就监视responselist,发现数据需要发送就开始发送。

参考:

1.http://bbs.hadoopor.com/thread-329-1-2.html

2.http://jackosn-liao.iteye.com/blog/851914 

3. http://blog.csdn.net/wuixiaobao/article/details/6549781

4.http://bbs.hadoopor.com/thread-329-1-2.html

 

 

 

转载于:https://www.cnblogs.com/MGGOON/archive/2012/02/24/2367231.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/410054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中如何读取一个数的位数_求1000以内的水仙花数

点击上方 蓝字关注我们大家好&#xff0c;我是阿汤哥。看知乎上有朋友说还不明白怎么判断水仙花数&#xff0c;今天我们就来看看这个问题。(PS&#xff1a;“求1000以内的水仙花数”这道题阿汤哥记忆犹新。到现在还记得这是我大一上学期期末考试的编程题。)怎么求水仙花数&…

[html] link标签的属性media有哪些值?都有什么作用?

[html] link标签的属性media有哪些值&#xff1f;都有什么作用&#xff1f; 根据w3c的介绍&#xff0c;media属性表示link的链接文档会应用于何种媒介&#xff08;设备&#xff09;上。用于为不同的媒介类型规定不同的样式。常用的值为screen(计算机屏幕&#xff0c;默认), pr…

双向绑定v-bind

通过v-model绑定输出数据<script> export default {data(){return {pagestyle:https://v4.bootcss.com/docs/4.3/dist/css/bootstrap.css,pagecss:https://v4.bootcss.com/docs/4.3/examples/sticky-footer-navbar/sticky-footer-navbar.css,mytitle:v-bind bootstrap样…

python函数复用_【python学习-4】可复用函数与模块

1、自定义函数自定义函数格式如下&#xff1a;def (参数列表):return#!/usr/bin/python#定义函数&#xff0c;打印数字1~5defprintNum5():#range函数&#xff0c;生成列表集合&#xff0c;有3个入参&#xff1a;start(可选&#xff0c;起始数)&#xff0c;stop(终止数&#xff…

(todo)数组名 有存储空间吗?

转与csdn 对于数组b[]&#xff0c;b是数组的地址&#xff0c;但b不算变量&#xff0c;有没有一个地方存放b&#xff1f;而且b是不 是存放的就是自己所在的地址。 ------------------------------------------------------------- 数组名不是对象&#xff0c;数组才是对象&am…

[html] 实现一个居中半透明的模态窗

[html] 实现一个居中半透明的模态窗 .modal{ width: 400px; height: 250px; position: absolute; top: 50%; left: 50%; background: rgba(0,0,0,.5); transform: translateX(-50%) translateY(-50%); }个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容…

xyz坐标图_“色觉地图”的建立(二):辐照度与亮度、rgb空间、“颜色图”的混色方式...

上篇““色觉地图”的建立&#xff08;一&#xff09;&#xff1a;光感受器、色匹配实验与CIE RGB坐标系“中说到&#xff0c;人的色觉是线性的&#xff0c;我们可以用叠加原理“混色”——这意味着色觉的空间固定不变&#xff0c;我们可以任意选择一组基底&#xff08;或说坐标…

Nginx的应用之动静分离

Nginx 的动静分离 我们通过中间件将动态请求和静态请求进行分离&#xff0c;减少了不必要的请求消耗和延时。 动静分离后&#xff0c;即使动态服务不可用&#xff0c;但静态资源不会受到影响。 应用实例 1、准备环境 系统角色主机名IP服务CentOS 7.2反向代理Nginx_Proxy192.168…

[html] 说说你对网格布局的理解

[html] 说说你对网格布局的理解 目前是最强大的布局方案&#xff0c;但兼容性差个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

【SQLSERVER】SQL SERVER 2008筛选表报错

【SQLSERVER】SQL SERVER 2008筛选表报错 错误详细&#xff1a;标题: Microsoft SQL Server Management Studio------------------------------无法为该请求检索数据。 (Microsoft.SqlServer.Management.Sdk.Sfc)有关帮助信息&#xff0c;请单击: http://go.microsoft.com/fwli…

安装ipython失败 in error catcher_疯狂的Python:零基础小白入门帖子详情 - 网易云课堂...

C:\Users\David>pip install IpythonCollecting IpythonUsing cached ipython-6.1.0-py3-none-any.whlCollecting pygments (from Ipython)Downloading Pygments-2.2.0-py2.py3-none-any.whl (841kB)53% |█████████████████▏ | 450kB 3.3kB/…

3d打印英语文献_锐医学院 | 只需10分钟!解读康复医学文献+英语学习

文献解读英语学习只需10分钟锐医学院致力于专业康复教育培训同时&#xff0c;也在康复领域专家的合作下&#xff0c;一直在研究康复领域最前沿所取得的研究成果、存在的问题以及发展趋势进行系统和全面的叙述和评论与各领域康复专业人士分享。文献解读有助于发现前沿性问题&…

node.js通过回调函数获取异步函数的返回结果

html文件代码<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>我的node.js首页</title> </head> <body></body> </html> 通过buffer流读取html文件var fs require(fs);…

[html] 写页面布局时你有考虑过分辨率因素吗?还要考虑哪些因素呢

[html] 写页面布局时你有考虑过分辨率因素吗&#xff1f;还要考虑哪些因素呢 1.支持的最大和最小分辨率 2.流式布局还是响应式布局个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起…

StreamWriter打开文件报错:”不支持给定路径的格式。“

StreamWriter swnew StreamWriter(path,false,Encoding.Default);这段话出异常&#xff0c;查下来发现文件名中还有:号&#xff0c;把半角的:变成全角的&#xff1a;问题即可解决。 转载于:https://www.cnblogs.com/yanzhenan/archive/2012/02/29/2373511.html

bigdecimal 保留两位小数_一律使用 BigDecimal,避免后患?

你知道的越多&#xff0c;不知道的就越多&#xff0c;业余的像一棵小草&#xff01;你来&#xff0c;我们一起精进&#xff01;你不来&#xff0c;我和你的竞争对手一起精进&#xff01;编辑&#xff1a;业余草zhuanlan.zhihu.com/p/94144867推荐&#xff1a;https://www.xttbl…

tcp 四次挥手_tcp三次握手和四次挥手

SYN&#xff1a;一个很小的包&#xff0c;tcp的第一个包&#xff08;同步序列编号&#xff09;ACK:确认响应SYN、ACK:为1表示确认连接FIN表示关闭连接&#xff0c;PSH表示有 DATA数据传输&#xff0c;RST表示连接重置。Acknowledge number(ack)&#xff1a;确认号&#xff0c;大…

ssh登录服务器提示错误no hostkey alg

ssh登录服务器提示错误no hostkey alg ssh root192.168.1.100 -vvv提示失败&#xff1a;no hostkey alg 登录到192.168.1.100服务器 rm -rf /etc/ssh/ssh*key systemctl restart sshd #我还是移走了&#xff0c;没有删除。因为之前安装了telnet服务&#xff0c;因此不用担心连…

[html] 打印页面时怎样自定义打印页眉页脚或者去掉眉页脚?

[html] 打印页面时怎样自定义打印页眉页脚或者去掉眉页脚&#xff1f; <style type"text/css" media"print"> page { size: auto; /* auto is the initial value / margin: 0mm; / this affects the margin in the printer settings */ } </styl…

sqlite 的几点见解

这几天接触了sqlite数据库&#xff0c;开始不上手感觉太变态连DataTime数据类型的都不能返回一个DataSet。 但是在网上查了几天后才发现其实sqlite还是很容易上手的。 我说几点我预到的问题&#xff1a; 1&#xff0c;字段的自增我们在sqlite中的字段自增是把数据类型设为integ…