代码: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使用实例的更多相关文章

  1. Hadoop RPC简单实例

    1.导入Hadoop-Common-2.6.0.jar导入工程,里面的IPC实现RPC需要的文件. 2.服务器端  (1)服务接口 package com.neu.rpc.server; /** * ...

  2. 3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

    hadoop中的RPC框架实现机制 RPC是Remotr Process Call, 进程间的远程过程调用,不是在一个jvm里. 即,Controller拿不到Service的实例对象. hadoop ...

  3. Hadoop RPC实例

    本文发表于本人博客. 上次写了个hadoop伪分布环境搭建的笔记了,今天来说下hadoop分布式构建的基础RPC,这个RPC在提交Job任务的时候底层就是创建了RPC来实现远程过程调用服务端. 我们首 ...

  4. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  5. hadoop rpc基础

    第一部分: hadoop rpc基础 RPC,远程程序调用,分布式计算中C/S模型的一个应用实例. 同其他RPC框架一样,Hadoop分为四个部分: 序列化层:支持多种框架实现序列化与反序列化 函数调 ...

  6. Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  7. 【Hadoop代码笔记】通过JobClient对Jobtracker的调用详细了解Hadoop RPC

    Hadoop的各个服务间,客户端和服务间的交互采用RPC方式.关于这种机制介绍的资源很多,也不难理解,这里不做背景介绍.只是尝试从Jobclient向JobTracker提交作业这个最简单的客户端服务 ...

  8. Hadoop RPC源码阅读-客户端

    Hadoop版本Hadoop2.6 RPC主要分为3个部分:(1)交互协议(2)客户端(3)服务端 (2)客户端 先展示RPC客户端实例代码 public class LoginController ...

  9. 每天收获一点点------Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  10. Hadoop RPC

    hadoop rpc机制 && 将avro引入hadoop rpc机制初探 1 RPC RPC(Remote Procedure Call)--远程过程调用,它是一种通过网络从远程计算 ...

随机推荐

  1. 2016 China Final H - Great Cells

    /************************************************************************* > File Name: H.cpp > ...

  2. BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...

  3. [bzoj] 3673 3674 可持久化并查集 || 可持久化数组

    原题 加强版 题意: 可持久化并查集模板-- 题解: 用可持久化线段树维护一个可持久化数组,来记录每一次操作后的状态. 不能用路径压缩,但是要按置合并,使复杂度保证在O(log) #include&l ...

  4. NOIP系列

    NOIP2015运输计划 唉 真是 这题 卡死我了 tarjan离线lca复杂度O(n) 最后各种卡常,多交几遍才A(洛谷104ms) %%%zk学长609ms 注意二分的时候左边界要定成0 根据题意 ...

  5. 细谈select函数(C语言)

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  6. bzoj 3580 冒泡排序 乱搞+思维

    冒泡排序 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 243  Solved: 108[Submit][Status][Discuss] Descr ...

  7. OpecnCV训练分类器详细整理

    本文主要是对下面网址博客中内容的实例操作: http://blog.csdn.net/byxdaz/article/details/4907211 在上述博客中,详细的讲述了OpenCV训练分类器的做 ...

  8. 由一篇博文做出的代码,不用Math.round()如何实现其功能

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. [洛谷P3338] [ZJOI2014]力

    洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...

  10. C11简洁之道:tupe元祖

    tuple元组是一个固定大小不同类型的值的集合,是泛化的std::pair.我们也可以把它当作一个通用的结构体来使用,不需要创建结构体有获取结构体特征,在某些情况可以取代结构体,使程序更简洁.直观. ...