当前位置: 首页 > 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" 的目录。客户端在控制台上输出了一条消息,指示它是客户端。

相关文章:

通信协议 远程调用RPC

1.通讯协议 所有的HDFS通讯协议都是建立在TCP/IP协议之上。 客户端通过一个可配置的TCP端口连接到Namenode,通过ClientProtocol协议与Namenode交 互。而Datanode使用DatanodeProtocol协议与Namenode交互。 一个远程过程调用(RPC)模型被抽象出来封装ClientProtoc…...

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构,通过做出一系列决策 (选择) 来对数据进行划分,这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…...

Git全局设置命令---设置提交人邮箱

介绍 使用git命令设置提交人邮箱。 命令 git config --global user.email "xxxxxxxx.com"...

3DCAT+上汽奥迪:打造新零售汽车配置器实时云渲染解决方案

在 5G、云计算等技术飞速发展的加持下,云渲染技术迎来了突飞猛进的发展。在这样的背景下,3DCAT应运而生,成为了业内知名的实时云渲染服务商之一。 交互式3D实时云看车作为云渲染技术的一种使用场景,也逐步成为一种新的看车方式&a…...

物联网+AI智慧工地云平台源码(SaaS模式)

智慧工地云平台充分运用数字化技术,聚焦施工现场岗位一线,依托物联网、互联网、AI等技术,围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管…...

python打开相机,用鼠标左键框选矩形区域,支持一次框选多个矩形区域,通过鼠标右标清除上一次画的矩形。

方案一 import cv2# Global variables rectangles [] current_rectangle [] drawing False# Mouse callback function def mouse_callback(event, x, y, flags, param):global rectangles, current_rectangle, drawingif event cv2.EVENT_LBUTTONDOWN:drawing Truecurren…...

卷积之后通道数为什么变了

通道数增多与卷积之后得到的图像特征数量有关 卷积层的作用本来就是把输入中的特征分离出来变成新的 feature map,每一个输出通道就是一个卷积操作提取出来的一种特征。在此过程中ReLU激活起到过滤的作用,把负相关的特征点去掉,把正相关的留…...

ubuntu18.04安装opencv-4.5.5+opencv_contrib-4.5.5

一、安装opencv依赖 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-d…...

实验3.5 路由器的单臂路由配置

实验3.5 路由器的单臂路由配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.SWA的基本配置2.RA的基本配置3.在RA上查看接口状态 六、任务验收七、任务小结 一、任务描述 某公司对部门划分了需VLAN之后,发现两个部门之间无法通信,但…...

nodejs微信小程序+python+PHP的基于大数据的家电销售分析系统设计与实现-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

Windows server flask

1、Windows server 通过python的flask执行命令 from flask import Flask, request, abort import subprocess from flask_basicauth import BasicAuth app Flask(__name__) # 获取url是进行账号密码认证,设置url的账号密码 app.config[BASIC_AUTH_USERNAME] 账号…...

maven工程的pom.xml文件中增加了依赖,但偶尔没有下载到本地仓库

maven工程pom.xml文件中的个别依赖没有下载到本地maven仓库。以前没有遇到这种情况,今天就遇到了这个问题,把解决过程记录下来。 我在eclipse中编辑maven工程的pom.xml文件,增加对mybatis的依赖,但保存文件后,依赖的j…...

Navicat 技术指引 | 适用于 GaussDB 分布式的用户/权限功能

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

基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期神经网络的新鲜度等级预测

目录 背影 支持向量机SVM的详细原理 SVM的定义 SVM理论 粒子群算法原理 SVM应用实例,基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期神经网络的新鲜度等级预测 代码 结果分析 展望 完整代码:基于支持向量机SVM的新鲜度等级预测,基于自适应粒子群优化长短期…...

麒麟系统系统添加路由

系统添加路由 一、路由的解释: 路由工作在OSI参考模型第三层——网络层的数据包转发设备(TCP/IP)路由器根据收到数据包中的网络层地址以及路由器内部维护的路由表决定输出端口以及下一跳地址,并且重写链路层数据包头实现转发数据…...

考研真题数据结构

【2021年山西大学真题】将二叉树中所有非终端结点的左右子树交换位置,可以得到原二叉树的 镜像二叉树,如图。假设二叉树的存储形式为(lchild,data,rchild),给出求镜像二叉树的算法: &#xff0…...

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时,使用 Python 程序访问支持 HTTP/2 协议的网站时,有时会遇到超时问题。这可能会导致数据获取不完整,影响爬虫程序的正常运行。 问题描述 在实际操作中,当使用 Python 编写的爬虫程序访问支持 HTT…...

学会用bash在linux写脚本 (二)

接着上一章继续 数值的对比 判断语句 循环语句 22.5 比较、对比、判断 在写脚本时,有时需要做一些比较,例如,两个数字谁大谁小,两个字符串是否相同等。 做对比的表达式有[]、[[]]、test,其中[]和 test这两种表达式的…...

QML中Dialog获取close与open状态

1.新建MyDialog.qml import QtQuick 2.15import QtQuick.Dialogs 1.2Dialog {id: rootvisible: falsetitle: qsTr("弹出对话框")width: 250height: 200} 2.main.qml中调用MyDialog import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15…...

用C语言实现队列的顺序结构

用C语言实现队列的初始化、队列的判空操作、入队操作、出队运算、取队头元素运算、顺序打印队列。 #include<stdio.h> #define QueueSize 100 typedef char ElemType; typedef struct//队列结构体 {ElemType data[QueueSize];//保存队中元素int front, rear;//队头和队尾…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

push [特殊字符] present

push &#x1f19a; present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中&#xff0c;push 和 present 是两种不同的视图控制器切换方式&#xff0c;它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...