通信协议 远程调用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" 的目录。客户端在控制台上输出了一条消息,指示它是客户端。

相关推荐
viperrrrrrrrrr77 分钟前
大数据学习(40)- Flink执行流
大数据·学习·flink
Ase5gqe9 小时前
大数据-259 离线数仓 - Griffin架构 修改配置 pom.xml sparkProperties 编译启动
xml·大数据·架构
史嘉庆9 小时前
Pandas 数据分析(二)【股票数据】
大数据·数据分析·pandas
唯余木叶下弦声10 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
重生之Java再爱我一次11 小时前
Hadoop集群搭建
大数据·hadoop·分布式
豪越大豪13 小时前
2024年智慧消防一体化安全管控年度回顾与2025年预测
大数据·科技·运维开发
互联网资讯13 小时前
详解共享WiFi小程序怎么弄!
大数据·运维·网络·人工智能·小程序·生活
AI2AGI14 小时前
天天AI-20250121:全面解读 AI 实践课程:动手学大模型(含PDF课件)
大数据·人工智能·百度·ai·文心一言
贾贾202315 小时前
配电自动化中的进线监控技术
大数据·运维·网络·自动化·能源·制造·信息与通信