Hadoop RPC简介

数新网络-让每个人享受数据的价值icon-default.png?t=N7T8https://www.datacyber.com/

前 言

RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。

01 RPC调用流程

·服务消费方(client)调用,以本地调用方式调用服务

·client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体

·client stub找到服务地址,并将消息发送到服务端

·server stub收到消息后进行解码

·server stub根据解码结果调用本地的服务

·本地服务执行并将结果返回给server stub

·server stub将返回结果打包成消息并发送至消费方

·client stub接收到消息,并进行解码

·服务消费方得到最终结果

02  RPC的特点

2-1 透明性

远程调用其他机器上的程序,对用户来说就像是调用本地方法一样

2-2 高性能

RPC server能够并发处理多个来自Client的请求(请求队列)

2-3 可控性

jdk中已经提供了一个RPC框架-RMI,但是该RPC框架过于重量级并且可控之处比较少,因此Hadoop RPC实现了自定义的RPC框架

03  Hadoop RPC

与其他RPC框架一样,Hadoop RPC主要分为四个部分,分别是序列化层、函数调用层、 网络传输层和服务器端处理框架,具体实现机制如下:

序列化层:序列化层的主要作用是将结构化对象转为字节流以便于通过网络进行传输或 写入持久存储。在RPC框架中,它主要用于将用户请求中的参数或者应答转化成字节流 以便跨机器传输。Hadoop自己实现了序列化框架,一个类只要实现Writable接口,即 可支持对象序列化与反序列化。

函数调用层:函数调用层的主要功能是定位要调用的函数并执行该函数。HadoopRPC采 用Java反射机制与动态代理实现了函数调用。

网络传输层:网络传输层描述了Client与Server之间消息传输的方式,Hadoop RPC 采用了基于TCP/IP的Socket机制。

服务器端处理框架:服务器端处理框架可被抽象为网络I/O模型。它描述了客户端与服 务器端间信息交互的方式。它的设计直接决定着服务器端的并发处理能力。常见的网络 I/O模型有阻塞式I/O、非阻塞式I/O、事件驱动I/O等,而Hadoop RPC采用了基于 Reactor设计模式的非阻塞式I/O模型。

由上图可知Hadoop RPC实现主要包括三部分Client类、Server类、RPC类。

3-1 客户端代理的创建:

由RPC.getProxy获取客户端代理,一个代理处理用户到具体服务器的具体协议对应的连接,同时连接属于一个Client,而Client一般由SocketFactory决定,不同SocketFactory对应不同Client。

因此getProxy需指定包括SocketFactory,用户,服务器地址,协议这4个信息,另外还需指定连接读操作超时时间。对应getProxy重要的5个信息,最少需给定服务器地址和使用的协议,其他的都可以默认。

SocketFactory默认为默认SocketFactory,用户默认为当前用户,读操作超时时间默认为0,此时会设置为pingInterval获取客户端代理的类为RPCEngine类,默认实现为ProtobufRpcEngine在ProtobufRpcEngine中对getProxy方法进行了重载。

最终调用的为参数最多的getProxy方法

由方法实现可知创建代理最主要的就是通过getProxy方法传入的参数创建invoker对象,然后通过Java动态代理创建动态代理,因此创建的代理核心信息保存在调用处理器invoker中,下面是invoker的构造函数。

因此,就是通过传入的用户、服务器地址、协议、超时时间等信息构建Invoker。ConnectionId用来确定该invoker负责处理的链接,SocketFactory用来在缓存中查找所属客户端,若存在则使用该factory的客户端,否则构建一个Client对象。

获取client的方法:

这样,客户端的代理构建完成了,其实主要是构建了代理关联的调用处理器中的connectionId(对应一个Connection),以及client(将代理处理的连接注册到相应客户端)。

3-2 创建服务器对象

因为Server端涉及到多个客户端的调用,所以使用了Reactor的设计模式。Reactor 主要是基于多路复用的非阻塞IO实现的基于事件驱动的IO框架。Hadoop RPC 底 层使用的是Java NIO,而Java NIO正好就是一种多路复用的非阻塞IO,其中最重要的就是Selector选择器。

RPC Server处理流程:

其中有几个比较重要的组件:

Client: 客户端

Listener: Server端只存在一个Listener,主要功能就是分发,在Selector中注册了ACCEPT事件,每当有新的Client连接,便会为Client指定一个Reader线程。创建服务器对象,通过RPC.getServer完成

Reader: Reader线程有多个,主要任务是读取请求,并将请求封装成一个Call,放入callQueue中

CallQueue: reader handler之间的缓冲队列,生产消费者模型

Responder:read request和write response采用不同的selector实现读写分离

connectionManager: 定时清理idle时间过长的Connection

上图是RPCEngine获取Server服务器对象的方法,该方法最后会调用Server类中的构造方法创建Server对象。

在构造方法中除了对端口地址等属性初始化外,还构建了Listener和Responder,一般通过RPC.getServer创建服务器后,会调用服务器的start方法启动服务器。当服务端启动时同时会启动Listener,Responder及Handler。

Listener构造:

Listener类是一个线程类,主要任务就是为连入的Socket分配Reader。详细代码逻辑在启动线程后的run方法的doAccept方法中。

Reader:

将Request中的属性提取出来封装成一个RpcCall对象,并将Call对象放入CallQueue中。

Call:

Call类中封装了Request对象和Response对象,Call类被Reader存放在CallQueue中,等待Handler的处理。

Handler:

Handler的主要任务就是从callQueue拿出Call,并通过Request找到真实的实现方法,并通过方法名和参数进行执行。

3-3 建立连接

Client与每个Server之间维护一个通信连接。该连接相关的基本信息及操作被封装到Connection类中。其中,基本信息主要包括:通信连接唯一标识(remoteId),与Server端通信的Socket(socket),网络输入数据流(in),网络输出数据流(out),保存RPC请求的哈希表(calls)等。

当调用call函数执行某个远程方法时,Client端需要进行如下几个步骤:

步骤1 

创建一个Connection对象,并将远程方法调用信息封装成Call对象,放到 Connection对象中的哈希表calls中;

步骤2 

调用Connetion类中的sendParam()方法将当前Call对象发送给Server端;

步骤3 

Server端处理完RPC请求后,将结果通过网络返回给Client端,Client端通过receiveResponse()函数获取结果;

步骤4 

Client端检查结果处理状态(成功还是失败),并将对应的Call对象从哈希表中删除。

在建立连接完成后就可以处理客户端的请求了,主要任务是从共享队列中获取call对象,执行对应的函数调用,并将结果返回给客户端,这全部由Handler线程完成。

Server端可同时存在多个Handler线程,它们并行从共享队列中读取Call对象,经执行对应的函数调用后,将尝试着直接将结果返回给对应的客户端。

但考虑到某些函数调用返回结果很大或者网络速度很慢,可能难以将结果一次性发送给客户端,此时Handler将尝试着将后续发送任务交给Responder线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/179815.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python VS vba】(5) 在python中使用xlwt操作Excel(待完善ing)

目录 1 什么是xlwt 2 导入xlwt 3 相关语法 3.1 创建新的workbook 3.2 创建新的sheet 3.3 保存workbook 4 python里表格的形式 4.1 矩阵 4.2 EXCEL的数据形式 完全等于矩阵的数字结构 4.3 python里矩阵 5 具体代码 5.1 代码 5.2 结果 5.3 要注意的问题 5.3.1 不能…

EthernetIP主站转EtherCAT协议网关采集电力变压器的 Ethernet IP 数据

怎么通过捷米JM-EIPM-ECT网关把ABB电力变压器的 Ethernet IP 数据,连接到欧姆龙PLC上,通过plc去监控电力设备的数据呢,下面是介绍简单的连接方法,采集Ethernet IP从站数据和EtherCAT协议 1 ,捷米JM-EIPM-ECT网关连接Et…

基于深度学习的视频多目标跟踪实现 计算机竞赛

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的视频多目标跟踪实现 …

华为云API Explorer伙伴招募火热进行中~

API编排新特性助力伙伴 零代码构建API工作流 实现快速集成场景编排能力 面向三大核心场景: API调用逻辑频繁改动 API间高耦合不便管理 复杂API解决方案难构建 伙伴加入可立享四大限时福利: 免费试用、专家咨询、技术指导、生态支持 点此报名>&…

【入门Flink】- 02Flink经典案例-WordCount

WordCount 需求&#xff1a;统计一段文字中&#xff0c;每个单词出现的频次 添加依赖 <properties><flink.version>1.17.0</flink.version></properties><dependencies><dependency><groupId>org.apache.flink</groupId><…

超详细Linux搭建Hadoop集群

一、给计算机集群起别名——互通 总纲&#xff1a; 1、准备3台客户机&#xff08;关闭防火墙、静态IP、主机名称都设置好&#xff09; 2、安装JDK&#xff08;可点击&#xff09; 3、配置环境变量 4、安装Hadoop 5、配置hadoop的环境变量 6、配置集群 7、群起测试 1.1、环境准备…

VPN网络环境下 本地客户端能连上mysql 本地启服务连不上mysql的原因

背景 公司mysql使用的是华为云RDS&#xff0c;由于要做一些测试验证&#xff0c;需要本地通过VPN直连华为RDS节点&#xff1b;找运维配置好网络后&#xff0c;本地 telnet 内网ip 3306 以及通过navicat客户端都能正常连接数据库&#xff1b;但是本地启动的服务就是连接不上。问…

佳易王定制开发流水线商品标签自动打印软件,打印格式可定制

佳易王定制开发流水线商品标签自动打印软件&#xff0c;打印格式可以定制 软件特色&#xff1a; 定制试用商品标签打印管理V16.0&#xff0c;打印标签可以自动计算到期日期和品控日期&#xff0c;并打印品名、包装规格、生产日期、到期日期、储存条件、生产包装、品控日期等信…

ChinaSoft 论坛巡礼|开源软件供应链论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

【Redis】Java连接Redis及Java操作Redis常用数据类型

一&#xff0c;Java连接Redis 1.1 连接前端服务器 打开RedisDesktopManager并连接Redis 不知道可看我上一篇文章&#xff1a; 【Redis】安装(Linux&window)及Redis的常用命令-CSDN博客 1.2 后端依赖 导入相关的jedis依赖 注意&#xff1a;要在dependencies标签中导入…

A股风格因子看板 (2023.11第01期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格暴露等。 今日为该因子跟踪第01期&#xff0c;指数组合数据截止日2023-10-31&#xff0c;要点如下 近1年A股风格因子收益走…

Apache HttpClient库编写的Scala程序

Apache HttpClient库编写的Scala下载器程序&#xff0c;用于下载图片。代码如下&#xff1a; import org.apache.http.HttpHost import org.apache.http.client.HttpClients import org.apache.http.client.methods.HttpHead import org.apache.http.impl.client.CloseableHtt…

Python:PDF转长图像和分页图像

简介&#xff1a;随着电子化文档的普及&#xff0c;PDF文件的使用频率越来越高。有时我们需要将PDF中的内容转化为图片格式进行分享或编辑&#xff0c;那么如何才能轻松地完成此任务呢&#xff1f;本文将为你展示一个Python工具&#xff1a;如何将PDF文件转化为图片&#xff0c…

JumpServer开源堡垒机与万里安全数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经与万里安全数据库软件GreatDB完成兼容性认证。针对产品的功能、性能、兼容性方面&#xff0c;经过双方共同测试&#xff0c;万里安全数据库软件&#xff08;简称&#xff1a;…

纷享销客荣获最佳制造业数字营销服务商奖

2023年10月26日&#xff0c;第二届中国制造业数智化发展大会在上海盛大召开。本次大会汇聚了制造行业的顶尖企业和专家&#xff0c;共同探讨如何通过数字化转型赋能企业自身成长&#xff0c;实现信息化向数字化的升级转型。 在本次盛会上&#xff0c;纷享销客以其卓越的基本面、…

SNAP打开影像失败No appropriate reader found

SNAP打开影像失败No appropriate reader found 问题描述 原因 这是我前几周用的&#xff0c;还有这些模块&#xff0c;但不知道何时&#xff0c;这些模块就少了 重装一下吧&#xff0c;可能是误删东西了 解决方案 重装了一下&#xff0c;就能够打开了 装完之后又有这些模…

【3D图像分割】基于 Pytorch 的 VNet 3D 图像分割3(3D UNet 模型篇)

在本文中&#xff0c;主要是对3D UNet 进行一个学习和梳理。对于3D UNet 网上的资料和GitHub直接获取的代码很多&#xff0c;不需要自己从0开始。那么本文的目的是啥呢&#xff1f; 本文就是想拆解下其中的结构&#xff0c;看看对于一个3D的UNet&#xff0c;和2D的UNet&#x…

项目实战:修改水果库存系统特定库存记录

1、在edit.html修改库存页面添加点击事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><link rel"stylesheet" href"style/index.css"><script s…

AI:51-基于深度学习的电影评价

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…

【计算机网络】网络层:数据平面

一.网络层概述 每台路由器的数据平面的主要功能时从其输入链路向其输出链路转发数据报&#xff0c;控制平面的主要功能是协调这些本地的每路由转发动作&#xff0c;使得数据报沿着源和目的地主机之间的路由器路径最终进行端到端传送。 网络层不运行运输层和应用层协议。 转发是…