当前位置: 首页 > news >正文

通信协议 远程调用RPC

1.通讯协议
所有的HDFS通讯协议都是建立在TCP/IP协议之上。
客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交
互。而Datanode使用DatanodeProtocol协议与Namenode交互。
一个远程过程调用(RPC)模型被抽象出来封装ClientProtocol和Datanodeprotocol协议。在
设计上,Namenode不会主动发起RPC,而是响应来自客户端或 Datanode 的RPC请求。
编写RPC
package com.nefu.rpc;public interface RPCprotocol {long versionID = 666;void mkdirs(String path);
}

这段代码定义了一个 Java 接口(interface)叫做 RPCprotocol,它主要用于描述一个远程过程调用(RPC)的协议。让我们逐行解释:

1.接口定义:


2.RPCprotocol 是一个接口,接口在 Java 中是一种规范,用于描述一组方法的集合,而不提供这些方法的具体实现。其他类可以实现这个接口,并提供方法的具体实现。


3.常量 versionID:


4.versionID 是一个接口中的常量,其值为 666。这个常量被用于标识协议的版本号。在某些情况下,这样的版本号可以用来确保通信的双方使用相同或兼容的协议版本。


5.抽象方法 mkdirs:


6.接口定义了一个抽象方法 mkdirs,该方法没有具体的实现。这个方法的目的是用于创建目录,接受一个字符串类型的参数 path,表示要创建的目录路径。

综合起来,这个接口定义了一个协议,规定了远程调用的版本号以及远程调用的方法。实际的使用场景需要有一个实现了这个接口的类,该类提供了 mkdirs 方法的具体实现。其他系统的组件可以通过这个接口调用 mkdirs 方法,实现在远程系统上创建目录的功能。例如,可以有一个服务器实现这个接口,并在客户端通过远程调用执行相应的操作。

package com.nefu.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.Server;import java.io.IOException;public class NamenodeServer implements RPCprotocol{public void mkdirs(String path){System.out.println("在服务端,创建路径" + path);}public static void main(String[] args) throws IOException{Server server = new RPC.Builder(new Configuration()) .setBindAddress("localhost") .setPort(9999) .setProtocol(RPCprotocol.class) .setInstance(new NamenodeServer()) .build();System.out.println("服务器开始工作 "); server.start(); }}

这段代码实现了一个简单的Hadoop RPC服务。让我们逐行解释:

1.导包语句:


2.import org.apache.hadoop.conf.Configuration;:导入Hadoop配置相关的类。
3.import org.apache.hadoop.ipc.RPC;:导入Hadoop IPC(Inter-Process Communication)相关的类。
4.import org.apache.hadoop.ipc.Server;:导入Hadoop IPC中的服务器类。
5.import java.io.IOException;:导入处理输入输出异常的类。


6.类定义:


7.public class NamenodeServer implements RPCprotocol:定义了一个名为 NamenodeServer 的类,该类实现了之前提到的 RPCprotocol 接口。


8.mkdirs 方法实现:


9.public void mkdirs(String path):实现了 RPCprotocol 接口中的 mkdirs 方法。在这个具体的实现中,它简单地在服务器端打印一条消息,指示在服务端创建了指定路径的目录。


10.main 方法:


11.public static void main(String[] args) throws IOException:主方法,是程序的入口点。
12.Server server = new RPC.Builder(new Configuration())...:创建了一个 Server 实例,通过 RPC.Builder 构建。指定了服务器的配置、绑定地址(localhost)、端口号(9999)、使用的协议(RPCprotocol.class),以及服务器实例(NamenodeServer 的一个实例)。
13.System.out.println("服务器开始工作 ");:打印一条消息,指示服务器开始工作。
14.server.start();:启动服务器,开始监听指定的端口,等待客户端的远程调用请求。

综合起来,这段代码实现了一个简单的Hadoop RPC服务器,该服务器监听在本地地址(localhost)的9999端口上,并实现了RPCprotocol接口中的mkdirs方法。当客户端通过RPC调用mkdirs方法时,服务器会在控制台上打印一条消息,指示在服务端创建了指定路径的目录。

package com.nefu.rpc;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;import java.io.IOException;
import java.net.InetSocketAddress;public class HdfsClient {public static void main(String[] args) throws IOException {RPCprotocol client = RPC.getProxy(RPCprotocol.class, RPCprotocol.versionID, new InetSocketAddress("localhost", 9999), new Configuration());System.out.println("我是客户端");client.mkdirs("/input");}
}

这段代码实现了一个简单的Hadoop RPC客户端。让我们逐行解释:

1.导包语句:


2.import org.apache.hadoop.conf.Configuration;:导入Hadoop配置相关的类。
3.import org.apache.hadoop.ipc.RPC;:导入Hadoop IPC(Inter-Process Communication)相关的类。
4.import java.io.IOException;:导入处理输入输出异常的类。
5.import java.net.InetSocketAddress;:导入处理网络地址的类。


6.类定义:


7.public class HdfsClient:定义了一个名为 HdfsClient 的类。


8.main 方法实现:


9.public static void main(String[] args) throws IOException:主方法,是程序的入口点。
10.RPCprotocol client = RPC.getProxy(RPCprotocol.class, RPCprotocol.versionID, new InetSocketAddress("localhost", 9999), new Configuration());:通过 RPC.getProxy 方法创建了一个代理对象 client,该对象实现了 RPCprotocol 接口。这个代理对象将用于向服务器发起RPC调用。
11.System.out.println("我是客户端");:打印一条消息,指示这是客户端的输出。
12.client.mkdirs("/input");:通过代理对象调用远程服务器的 mkdirs 方法,传递了一个路径参数 "/input"。

综合起来,这段代码实现了一个Hadoop RPC客户端,该客户端连接到在本地地址(localhost)的9999端口上运行的RPC服务器,并通过RPC调用向服务器发送了一个 mkdirs 请求,创建了名为 "/input" 的目录。客户端在控制台上输出了一条消息,指示它是客户端。

http://www.lryc.cn/news/255814.html

相关文章:

  • 决策树 算法原理
  • Git全局设置命令---设置提交人邮箱
  • 3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案
  • 物联网+AI智慧工地云平台源码(SaaS模式)
  • python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。
  • 卷积之后通道数为什么变了
  • ubuntu18.04安装opencv-4.5.5+opencv_contrib-4.5.5
  • 实验3.5 路由器的单臂路由配置
  • nodejs微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django
  • Windows server flask
  • maven工程的pom.xml文件中增加了依赖,但偶尔没有下载到本地仓库
  • Navicat 技术指引 | 适用于 GaussDB 分布式的用户/权限功能
  • 基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期神经网络的新鲜度等级预测
  • 麒麟系统系统添加路由
  • 考研真题数据结构
  • python爬取 HTTP_2 网站超时问题的解决方案
  • 学会用bash在linux写脚本 (二)
  • QML中Dialog获取close与open状态
  • 用C语言实现队列的顺序结构
  • Vue 子路由页面发消息给主路由页面 ,实现主页面显示子页面的信息
  • AR技术详解
  • h5或uniapp或微信小程序,实现左上角返回到指定页面,侧滑左滑返回指定页面,安卓物理返回键返沪指定页面解决思路的思考
  • 轻量封装WebGPU渲染系统示例<43>- PBR材质与阴影实(源码)
  • macOS Big Sur/Mac电脑安装vscode显示您没有权限来打开应用程序‘Visual Studio Code‘ 请联系您的电脑或网络管理员问题修复
  • jsp 如何批量改随机人名
  • android项目实战之编辑器集成
  • JAVA程序如何打jar和war问题解决
  • Microsoft 365 Copilot正式上线,如何稳定访问体验?
  • 【安卓】安卓xTS之Media模块 学习笔记(3) VTS测试
  • Go实现http同步文件操作 - 增删改查