Hadoop2源码分析-RPC机制初识

1.概述

  上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础。RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等。若对Hadoop序列化不了解的同学,可以参考《Hadoop2源码分析-序列化篇》。今天这篇博客为大家介绍的内容目录如下:

  • RPC概述
  • 第三方RPC
  • Hadoop V2的RPC简述

  那么,下面开始今天的学习之路。

2.RPC概述

  首先,我们要弄明白,什么是RPC?RPC能用来做什么?

2.1什么是RPC

  RPC的全程是Remote Procedure Call,中文释为远程过程调用。也就是说,调用的过程代码(业务服务代码)并不在调用者本地运行,而是要实现调用着和被调用着之间的连接通信,有同学可能已经发现,这个和C/S模式很像。没错,RPC的基础通信模式是基于C/S进程间相互通信的模式来实现的,它对Client端提供远程接口服务,其RPC原理图如下所示:

2.2RPC的功能

  我们都知道,在过去的编程概念中,过程是由开发人员在本地编译完成的,并且只能局限在本地运行的某一段代码,即主程序和过程程序是一种本地调用关系。因此,这种结构在如今网络飞速发展的情况下已无法适应实际的业务需求。而且,传统过程调用模式无法充分利用网络上其他主机的资源,如CPU,内存等,也无法提高代码在Bean之间的共享,使得资源浪费较大。

  而RPC的出现,正好有效的解决了传统过程中存在的这些不足。通过RPC,我们可以充分利用非共享内存的机器,可以简便的将应用分布在多台机器上,类似集群分布。这样方便的实现过程代码共享,提高系统资源的利用率。减少单个集群的压力,实现负载均衡。

3.第三方RPC

  在学习Hadoop V2的RPC机制之前,我们先来熟悉第三方的RPC机制是如何工作的,下面我以Thrift框架为例子。

  Thrift是一个软件框架,用来进行可扩展且跨语言的服务开发协议。它拥有强大的代码生成引擎,支持C++,Java,Python,PHP,Ruby等编程语言。Thrift允许定义一个简单的定义文件(以.thirft结尾),文件中包含数据类型和服务接口。用以作为输入文件,编译器生成代码用来方便的生成RPC客户端和服务端通信的编程语言。具体Thrift安装过程请参考《Mac OS X 下搭建thrift环境》。

3.1Thrift原理图

  下面给出Thrift的原理图,如下所示:

  下面为大家解释一下上面的原理图,首先,我们编译完thrift定义文件后(这里我使用的是Java语言),会生成对应的Java类文件,该类的Iface接口定义了我们所规范的接口函数。在服务端,实现Iface接口,编写对应函数下的业务逻辑,启动服务。客户端同样需要生成的Java类文件,以供Client端调用相应的接口函数,监听服务端的IP和PORT来获取连接对象。

3.2代码示例

  • Server端代码:
package cn.rpc.main;import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import cn.rpc.service.StatQueryService;
import cn.rpc.service.impl.StatQueryServiceImpl;/*** @Date Mar 23, 2015** @Author dengjie*/
public class StatsServer {private static Logger logger = LoggerFactory.getLogger(StatsServer.class);private final int PORT = 9090;@SuppressWarnings({ "rawtypes", "unchecked" })private void start() {try {TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);final StatQueryService.Processor processor = new StatQueryService.Processor(new StatQueryServiceImpl());THsHaServer.Args arg = new THsHaServer.Args(socket);/** Binary coded format efficient, intensive data transmission, The* use of non blocking mode of transmission, according to the size* of the block, similar to the Java of NIO*/arg.protocolFactory(new TCompactProtocol.Factory());arg.transportFactory(new TFramedTransport.Factory());arg.processorFactory(new TProcessorFactory(processor));TServer server = new THsHaServer(arg);server.serve();} catch (Exception ex) {ex.printStackTrace();}}public static void main(String[] args) {try {logger.info("start thrift server...");StatsServer stats = new StatsServer();stats.start();} catch (Exception ex) {ex.printStackTrace();logger.error(String.format("run thrift server has error,msg is %s", ex.getMessage()));}}}
  • Client端代码:
package cn.rpc.test;import java.util.Map;import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;import cn.rpc.service.StatQueryService;/*** @Date Mar 23, 2015** @Author dengjie* * @Note Test thrift client*/
public class StatsClient {public static final String ADDRESS = "127.0.0.1";public static final int PORT = 9090;public static final int TIMEOUT = 30000;public static void main(String[] args) {if (args.length < 4) {System.out.println("args length must >= 4,current length is " + args.length);System.out.println("<info>****************</info>");System.out.println("ADDRESS,beginDate,endDate,kpiCode,...");System.out.println("<info>****************</info>");return;}TTransport transport = new TFramedTransport(new TSocket(args[0], PORT, TIMEOUT));TProtocol protocol = new TCompactProtocol(transport);StatQueryService.Client client = new StatQueryService.Client(protocol);String beginDate = args[1]; // "20150308"String endDate = args[2]; // "20150312"String kpiCode = args[3]; // "login_times"String userName = "";int areaId = 0;String type = "";String fashion = "";try {transport.open();Map<String, String> map = client.queryConditionDayKPI(beginDate, endDate, kpiCode, userName, areaId, type,fashion);System.out.println(map.toString());} catch (Exception e) {e.printStackTrace();} finally {transport.close();}}}
  • StatQueryService类:

  这个类的代码量太大,暂不贴出。需要的同学请到以下地址下载。

  下载地址:git@gitlab.com:dengjie/Resource.git

  • StatQueryServiceImpl类:

  下面实现其中一个函数的内容,代码如下所示:

package cn.rpc.service.impl;import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.thrift.TException;import cn.rpc.conf.ConfigureAPI;
import cn.rpc.dao.KpiDao;
import cn.rpc.domain.ReportParam;
import cn.rpc.domain.ReportResult;
import cn.rpc.service.StatQueryService;
import cn.rpc.util.MapperFactory;/*** @Date Mar 23, 2015** @Author dengjie*/
public class StatQueryServiceImpl implements StatQueryService.Iface {public Map<String, String> queryDayKPI(String beginDate, String endDate, String kpiCode) throws TException {return null;}public Map<String, String> queryConditionDayKPI(String beginDate, String endDate, String kpiCode, String userName,int areaId, String type, String fashion) throws TException {Map<String, String> res = new HashMap<String, String>();ReportParam param = new ReportParam();param.setBeginDate(beginDate + "");param.setEndDate(endDate + "");param.setKpiCode(kpiCode);param.setUserName(userName == "" ? null : userName);param.setDistrictId(areaId < 0 ? 0 : areaId);param.setProductStyle(fashion == "" ? null : fashion);param.setCustomerProperty(type == "" ? null : type);List<ReportResult> chart = ((KpiDao) MapperFactory.createMapper(KpiDao.class)).getChartAmount(param);Map<String, Integer> title = ((KpiDao) MapperFactory.createMapper(KpiDao.class)).getTitleAmount(param);List<Map<String, Integer>> tableAmount = ((KpiDao) MapperFactory.createMapper(KpiDao.class)).getTableAmount(param);String avgTime = kpiCode.split("_")[0];param.setKpiCode(avgTime + "_avg_time");List<Map<String, Integer>> tableAvgTime = ((KpiDao) MapperFactory.createMapper(KpiDao.class)).getTableAmount(param);res.put(ConfigureAPI.RESMAPKEY.CHART, chart.toString());res.put(ConfigureAPI.RESMAPKEY.TITLE, title.toString());res.put(ConfigureAPI.RESMAPKEY.TABLEAMOUNT, tableAmount.toString());res.put(ConfigureAPI.RESMAPKEY.TABLEAVG, tableAvgTime.toString());return res;}public Map<String, String> queryDetail(String beginDate, String endDate, String userName) throws TException {// TODO Auto-generated method stubreturn null;}}

4.Hadoop V2的RPC简述

  Hadoop V2中的RPC采用的是自己独立开发的协议,其核心内容包含服务端,客户端,交互协议。源码内容都在hadoop-common-project项目的org.apache.hadoop.ipc包下面。

  • VersionedProtocol类:
package org.apache.hadoop.ipc;import java.io.IOException;/*** Superclass of all protocols that use Hadoop RPC.* Subclasses of this interface are also supposed to have* a static final long versionID field.*/
public interface VersionedProtocol {/*** Return protocol version corresponding to protocol interface.* @param protocol The classname of the protocol interface* @param clientVersion The version of the protocol that the client speaks* @return the version that the server will speak* @throws IOException if any IO error occurs*/public long getProtocolVersion(String protocol,long clientVersion) throws IOException;/*** Return protocol version corresponding to protocol interface.* @param protocol The classname of the protocol interface* @param clientVersion The version of the protocol that the client speaks* @param clientMethodsHash the hashcode of client protocol methods* @return the server protocol signature containing its version and*         a list of its supported methods* @see ProtocolSignature#getProtocolSignature(VersionedProtocol, String, *                long, int) for a default implementation*/public ProtocolSignature getProtocolSignature(String protocol, long clientVersion,int clientMethodsHash) throws IOException;
}

  该类中的两个方法一个是作为版本,另一个作为签名用。

  • RPC下的Server类:
 /** An RPC Server. */public abstract static class Server extends org.apache.hadoop.ipc.Server {boolean verbose;static String classNameBase(String className) {String[] names = className.split("\\.", -1);if (names == null || names.length == 0) {return className;}return names[names.length-1];}

  对外提供服务,处理Client端的请求,并返回处理结果。

  至于Client端,监听Server端的IP和PORT,封装请求数据,并接受Response。

5.总结

  这篇博客赘述了RPC的相关内容,让大家先熟悉一下RPC的相关机制和流程,并简述了Hadoop V2的RPC机制,关于Hadoop V2的RPC详细内容会在下一篇博客中给大家分享。这里只是让大家先对Hadoop V2的RPC机制有个初步的认识。

6.结束语

  这篇博客就和大家分享到这里,如果大家在研究学习的过程当中有什么问题,可以加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!

转载于:https://www.cnblogs.com/smartloli/p/4459763.html

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

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

相关文章

贪心 BestCoder Round #39 1001 Delete

题目传送门 1 /*2 贪心水题&#xff1a;找出出现次数>1的次数和res&#xff0c;如果要减去的比res小&#xff0c;那么总的不同的数字tot不会少&#xff1b;3 否则再在tot里减去多余的即为答案4 用set容器也可以做&#xff0c;思路一样5 */6 #include &l…

在ubuntu上搭建开发环境9---Ubuntu删除ibus出现的问题及解决

删除 ibus输入法&#xff1a;  sudo apt-get install ibus 我们会遇到下面的问题 Ubuntu 14.04 系统设置很多选项消失。 其实遇到这个问题的一个最主要的原因是之前执行过卸载ibus输入法的操作&#xff0c;所以为了避免这个问题请不要卸载ibus输入法&#xff0c;大家依然可以…

HDU 3951 (博弈) Coin Game

先考虑两种简单的情况&#xff1a; 如果先手能一次把硬币拿完&#xff0c;即 k > n &#xff0c;那么先手胜如果每次只能拿一个硬币&#xff0c; 即 k 1 &#xff0c;那么如果有奇数个硬币先手胜&#xff0c;如果有偶数个硬币后手胜。剩下的情况就是先手一次拿不完&#xf…

顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

实现顺序表的插入&#xff0c;删除&#xff0c;查找&#xff0c;输出操作在C语言中经常用到。下面小编给大家整理实现代码&#xff0c;一起看下吧代码如下所示&#xff1a;#includeusing namespace std;#define MAXSIZE 15typedef int DataType;typedef struct{DataType data[M…

Android实例-手机安全卫士(三十六)-根据Service是否开启确定CheckBox选中状态

一、目标 1、根据service是否在后台运行情况来确定CheckBox的选中状态&#xff1b; 2、解决"设置中心"的“开启来电号码显示归属地”功能在退出程序再进入时选中状态消失&#xff0c;在任务管理器中关闭“来显”服务时&#xff0c;功能仍为选中状态 二、代码实现 1、…

HTTP - PUT 上传文件/Shell

今天遇到几个PUT上传的点&#xff0c;但是都没利用起来。一怒之下&#xff0c;在自己本地试了一下。步骤如下&#xff1a; 一、环境&#xff1a; 首先&#xff0c;根据 配置Apache服务器支持向目录PUT文件 更新一下httpd.conf文件&#xff0c;重启所有服务。 二、HTTP - PUT PU…

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu&#xff08;替代菜单&#xff09; 举个例子&#xff0c;Activity显示一个文本文件。如果用户想对文本文件进行编辑&#xff0c;Activity不提供编辑能力&#xff0c;但可由其他activity或者其他应用提供。我们将相关信息存储在一个intent中&#xff0c;例…

java实现手机开关机_Android 系统重启与关机:Java 代码实现

粘贴一篇关于权限的文章&#xff1a;最近在做个东西&#xff0c;巧合碰到了sharedUserId 的问题&#xff0c;所以收集了一些资料&#xff0c;存存档备份。安装在设备中的每一个apk文件&#xff0c;Android 给每个 APK 进程分配一个单独的用户空间,其 manifest 中的 userid 就是…

java数据类型的站位_Java 数据类型在实际开发中应用

在前边的文章中&#xff0c;我已经介绍了Java核心的容器IO等&#xff0c;现在我来说一下java中的数据类型。在java中&#xff0c;一切东西皆为对象(这句话意思是java中绝大数情况都用对象)&#xff0c;极少数不是对象的&#xff0c;也存在与之对应的对象(比如基本数据类型存在与…

java amf3_Java AMF3 反序列化漏洞分析

写在前面的话AMF(Action Message Format)是一种二进制序列化格式&#xff0c;之前主要是Flash应用程序在使用这种格式。近期&#xff0c;Code White发现有多个Java AMF库中存在目前&#xff0c;漏洞相关信息已上报至美国CERT(详情请参考美国CERT VU#307983)概述目前&#xff0c…

php修改js内容,js怎样修改html元素的内容?HTML DOM实现修改内容

js怎样修改html元素的内容&#xff1f;本章就给大家介绍在js中利用HTML DOM是怎样修改html元素内容的。有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你们有所帮助。首先我们要了解HTML DOM是什么&#xff1f;HTML DOM的作用是什么&#xff1f;HTML…

java中的删除函数的使用方法,如何用Java删除文件

本文概述有两种删除Java文件的方法&#xff1a;使用File.delete()方法使用File.deleteOnExit()方法Java File.delete()方法在Java中, 我们可以使用File类的File.delete()方法删除文件。 delete()方法删除由抽象路径名表示的文件或目录。如果路径名是目录, 则该目录必须为空才能…

C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现 原文:C#开发微信门户及应用(28)--微信“摇一摇周边”功能的使用和接口的实现”摇一摇周边“是微信提供的一种新的基于位置的连接方式。用户通过“摇一摇”的“周边”页卡&#xff0c;可以与线下商户进行互…

【计算几何】点在多边形内部

问题描述&#xff1a;已知点P(x,y)和多边形Poly&#xff0c;判断点P(x,y)是否在多边形内部。 基本方法&#xff1a;射线法 以点P为端点&#xff0c;向左方作射线L&#xff0c;由于多边形是有界的&#xff0c;所以射线L的左端一定在多边形外部&#xff0c;考虑沿着L从无究远处开…

Hungary(匈牙利算法)——二分图最大匹配

在复习匈牙利算法的时候&#xff0c;发现这么一篇介绍匈牙利算法的文章&#xff0c;非常通俗易懂&#xff0c;所以就借鉴过来了。 复杂度&#xff1a;邻接矩阵&#xff1a;O&#xff08;v^3&#xff09;邻接表&#xff1a;O&#xff08;V*E&#xff09; 附上链接&#xff1a;趣…

白盒测试 语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)...

转自&#xff1a;http://wenda.tianya.cn/wenda/thread?tid758a1e447e62b7df&hlja 白盒测试作为测试人员常用的一种测试方法&#xff0c;越来越受到测试工程师的重视。白盒测试并不是简单的按照代码设计用例&#xff0c;而是需要根据不同的测试需求&#xff0c;结合不同的…

matlab getsplitpic,MATLAB_9-模式识别笔记

1&#xff0c;识别单独字符的&#xff1a;思想&#xff1a;picsize[20,10];创建一个矩阵&#xff0c;将两个照片整理成大小一致的。具体就是使用后面的&#xff1a;aimresize(a,picsize);fontsABCDEFGHNVJXSMQ;建立字符串用于匹配输出(就是识别的功能&#xff01;)下面一个for循…

浅谈android4.0开发之GridLayout布局

作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容&#xff0c;并在此基础上实现了一个简单的计算器布局框架。通过本文&#xff0c;您可以了解到一些android UI开发的新特性&#xff0c;并可以实现相关应用。 在android4.0版本号之…

ThinkPHP---RBAC

一、什么是RBAC 基于角色的访问控制&#xff08;Role-Based Access Control&#xff09;作为传统访问控制&#xff08;自主访问&#xff0c;强制访问&#xff09;的有前景的代替受到广泛的关注。 在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而…

c mysql bulk,MySqlBulkLoader批量上传遇到的问题和解决方法

最近用 MySqlBulkLoader 向MySql数据库批量上传数据遇到了些问题&#xff0c;做下记录问题1&#xff1a;如图原因&#xff1a;版本不合&#xff0c;使用的MySql版本和引用的mysql.data 版本不和解决方案&#xff1a;用nuget将mysql.data升级到对应版本&#xff0c;如果是MySql8…