hadoop-Rpc使用实例
代码:https://github.com/xufeng79x/hadoop-common-rpc-demo
1. 简介
hadoop中使用rpc机制来进行分布式进程间的通信,被封装进了hadoop-common包中。
hadoop-common包是独立的公用包,我们可以在自己的程序中单独使用,本文介绍如何使用此包中的rpc模块。
2. 依赖包范围
在eclipse中创建工程后需要将如下hadoop-common包的jar文件设置到项目中。
hadoop-common本身的jar和其依赖的位于lib目录下的所有jar

3. 创建服务端
1.接口定义
接口是服务端暴露给客户端的内容,服务端需要实现此接口,而客户端则使用接口去取得代理对象。
/**
* rpc接口
* @author apple
*
*/
public interface UserLoginServiceProtocol {
// 版本号确定,一次确定客户端和服务端是否版本相同,对于不同的版本间的调用做限制
public static final long versionID = 1L; // 接口定义
public String login(String username,String password); }
2.接口实现
/**
* 接口实现
* 客户端会使用接口来取得代理对象,服务端需要将接口实现。
* @author apple
*
*/
public class UserLoginServiceImple implements UserLoginServiceProtocol { /**
* 接口实现
*/
@Override
public String login(String username, String password) {
return username + " is logged in!";
} }
3. RPC服务器信息设定
import java.io.IOException; import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Builder;
import org.apache.hadoop.ipc.RPC.Server; /**
* 服务端RPC服务器启动
*
* 需要指定当前服务器的ip(hostname)和端口信息
* 后续客户端会和此地址进行通信
* @author apple
*
*/
public class RpcRunner { public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
// 1. 创建Rpc服务端构造器
Builder builder = new RPC.Builder(new Configuration()); // 2. 设定服务器信息
// 指定地址
builder.setBindAddress("applexf.local")
// 指定端口
.setPort()
// 指定接口实现类
.setInstance(new UserLoginServiceImple())
// 指定接口
.setProtocol(UserLoginServiceProtocol.class); // 3. 构造服务
Server server = builder.build();
// 4. 启动服务
server.start(); }
}
4. 启动rpc服务器
我们会看到起进程和进行对应的port都启动和监听起来:
applexf:~ apple$ lsof -n -P| grep :
java apple 77u IPv6 0x55052a512ee052dd 0t0 TCP 192.168.10.136: (LISTEN)
applexf:~ apple$ jps Jps
RpcRunner
applexf:~ apple$
4. 客户端调用设定
1. 需要将服务端定义的接口文件取得后放入工程
2. 调用过程
/**
* RPC调用过程
* @author apple
*
*/
public class UserLoginController { public static void main(String[] args) throws IOException {
// 根据接口来取得服务测的代理对象实例
UserLoginServiceProtocol userloginService
// 指明需要哪个接口的代理对象
= RPC.getProxy(UserLoginServiceProtocol.class
// 指明调用接口的哪个rpc版本(基本上无用处,版本已经在接口文件中指明了)
, 1L
// 设定服务器的链接地址
, new InetSocketAddress("applexf.local", )
, new Configuration());
// 调用远程服务犹如在本地调用一样,这就是所谓的远程过程调用
String resp = userloginService.login("xufeng", "password"); // 输出结果值
System.out.println(resp);
} }
3.输入确认:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
xufeng is logged in!
5. 版本号的作用
当我们修改任意一方的接口中的版本号使其客户端和服务端不一致的情况下回发生什么呢?
1.修改服务端,其实版本有1L--->2L
重启服务端,启动客户端后:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy4.login(Unknown Source)
at UserLoginController.main(UserLoginController.java:)
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RPC$VersionMismatch): Protocol UserLoginServiceProtocol version mismatch. (client = 1, server = 2)
at org.apache.hadoop.ipc.WritableRpcEngine$Server$WritableRpcInvoker.call(WritableRpcEngine.java:)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:) at org.apache.hadoop.ipc.Client.call(Client.java:)
at org.apache.hadoop.ipc.Client.call(Client.java:)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:)
... more
2.当修改客户端的接口版本号1L---->3L
再次启动客户端后:
log4j:WARN No appenders could be found for logger (org.apache.hadoop.metrics2.lib.MutableMetricsFactory).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy4.login(Unknown Source)
at UserLoginController.main(UserLoginController.java:)
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.ipc.RPC$VersionMismatch): Protocol UserLoginServiceProtocol version mismatch. (client = 3, server = 2)
at org.apache.hadoop.ipc.WritableRpcEngine$Server$WritableRpcInvoker.call(WritableRpcEngine.java:)
at org.apache.hadoop.ipc.RPC$Server.call(RPC.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at org.apache.hadoop.ipc.Server$Handler$.run(Server.java:)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:)
at org.apache.hadoop.ipc.Server$Handler.run(Server.java:) at org.apache.hadoop.ipc.Client.call(Client.java:)
at org.apache.hadoop.ipc.Client.call(Client.java:)
at org.apache.hadoop.ipc.WritableRpcEngine$Invoker.invoke(WritableRpcEngine.java:)
... more
结论:
以上可以看到当版本号不一致的时候回发生version mismatch错误。检查版本号的左右就是怕客户端使用的jar版本和服务端不一致,为了避免意想不到的错误而采取的一种事前检查机制。
hadoop-Rpc使用实例的更多相关文章
- Hadoop RPC简单实例
1.导入Hadoop-Common-2.6.0.jar导入工程,里面的IPC实现RPC需要的文件. 2.服务器端 (1)服务接口 package com.neu.rpc.server; /** * ...
- 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo
hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...
- Hadoop RPC实例
本文发表于本人博客. 上次写了个hadoop伪分布环境搭建的笔记了,今天来说下hadoop分布式构建的基础RPC,这个RPC在提交Job任务的时候底层就是创建了RPC来实现远程过程调用服务端. 我们首 ...
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- hadoop rpc基础
第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...
- Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- 【Hadoop代码笔记】通过JobClient对Jobtracker的调用详细了解Hadoop RPC
Hadoop的各个服务间,客户端和服务间的交互采用RPC方式.关于这种机制介绍的资源很多,也不难理解,这里不做背景介绍.只是尝试从Jobclient向JobTracker提交作业这个最简单的客户端服务 ...
- Hadoop RPC源码阅读-客户端
Hadoop版本Hadoop2.6 RPC主要分为3个部分:(1)交互协议(2)客户端(3)服务端 (2)客户端 先展示RPC客户端实例代码 public class LoginController ...
- 每天收获一点点------Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop RPC
hadoop rpc机制 && 将avro引入hadoop rpc机制初探 1 RPC RPC(Remote Procedure Call)--远程过程调用,它是一种通过网络从远程计算 ...
随机推荐
- MySQL数据库引擎MyISAM与InnoDB的区别
1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...
- POJ3648:Wedding——题解(配2-SAT简易讲解)
http://poj.org/problem?id=3648 (在家,而且因为2-SAT写的不明不白的,所以这篇详细写) 题目大意: 有一对新人结婚,邀请了n-1 对夫妇去参加婚礼.婚礼上所有人要坐在 ...
- BZOJ5343 & 洛谷4602 & LOJ2555:[CTSC2018]混合果汁——题解
https://www.luogu.org/problemnew/show/P4602 https://loj.ac/problem/2555 https://www.lydsy.com/JudgeO ...
- redux样板代码简化写法
直接使用redux,要写很多样板代码,大量的actiontype,actionCreator.一个异步的方法要写三个actiontype,三个actionCreator,十分繁琐.下面是本人使用的一种 ...
- PowerDesigner 快捷键
一般快捷键 快捷键 说明 F4 打开检查模型窗口,检查模型 F5 如果图窗口内的图改变过大小,恢复为原有大小即正常大小 F6 放大图窗口内的图 F7 缩小图窗口内的图 F8 在图窗口内中查看全部图内容 ...
- tinyxml源码解析(上)
转载于:http://www.cnblogs.com/marchtea/archive/2012/11/09/2762669.html 前言: 前段时间做功能可行性的时候简单的使用了tinyxml.在 ...
- Codeforces Round #329 (Div. 2)A 字符串处理
A. 2Char time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)
D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...
- 前端为什么要对url进行编码
为什么要对url进行编码 url有规范,在参数值中出现&字符会截断参数 url中文的问题,编码客转换为英文 也是第一种情况,url中有个参数值是url,传输的时候会出现错误 例1 有这样一串参 ...
- [LeetCode] 5. Longest Palindromic Substring ☆☆☆☆
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...