Hadoop 中RPC使用

Stella981
• 阅读 617

导入包:

Hadoop 中RPC使用

理解:rpc是一种“远程过程调用协议”

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

具体使用:方面可以理解为,例如一个公司的后台数据支持此公司多个平台的使用,如果每个平台都写一套调用逻辑,如果后台逻辑做调整则每个平台都需要涉及;如果把各个平台访问后端的操作提前出来,放在服务端,来提供服务,则各个平台都可以使用;并且对平台开发也隐藏了后端。

开发注意:

rpc服务端和rpc客户端的通信协议接口。服务端和客户端都必须有,且路径一致

实例如下:

Hadoop 中RPC使用

一:建两个项目:

客户端项目:democlient

服务器端项目:demonamenode

在服务器端和客户端开发都需要建相同的接口:网络通信双方都要遵循的协议

1>开发路径一致;--hadoop.rpctest

2>名称一致。       --DemoNamenodeProtocol.java

服务器端需要一个协议的实现类:例如DemoNamenodeImpl.java;

服务器端还需要把协议的实现发布到RPC服务上

这里测试实现:ServerPublisher.java

二:服务端项目实现后,需要 打包  Runnable JAR,并上传到服务器上,

发布:  java -jar   ***.jar

三:服务器端发布后,则客户端可以调用此服务。

代码实现附上:

---------------------------------------------------------------------start
自定义协议接口:DemoNamenodeProtocol

package hadoop.rpctest;
/*
 * 接口定义网络通信双方共同遵循的约定或协议
 */
public interface DemoNamenodeProtocol {
       
       //定义通信上方一致的版本号
       public static final long versionID = 1L;
//定义通信双方可以调用的方法
       public String getMetaData(String filePath);
}

--------------------------------------------------------------end

---------------------------------------------------------------------start
服务器端 实现类:DemoNamenodeImpl

package hadoop.rpctest;
public class DemoNamenodeImpl implements DemoNamenodeProtocol{
       public String getMetaData(String filePath) {
              return filePath + "-----我给你开玩笑呢" ;
       }
}

--------------------------------------------------------------end

---------------------------------------------------------------------start
服务发布类:ServerPublisher

package hadoop.rpctest;
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服务
public class ServerPublisher {
    public static void main(String[] args) throws HadoopIllegalArgumentException, IOException {
        // TODO Auto-generated method stub
        //获取一个创建rpc服务的builder
        Builder builder = new RPC.Builder(new Configuration());
        //通过Builder与我名定义的业务功能建立关系
        //设置服务端服务实例实现的接口--及通信双方功能遵循的协议
        builder.setProtocol(DemoNamenodeProtocol.class);
        //设置提供业务服务的具体实例对象
        builder.setInstance(new DemoNamenodeImpl());
        
        //设置服务进程所绑定的地址信息
        builder.setBindAddress("hadoop02");
        //设置服务进程的端口
        builder.setPort(10000);
        
        //用builder来创建一个服务  (socket服务)
        Server server = builder.build();
        
        //启动服务,这样就可以被客户端调用了
        server.start();
    }
}

--------------------------------------------------------------end

客户端访问测试:DemoClient

package clienttest;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import hadoop.rpctest.DemoNamenodeProtocol;
public class DemoClient {
public static void main(String[] args) throws IOException {
    //客户端访问rpc服务器代码实现
        InetSocketAddress addr = new InetSocketAddress("hadoop02",10000);
        DemoNamenodeProtocol demoNamenodeImpl = RPC.getProxy(DemoNamenodeProtocol.class, 1L, addr, new Configuration());
        String MetaData = demoNamenodeImpl.getMetaData("获取RPC服务:hello world");
        System.out.println(MetaData);
}
}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
ES6 新增的数组的方法
给定一个数组letlist\//wu:武力zhi:智力{id:1,name:'张飞',wu:97,zhi:10},{id:2,name:'诸葛亮',wu:55,zhi:99},{id:3,name:'赵云',wu:97,zhi:66},{id:4,na
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
6个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这