Hadoop RPC简介

news2024/11/23 7:11:15

数新网络-让每个人享受数据的价值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.coloradmin.cn/o/1153926.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二进制搭建 Kubernetes与k8s集群搭建(一)

目录 二进制搭建 Kubernetes v1.20 操作系统初始化配置 部署 docker引擎 部署 etcd 集群 准备签发证书环境 在 master01 节点上操作 生成Etcd证书 在 node01 节点上操作 在 node02 节点上操作 部署 Master 组件 在 master01 节点上操作 部署 Worker Node …

企业通关必备,iPaaS应该这样搭建

iPaaS是指集成平台即服务(Integration Platform as a Service),是一种云计算服务,提供了一套工具和服务来帮助企业集成不同的应用程序、数据和系统。iPaaS也可以通过云端的方式,将企业内部的应用程序与云端应用程序进行…

nodejs使用axios以formdata形式上传图片

nodejs使用axios以formdata形式上传图片 FormData是一种用于发送表单数据的接口,它可以用来上传文件。在前端,可以通过创建一个FormData对象,将要上传的文件添加到这个对象中,然后通过AJAX请求将这个FormData对象发送给服务器。服…

unity性能优化__Statistic状态分析

在Unity的Game视图右上角,我们会看到有Stats选项,点击会出现这样的信息 我使用的Unity版本是2019.4.16 一、Audio,顾名思义是声音信息 1:Level:-74.8dB 声音的相对强度或音量。通常,音量级别以分贝(dB&a…

超2000个大模型应用,支持文心4.0!AI Studio星河大模型社区升级上新

想给自己做个私人定制的旅行攻略,满足个性化的出游需求,还要细致关注到天气、穿衣、老人孩子的作息等等,但太耗时费力怎么办?让AI帮忙搞定。一位开发者在AI Studio星河大模型社区用短短数小时就做好了“旅行规划家”智能应用。像这…

睿趣科技:抖音开网店真的能相信吗

随着互联网的发展,越来越多的人开始尝试在网上开店。抖音作为一款短视频平台,近年来也逐渐成为了一个热门的电商平台。然而,关于抖音开网店是否真的能相信的问题,一直存在争议。 首先,我们需要了解抖音作为一个电商平台…

科幻类小说,探索科幻巨作,开启无限遐想,感受未知的奇妙世界

如果你渴望探索未来的无尽可能性,感受未知的魅力,那么小郑为你推荐三本科幻小说。这些书籍将带你进入一个充满惊喜的世界,让你对未来充满期待。 《星舰流浪文明》 这是一本硬科幻小说,讲述了星舰流浪文明的故事。这个文明在宇宙中…

【K8s】 资源管理命令-陈述式

一、资源管理介绍 1、资源管理概念 在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes //kubernetes的本质就是一个集群系统,用户可以在集群中部署各种服务,起始就是在kubernetes集群中运行一个个容…

云原生安全日志审计

记得添加,把配置文件挂载进去 - mountPath: /etc/kubernetes/auditname: audit-policyreadOnly: true.....- hostPath:path: /etc/kubernetes/audit/type: DirectoryOrCreatename: audit-policy/etc/kubernetes/manifests/kube-apiserver.yaml 具体配置文件如下 a…

2003. 每棵子树内缺失的最小基因值 (困难,DFS,Set.update)

困难,还是一如既往的不会做,但是得写写自己的想法 先从根节点开始作深度搜索,对于每一个以 node 为根的子树,我们返回该子树排序后的基因集合,类似与归并排序显然在每次合并集合进行排序的时候我们就可以知道 node 子…

innovus: 如何写出floorplan和power信息

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: innovus 报告多边形floorplan的boundary坐标 defOut 如果是自己用的floorplan信息可用如下命令: defOut -floorplan -allLayers fp.def 如果是dc…

JavaWeb项目Tomcat运行上一次的记录?

问题:修改JavaWeb项目的代码之后,tomcat仍然运行上一次的代码记录 原因:可能是由于运行了上一次成功记录的缓存 接解决办法: 来到运行部署的网页,按F12,打开“网络”->“禁用缓存”

解决多模态大模型幻觉问题的秘密武器:“啄木鸟”免重训方法!哪里出问题啄哪里!

夕小瑶科技说 原创 作者 | 付奶茶、王二狗 最近多模态大模型的研究取得了巨大的进展。然而,这些模型在生成时存在着文本与图像不一致的问题,这个问题就是一直困扰研究者们的“幻觉难题”。 ▲给定一幅图像,MLLM会输出的回应,包括…

堆栈和队列算法-双向队列

目录 堆栈和队列算法-双向队列 C代码 堆栈和队列算法-双向队列 双向队列(Double Ended Queues,DEQue)为一个有序线性表,加入与删除操作可在队列的任意一端进行。 具体来说,双向队列就是允许队列两端中的任意一端都…

Acrel-3000水电站厂用电管理系统实现电站的发、用电监控、设备管理和运维管理-安科瑞黄安南

NB/T 10861-2021《水力发电厂测量装置配置设计规范》对水电厂的测量装置配置做了详细要求和指导。测量装置是水力发电厂运行监测的重要环节,水电厂的测量主要分为电气量测量和非电量测量。电气测量指使用电的方式对电气实时参数进行测量,包括电流、电压、…

【VR开发】【Unity】【VRTK】2-关于VR的基础知识

【概述】 在VRTK的实操讲解之前,本篇先介绍几个重要的VR认识。 【VR对各个行业的颠覆】 如果互联网几乎把所有行业都重做了一遍,VR在接下来的几年很可能再把现有的行业都重做一遍,包括但不限于教育,房地产,零售&…

C#--继承

提高开发效率的一种手段 继承就是把大家共性的东西提取出来,共享 被僵尸咬一口你也是僵尸 C#不支持多重继承 C#类可以派生自另一个类和任意多个接口 继承具有单根性,一个派生类只能继承一个父类 如果没有写继承自那个类,默认继承object类&am…

面试官:聊聊kafka线上使用会有哪些问题?

哪些环节会造成消息丢失? 首先说说哪些环节会丢消息 消息生产者: (1)acks0: 表示producer不需要等待任何broker确认收到消息的回复,就可以继续发送下一条消息。性能最高,但是最容易丢消 息。大…

AMEYA360:村田量产面向汽车的1.0μF 0.18mm超薄LW逆转低ESL片状多层陶瓷电容器

株式会社村田制作所已开发出面向汽车ECU(电子控制单元)中使用的处理器、超小*(0.5mm1.0mm)且超薄的LW逆转低ESL片状多层陶瓷电容器“LLC15SD70E105ME01”,并于9月开始量产。该产品T尺寸标准值为0.16 0.02 mm(厚度为最大0.18 mm),与普通多层陶瓷电容器不…

通配符/泛域名SSL证书

在互联网发展迅速的今天,许多网站都拥有多个子域名,例如www.example.com、blog.example.com和shop.example.com等。为了确保这些子域名之间的数据传输安全,通配符/泛域名SSL证书成为了一种广泛采用的解决方案。 1,什么是通配符/泛…