设为首页 收藏本站
查看: 822|回复: 0

[经验分享] Hadoop之RPC简单使用(远程过程调用协议)

[复制链接]

尚未签到

发表于 2018-10-29 08:55:31 | 显示全部楼层 |阅读模式
一、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的通信,都是在不同进程间,不同系统间的通信。

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

  首先,要解决通讯的问题,主要是通过在Client和Server之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
  第二,要解决寻址的问题,也就是说,A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。
  第三,当Client上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到Server,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize),通过寻址和传输将序列化的二进制发送给B服务器。
  第四,Server收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达方式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。
  三、hadoop—RPC的简单使用
  定义接口Bizable:
1 package cn.jon.hadoop.rpc;2 3 public interface MyBizable {4     long versionID = 123456;//该字段必须要有,不然会报java.lang.NoSuchFieldException: versionID异常5     public String doSomething(String str);6 }  服务端RPCServer实现MyBizable接口并绑定IP地址及端口号:

package cn.jon.hadoop.rpc;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import org.apache.hadoop.ipc.Server;public class RPCServer implements MyBizable {  

  
    @Override    public String doSomething(String str) {        return str;
  
    }    /**
  
     * @param args
  
     * @throws Exception
  
     * @throws
  
     */
  
    public static void main(String[] args) throws  Exception {
  
        Server server = new RPC.Builder(new Configuration())
  
        .setProtocol(MyBizable.class)
  
        .setInstance(new RPCServer())
  
        .setBindAddress("192.168.8.100")
  
        .setPort(8077)
  
        .build();
  
        server.start();
  
    }
  

  
}

  客户端RPCClient:

package cn.jon.hadoop.rpc;import java.net.InetSocketAddress;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;public class RPCClient {    /**  
     * @param args
  
     * @throws Exception
  
     */
  
    public static void main(String[] args) throws Exception {        // TODO Auto-generated method stub
  
        MyBizable proxy = RPC.getProxy(MyBizable.class, 123456,new InetSocketAddress("192.168.8.100", 8077) , new Configuration());
  
        String result = proxy.doSomething("服务端");
  
        System.out.println(result);
  
        RPC.stopProxy(proxy);
  
    }
  

  
}

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

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

  服务端启动好后,我们在Linux中执行RPCClient.jar:  
java -jar RPCClient.jar  执行结果可以看到输出了“服务端”(楼主Linux时间没有调准确):




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-627774-1-1.html 上篇帖子: hadoop的安装与配置 下篇帖子: Spark应用开发之一:Hadoop分析大数据
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表