hadoop java 远程调用_Hadoop之RPC简单使用(远程过程调用协议)

一、RPC概述

RPC是指远程过程调用,也就是说两台不同的服务器(不受操作系统限制),一个应用部署在Linux-A上,一个应用部署在Windows-B或Linux-B上,若A想要调用B上的某个方法method(),由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语意和传达调用的参数。

楼主在接触RPC之前,用得最多的莫过于WebService。WebService可以说是在RPC发展的基础之上。RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service等,又比如现在阿里巴巴的Dubbo,Apache下的hadoop项目。该篇楼主主要以hadoop的RPC为例。

hadoop为何要使用RPC?在HDFS中,我们通过jsp可查看到有DataNode,NameNode,SecondaryNameNode主要进程(楼主只启动了HDFS),我们客户端Client与NameNode通信,NameNode与DataNode的通信,都是在不同进程间,不同系统间的通信。

1f88d149e52fb135ea035dd27d799233.png

二、RPC流程

通过下图,我们简单分析RPC的执行流程:

43abfec4edeb74a1b45973cb1d2797f9.png

首先,要解决通讯的问题,主要是通过在Client和Server之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。

第三,当Client上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到Server,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize),通过寻址和传输将序列化的二进制发送给B服务器。

第四,Server收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。

三、hadoop—RPC的简单使用

定义接口Bizable:

1 packagecn.jon.hadoop.rpc;2

3 public interfaceMyBizable {4 long versionID = 123456;//该字段必须要有,不然会报java.lang.NoSuchFieldException: versionID异常

5 publicString doSomething(String str);6 }

服务端RPCServer实现MyBizable接口并绑定IP地址及端口号:

packagecn.jon.hadoop.rpc;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.ipc.RPC;importorg.apache.hadoop.ipc.Server;public class RPCServer implementsMyBizable {

@OverridepublicString doSomething(String str) {returnstr;

}/***@paramargs

*@throwsException

*@throws

*/

public static void main(String[] args) throwsException {

Server server= new RPC.Builder(newConfiguration())

.setProtocol(MyBizable.class)

.setInstance(newRPCServer())

.setBindAddress("192.168.8.100")

.setPort(8077)

.build();

server.start();

}

}

客户端RPCClient:

packagecn.jon.hadoop.rpc;importjava.net.InetSocketAddress;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.ipc.RPC;public classRPCClient {/***@paramargs

*@throwsException*/

public static void main(String[] args) throwsException {//TODO Auto-generated method stub

MyBizable proxy = RPC.getProxy(MyBizable.class, 123456,new InetSocketAddress("192.168.8.100", 8077) , newConfiguration());

String result= proxy.doSomething("服务端");

System.out.println(result);

RPC.stopProxy(proxy);

}

}

楼主使用Linux作为客户端,Windows作为服务端,我们先把写好的程序打成jar,上传到Linux:

8439ff0f961f5713f7e0005adf0c90de.png

然后,我们在windows端启动RPCServer:

801d287bbff3d51f2bd9d34fb40eb61a.png

服务端启动好后,我们在Linux中执行RPCClient.jar:

java -jar RPCClient.jar

执行结果可以看到输出了“服务端”(楼主Linux时间没有调准确):

4f23186f2edf98317498001184c72cdc.png

下篇楼主将对HDFS原理进行探讨,到时会更加详细的讨论RPC。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值