Hadoop 中 IPC 的源码分析
最近开始看 Hadoop 的一些源码,展开hadoop的源码包,各个组件分得比较清楚,于是开始看一下 IPC 的一些源码。
IPC模块,也就是进程间通信模块,如果是在不同的机器上,那就可以理解为 RPC 了,也就是远程调用。事实上, hadoop 中的 IPC 也就是基于 RPC 实现的。
使用 sloccount 统计一下 ipc 包中代码的行数,一共是 2884 行。也就是说,IPC 作为hadoop的基础组件,仅仅用了不到3000行的代码,就完成得稳定且富有效率。
IPC 中的关键类关系:
对用户而言,可以直接使用的就是绿色的类。
通过 RPC 这个门面:
客户端可以创建相应的 proxy,接着就可以进行远程调用。
而服务提供者则可以创建相应的 server,并进行相应的生命周期管理(start、stop),从而提供服务。
序列化
从上图也可以看出,client 和 server 的交互,是通过网络 connection, 而走网络的调用,是需要走序列化/反序列话的过程的。
这个过程, IPC 使用了 Hadoop 的自己的序列化机制,一切都在 Writable 接口中,只要给定 writable 的 DataOutput 和 DataInput,就可以让 Writable 自己实现序列化。
一些问题和思考
•client 是单例的吗 —— 可以理解为是,但其实不一定。可以跟踪 getProxy 的代码,虽然每次都会新建一个代理对象,但底层的 Client 还是和 SocketFactory 对应的。一般默认的,都是使用默认的 SocketFactory, 但如果你设置了 "hadoop.rpc.socket.factory.class.default" ,则会有新的Client与你自定义的 SocketFactory 对应。这时候, client 就不是单例的。
•client 与同一个 server 有几个连接 —— 一个 client与一个 server 只有一个连接,具体可以看生成的代理中,有一个 remoteId, 这个 remoteId 是和 client关联的,client 进行调用的使用,会将此 remoteId 作为一个 connectionId。因此,一般一个 client 是一个连接。
•如果 client 是一个连接,那么对此 client 的调用,不都是串行的吗? —— 看你怎么理解了,在用户层面,也就是 client 调用的方法,是可以并发的。client 底层是使用一个连接来进可能的完成吞吐量。每个 request 和 response 都会有一个 id 关联起来。因此一个连接上可以跑满请求和相应。
•由于网络问题,client调用服务失败后,有重试机制吗 —— 在IPC中没有看到call的重试,需要上层去保证了。但是后面的调用会重新建立连接托福答案
•server 是单例的吗 —— 不一定。如果你只 getServer 一次的话。创建一个 server 的代价是非常重的。通过上图你也可以知道,他需要有一个线程 (Listener)来 accept socket,同时需要一些 Reader线程 来进行 socket 的 read,还有一个 Responder 来进行 socket 的 write,另外,还有若干个 handler线程 来进行业务处理。因此,如果可以减少 server 的个数,就应该减少 server 个数。
•暴露出的服务是否应该是线程安全的 —— 是的,一定要线程安全。server 底层是通过 nio 进行 socket 操作的,因此虽然只有一个线程负责 accept,但是能够支持很多的client连接。这些连接在到达 server 端之后,很有可能就会并发执行同一方法(如果你的业务handler不止一个的话)
•一个 server 要消耗多少线程资源? —— 让我们来算一下,一个 Listener 线程,若干个 Reader 线程(默认1个),若干个 Handler 线程(在 getServer 的时候指定,一般1 - 10个),一个 Responder 线程。如果都按照默认值来计算的话。最少需要 1 + 1 + 1 + 1 = 4 个线程。也许,不应该算多,如果请求量不大的话,这些线程应该都被 blocked 住的。
总结
•Hadoop 的 IPC 是一个比较轻量级别的 RPC
•从代码来看,只支持 java 进程之间的通信
•从没有重试机制、一个Client 只有一个连接的机制来看,适合与应用网络环境较好的场景,适合同机架或者同机房的集群。
P.S. 看了一下 io 包中,其实有个 retry 的 package,里面就是一个重试机制。奇怪的是为啥这个 package 被包含在 io package 中。
Hadoop 中 IPC 的源码分析的更多相关文章
- hadoop的RPC机制 -源码分析
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...
- Hadoop的RPC机制源码分析
分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...
- Spring中Bean命名源码分析
Spring中Bean命名源码分析 一.案例代码 首先是demo的整体结构 其次是各个部分的代码,代码本身比较简单,不是我们关注的重点 配置类 /** * @Author Helius * @Crea ...
- BIZ中model.getSql源码分析
功能:根据model.xml文件中配置的sql,获取对应的动态sql结果. 实例代码:String sql1 = model.getSql(dao.dbMeta());String sql2 = mo ...
- 【朝花夕拾】Android自定义View篇之(六)Android事件分发机制(中)从源码分析事件分发逻辑及经常遇到的一些“诡异”现象
前言 转载请注明,转自[https://www.cnblogs.com/andy-songwei/p/11039252.html]谢谢! 在上一篇文章[[朝花夕拾]Android自定义View篇之(五 ...
- Netty中的ChannelPipeline源码分析
ChannelPipeline在Netty中是用来处理请求的责任链,默认实现是DefaultChannelPipeline,其构造方法如下: private final Channel channel ...
- Springboot中注解@Configuration源码分析
Springboot中注解@Configuration和@Component的区别 1.先说结论,@Configuration注解上面有@Component注解,所以@Component有的功能@Co ...
- Hadoop 三大调度器源码分析及编写自己的调度器
如要转载,请注上作者和出处. 由于能力有限,如有错误,请大家指正. 须知: 我们下载的是hadoop-2.7.3-src 源码. 这个版本默认调度器是Capacity调度器. 在2.0.2-alph ...
- DRF中的APIView源码分析
首先写一个简单的drf接口 from rest_framework.views import APIView from rest_framework.response import Response ...
随机推荐
- java学习面向对象之this
在我们讲构造函数的时候,我们知道,如果同时在java的堆内存当中,同时存在好几个刚进内存,但是又没来得及初始化的同一个类的对象.在这种情况下,那么如何去区分栈内存当中的构造函数是属于那个对象的呢,其实 ...
- C++中自己理解的一些细节哈
对于大牛来说,我写的可能很低级哈,留给自己看,以后遇到的都慢慢补充哈!^^ 1.每一个类定义结束后,不要忘了在类的结束符"}"后面加上一个";"哦! 2.构造函 ...
- ZOJ1025-最长下降子序列
ZOJ1025-Wooden Sticks 加工木棒问题 [问题描述] 现有n根木棒,已知它们的长度和重量.要用一部木工机一根一根地加工这些木棒.该机器在加工过程中需要一定的准备时间用于清洗机器.调整 ...
- php 利用第三方软件进行网页快照
网页快照有很多方法,具体的大家可以百度下.这里我复制一位别人的. 这里我只说下利用第三方软件(Web2Pic_Pro)实现. (1). 下载web2pic_pro软件.下载地址 http://isha ...
- 利用组策略禁用Oultook 各个版本的缓存模式!
由于缓存模式有些自己特性和企业内的管理策略原因,有些用户不希望使用缓存模式来使用Outlook.我们怎么才能禁用缓存模式呢?请参考如下做法: 首先我们从网站上下载Office 相应的管理adm软件,这 ...
- AngularJS $on $broadcast $emit
如何在作用域之间通信呢? 1.创建一个单例服务,然后通过这个服务处理所有子作用域的通信. 2.通过作用域中的事件处理通信.但是这种方法有一些限制:例如,你并不能广泛的将事件传播到所有监控的 ...
- IntelliJ IDEA安装 一些配置
idea 配置修改 本篇 参考https://blog.liyang.io/234.html. 1.修改IDEA菜单的字体大小: 单击File | Project Structure菜单项,打开Pro ...
- [转]Android实现计时与倒计时(限时抢购)的几种方法
在购物网站的促销活动中一般都有倒计时限制购物时间或者折扣的时间,这些都是如何实现的呢? 在一个安卓客户端项目中恰好遇到了类似的问题,一开始使用的是Timer与 TimerTask, 虽然此方法通用,但 ...
- Android Touch系统简介(二):实例详解onInterceptTouchEvent与onTouchEvent的调用过程
上一篇文章主要讲述了Android的TouchEvent的分发过程,其中有两个重要的函数:onInterceptTouchEvent和onTouchEvent,这两个函数可被重装以完成特定的逻辑.on ...
- std::bad_alloc
一个服务器程序,长时间运行报错了. ----------- terminate called after throwing an instance of 'std::bad_alloc' what() ...