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)--远程过程调用,它是一种通过网络从远程计算 ...
随机推荐
- 「CodePlus 2017 12 月赛」白金元首与独舞
description 题面 data range \[ 1 \leq T \leq 10, 1 \leq n, m \leq 200 , 0 \leq k \leq \min(nm, 300)\] ...
- BZOJ1901:Zju2112 Dynamic Rankings——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序 ...
- 谈谈CSS中em与px的差异
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...
- 使用springcloud的feign调用服务时出现的错误:关于实体转换成json错误的介绍
http://blog.csdn.net/java_huashan/article/details/46428971 原因:实体中没有添加无参的构造函数 fastjson的解释: http://www ...
- 自己做的jquery的autocomplete的一个例子
转载自:http://dada-fangfang.iteye.com/blog/695464 首先下载jquery.js和jquery.autocomplete.js 注意:jquery.js 要放在 ...
- windows版本redis下载安装
官方网站:http://redis.io/ 官方下载:http://redis.io/download 可以根据需要下载不同版本 在官方下载网页中有一个window版本的说明,说redis官方没有wi ...
- 【BZOJ2287】消失之物 [分治][DP]
消失之物 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description ftiasch 有 N 个物品, ...
- Codeforces Round #411 (Div. 2) A-F
比赛时候切了A-E,fst了A Standings第一页只有三个人挂了A题,而我就是其中之一,真™开心啊蛤蛤蛤 A. Fake NP time limit per test 1 second memo ...
- 【BZOJ】1607: [Usaco2008 Dec]Patting Heads 轻拍牛头
[算法]模拟 #include<cstdio> #include<algorithm> using namespace std; ,maxm=; int a[maxn],A[m ...
- RabbitMq related
# RabbitMq related Integration of message queuing tools with systems is the usual solution to handle ...