代码: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. NetScaler SNIPs Bound To An Interface Without A VLAN

    NetScaler SNIPs Bound To An Interface Without A VLAN https://www.citrix.com/blogs/2014/04/09/work-yo ...

  2. Oracle 验证A表的2个字段组合不在B表2个字段组合里的数据

    select id, name from TAB_A t where not exists (select 1 from TAB_B t1 where t.id = t1.id and t.name ...

  3. STL使用记录

    1,map 对map实在不熟...赶紧记录一下用法吧. 后来再发现新的用法再补充吧 定义: map<int, int> m; 其中的int可以为自定义的任何类型. m[key值类型的变量] ...

  4. UVA.10305 Maximum Product (暴力)

    UVA.10305 Maximum Product (暴力) 题意分析 直接枚举起点和重点,然后算出来存到数组里面,sort然后取最大值即可. 代码总览 #include <iostream&g ...

  5. float,absolute脱离文档流的总结

    dom元素脱离文档流,有如下几种方式: 1. float 脱离文档流,其他dom元素无视他,在其下方布局,但是其未脱离文本流,其他元素的文本会认为他存在,环绕他布局.父元素会无视他,因此无法获取其高度 ...

  6. Flex 布局教程:实例篇【转】

    Flex 布局教程:实例篇   作者: 阮一峰 日期: 2015年7月14日 原文:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html ...

  7. angularJS 条件查询 品优购条件查询品牌(条件查询和列表展示公用方法解决思路 及 post请求混合参数提交方式)

    Brand.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...

  8. CentOS安装pip

    环境 操作系统:CentOS 6.7 32-bit Python:2.6.6 安装 先安装setuptools和wget yum -y install wget wget https://pypi.p ...

  9. 【题解】ZJOI2009 假期的宿舍 网络流 最大流

    好久没有来写博客啦,来水一发. 网络流建模首先很容易想到,如果一个人能睡一张床,那么在这个人和这张床之间连接一条容量为1的边从s向每个需要住宿的人连容量为1的边,表示这个人需要住宿从每张床向t连容量为 ...

  10. JS常见的算法

    原文链接:Jack Pu's Blog 虽说我们很多时候前端很少有机会接触到算法.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂的问题,这些基础知识的积累可 ...