通信协议 远程调用RPC

news/2024/5/20 4:09:16 标签: 大数据, hdfs
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.niftyadmin.cn/n/5248779.html

相关文章

ZooKeeper学习二

ZooKeeper的java客户端 zk自带zkclient及Apache开源的Curator Chubby是google的,完全实现paxos算法,不开源,ZooKeeper是chubby的开源实现,使用zab协议,paxos算法的变种。 ZooKeeper常用命令: Is get set …

【算法每日一练]-结构优化(保姆级教程 篇6 分块,倍增)#HDU4417超级马里奥 #poj2019玉米田 #POJ3368频繁值

今天知识点: 区间统计不超过h的值; 查询二维区间的极差; 求区间最频繁数; 目录 HDU4417:超级马里奥 思路: poj2019:玉米田 思路: POJ3368:频繁值 思路: HDU4417&#xff1…

Navicat 技术指引 | 适用于 GaussDB 分布式的调试器

Navicat Premium(16.3.3 Windows 版或以上)正式支持 GaussDB 分布式数据库。GaussDB 分布式模式更适合对系统可用性和数据处理能力要求较高的场景。Navicat 工具不仅提供可视化数据查看和编辑功能,还提供强大的高阶功能(如模型、结…

iview Table实现跨页勾选记忆功能以及利用ES6的Map数据结构实现根据id进行对象数组的去重

因为iview Table组件的勾选是选中当前页的所有数据,当我们切到别的页面时,会发送请求给后端,这个时候就会刷新我们之前页码已经选中的数据。现在有个需求就是,在我们选择不同页码的数据勾选中之后,实现跨页勾选记忆功能,就是说已经打钩了的数据,不管切到哪一页它都是打钩…

Qt内存管理、UI编辑器、客制化组件、弹出对话框、常用部件类

头文件的小技巧 #include <QtWidgets> // 在自动生成的 .h 里面加上此句 适用条件&#xff1a; QT 的内存管理 当父窗体被关闭时&#xff0c;子部件的内存会自动释放。 对象树是一种管理对象生命周期的机制。当一个对象被添加到另一个对象的子对象列表中时&#xff0…

京东运营数据分析:10月京东奶粉行业销售数据分析

近年来&#xff0c;随着出生人口红利逐渐消逝&#xff0c;婴幼儿奶粉竞争进入红海时代&#xff0c;产品逐渐过剩。在这种情况下&#xff0c;我国奶粉市场进入调整阶段&#xff0c;企业开始将目光投向奶粉的品类细分领域&#xff0c;如有机奶粉、羊奶粉、特殊配方奶粉、成人奶粉…

[Java面试——数据结构和算法]

数据结构和算法 7.1 数据结构基础 如何理解基础的数据结构&#xff1f; 避免孤立的学习知识点&#xff0c;要关联学习。比如实际应用当中&#xff0c;我们经常使用的是查找&#xff0c;排序以及增删改&#xff0c;这在我们的各种管理系统、数据库系统、操作系统等当中&#xf…

linux Ubuntu下,第一个C++程序访问数据库,遇到的问题,及解决办法

在ubuntu下安装了mysql&#xff0c;mysql以后&#xff0c;编写了第一个访问数据库的程序&#xff1a; #include <iostream> #include <string> #include <cstdlib> //for system #include <mysql.h>using namespace std;int main() {mysqlpp::Connect…