YarnClient发送和接收请求源码解析

news2024/9/23 9:22:13

YarnClient发送和接收请求流程

在这里插入图片描述

Yarn是通过RPC协议通信的,协议类型可以通过查看RpcKind类得知,总共有三种类型:

RPC_BUILTIN ((short) 1),         // Used for built in calls by tests
RPC_WRITABLE ((short) 2),        // Use WritableRpcEngine 
RPC_PROTOCOL_BUFFER ((short) 3);

其中Hadoop和Yarn组件大部分是通过Protobuf(Protocol Buffers)协议进行通信。

Protobuf 是一种由 Google 开发的二进制序列化格式和相关的技术,它用于高效地序列化和反序列化结构化数据,通常用于网络通信、数据存储等场景。

Protobuf 在许多领域都得到了广泛应用,特别是在分布式系统、RPC(Remote Procedure Call)框架和数据存储中,它提供了一种高效、简洁和可扩展的方式来序列化和交换数据,Protobuf 的主要优点包括:

  • 高效性:Protobuf 序列化后的二进制数据通常比其他序列化格式(比如超级常用的JSON)更小,并且序列化和反序列化的速度更快,这对于性能敏感的应用非常有益。
  • 简洁性:Protobuf 使用一种定义消息格式的语法,它允许定义字段类型、顺序和规则
  • 版本兼容性:Protobuf 支持向前和向后兼容的版本控制,使得在消息格式发生变化时可以更容易地处理不同版本的通信。
  • 语言无关性:Protobuf 定义的消息格式可以在多种编程语言中使用,这有助于跨语言的通信和数据交换
  • 自动生成代码:Protobuf 通常与相应的工具一起使用,可以自动生成代码,包括序列化/反序列化代码和相关的类

发送和接收请求流程

发送请求

Yarn发送的请求协议都继承GeneratedMessage类实现Message接口,它们都是YarnServiceProtos的内部类。

请求头的协议类型可以在RpcHeaderProtos里面查看,它们都是RpcHeaderProtos的内部类,例如RpcRequestHeaderProto。

请求的协议类型可以在ApplicationClientProtocol里查看,它们都继承了ApplicationClientProtocol内部类。

YarnClient请求头使用的是ProtobufRpcEngineProtos的内部类RequestHeaderProto。

请求的连接信息都存储在Client的内部类ConnectionId里面,包含票据、协议类、目标地址、是否需要认证、配置文件、还有连接参数等信息。

调用器ProtobufRpcEngine.Invoker类用于代理客户端发送请求,该实例存储着Client、Client.ConnectionId等信息,它真正是通过Client实例发送请求的,Client每次请求时都会创建一个Client#Call和Client#Connection,代表每次发送的请求和连接。

Call表示调用操作,里面包含重试次数、id、响应、是否完成、请求等进行连接操作需要的信息。

Connection代表连接,它有ConnectionId的所有参数以及Socket客户端、流管道、连接参数等信息。

发送请求流程:

SaslRpcClient#sendSaslMessage
Connection#setupIOstreams
使用调用器代理发送请求
ProtobufRpcEngine.Invoker#invoke
调用器通过方法名、协议类名、协议版本构建RPC请求头
ProtobufRpcEngine.Invoker#constructRpcRequestHeader
获取参数中的Message协议以及使用创建的请求头,创建封装RpcRequestWrapper
客户端发送封装的RPC请求
Client#call
使用请求创建Call
通过ConnectionId创建Connection,并建立连接
建立该Connection的IO通道
Connection#setupIOstreams
不断建立连接并读取socket中的数据
建立连接
Client.Connection#setupConnection
先创建Socket的IO通道
NetUtils.getInputStream
NetUtils.getOutputStream
如果ConnectionId中包含UGI信息,则建立安全连接
Connection#setupSaslConnection
创建SaslRpcClient并开始连接
SaslRpcClient#saslConnect
发送Sasl协议请求RpcSaslProto,该协议初始状态为NEGOTIATE状态
SaslRpcClient#sendSaslMessage
开始循环握手交换信息
读取响应信息头,判断响应都是否有错误标志
读取响应体,解析响应体为RpcSaslProto协议响应
根据响应的RpcSaslProto状态判断认证是否有问题
如果状态为协商状态NEGOTIATE
如果状态为质疑状态CHALLENGE,则需要评估响应的Token,然后创建Sasl回复再次协商
如果状态为成功状态SUCCESS,简单认证则完成认证,否则还需再次评估Token再完成认证
继续发送请求
SaslRpcClient#sendSaslMessage
返回协商一致的认证方法
认证成功后,先创建响应的连接管道,并建立连接环境
Client.Connection#writeConnectionContext
开始接收RPC响应
Client#run && Client#receiveRpcResponse
发送RPC远程过程调用请求
Connection#sendRpcRequest
最后返回响应数据
Client.Call#getRpcResponse
从响应的可认证方式中选择相应的认证方式
SaslRpcClient#selectSaslClient
如果认证方式为SIMPLE认证,则直接完成认证
否则,读取响应的token信息,验证token并生成响应信息,该响应信息将会再次发送给服务器进行协商
SaslClient#evaluateChallenge(如果在身份验证过程中收到来自服务器的质询,则调用此方法来准备提交给服务器的适当的下一个响应)
创建Sasl响应回复,此次回复的SASL状态为INITIATE状态,认证方式为所选择的方式,并附带上面生成的响应信息
SaslClient#evaluateChallenge

YarnClient发送请求案例:

YarnClientImpl#getApplications()
HadoopYarnProtoRPC#getProxy
ClientRMProxy#createRMProxy
YarnClientImpl#serviceStart
YarnClient服务初始化
YarnClientImpl#serviceStart
创建ApplicationClientProtocol代理实例
ClientRMProxy#createRMProxy
如果设置了高可用和重试机制,则会先创建RMFailoverProxy
创建RPC代理
RMProxy#getProxy
通过YarnRPC获取代理
HadoopYarnProtoRPC#getProxy
从配置文件中读取并实例化RpcClientFactory的实现类 (yarn.ipc.client.factory.class)
通过RpcClientFactory获取客户端
RpcClientFactoryPBImpl#getClient
从配置文件中读取相应的ApplicationClientProtocol实现类配置,默认为ApplicationClientProtocolPBClientImpl,并创建该实例
ProtobufRpcEngine创建ProtobufRpcEngine.Invoker代理ApplicationClientProtocolPB实例
ProtobufRpcEngine#getProxy
YarnClientImpl发送getApplications请求
YarnClientImpl#getApplications()
创建请求实例GetApplicationsRequest
GetApplicationsRequest#newInstance
ApplicationClientProtocolPBClientImpl代理客户端发送getApplications请求
ApplicationClientProtocolPBClientImpl#getApplications
ApplicationClientProtocolPBClientImpl#getApplications
创建GetApplicationsRequestProto协议,使用调用器代理发送请求
ProtobufRpcEngine.Invoker#invoke
创建并返回GetApplicationsResponsePBImpl响应

接收请求

Yarn使用org.apache.hadoop.ipc.Server作为服务器,因为Yarn有三种RPC类型,所以Server也有三种实现类,ProtobufRpcEngine、RPC和WritableRPCEngine、TestServer(用于测试)

服务器创建时会创建连接监听器、响应器、地址、hadoop配置文件、端口、处理器数量、请求调用队列、安全管理器、 连接管理器,指标服务等。

服务器的连接监听器 (org.apache.hadoop.ipc.Server.Listener) 用于接收连接,它几乎代表着服务器本身,它在创建时会创建一个nio服务器,用于接收和管理所有请求,它将接收的请求放入连接管理器中,然后交给Reader处理。

Reader (org.apache.hadoop.ipc.Server.Listener.Reader) 也将在Listener创建时创建的,Listener会创建多个Reader,每个Reader代表一个数据处理器,它用于读取连接监听器接收的请求信息,通过请求信息创建请求调用 (Call) 实例,并将Call实例放入请求调用队列中,请求调用队列将会由后面的Handler (服务器启动后创建) 处理。

Listener#readAndProcess
Reader创建和启动
创建连接器队列,用于存储连接监听器接收到的请求
创建Selector循环监听并处理连接器队列中的请求
Reader#doRunLoop
Reader#doRead
循环接收并处理请求中的数据
Listener#readAndProcess
先读取连接数据中的一些信息创建连接头,如数据长度、连接头(请求类型、版本、认证信息)等,然后开始处理请求
Server#channelRead
处理请求体数据
Server.Connection#processOneRpc
Server.Connection#processOneRpc
序列化获取RpcRequestHeaderProto
Server.Connection#decodeProtobufFromStream
校验RPC头
Server.Connection#checkRpcHeaders
开始处理RCP请求,反序列化创建RpcRequestWrapper,并创建相应的调用请求实例,然后存放到调用请求队列中
Server.Connection#processRpcRequest

服务器的响应器 (org.apache.hadoop.ipc.Server.Responder) 用于响应请求 ,返回请求结果或者异常。

服务器启动后,将会创建多个处理器 (org.apache.hadoop.ipc.Server.Handler) 轮询处理调用请求队列中的调用请求。

  • 处理器轮询调用Call实例

理器轮询调用Call实例

Handler#run
判断调用请求中是否包含UGI信息,如果包含ugi,则在调用之前需要使用ugi进行认证
处理调用请求
Server#call
由于大部分Yarn 组件使用通信组件都是 RPC 组件,且调用器通常都是ProtobufRPCEngine,这里就再解析一下ProtobufRPCEngine处理请求原理。
RPC 服务器处理请求
RPC.Server#call
获取 RPC 请求调用器 (RpcInvoker)
RPCInvoker 请求调用器处理请求
RpcInvoker#call
ProtobufRpcEngine.Server.ProtoBufRpcInvoker#call
获取协议的实现类,实现类也是一个阻塞服务(BlockingService)
ProtobufRpcEngine.Server.ProtoBufRpcInvoker#getProtocolImpl
通过BlockingService获取需要调用的方法
Descriptors.ServiceDescriptor#findMethodByName
BlockingService开始调用方法
BlockingService#callBlockingMethod
创建响应实例
Server#setupResponse
响应请求
Responder#doRespond

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

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

相关文章

CentOS 7安装和配置 NFS

前言 NFS 是 Network File System 的缩写,即网络文件系统。功能是让客户端通过网络访问不同主机上磁盘里的数据,主要用在类 Unix 系统上实现文件共享的一种方法。本例演示 CentOS 7 下安装和配置 NFS 的基本步骤。 环境说明 CentOS 7(Mini…

Agent Q介绍:具有规划和自愈能力的下一代人工智能代理的研究突破

近年来,大型语言模型(LLM)的功能已经改变了自然语言处理和理解,取得了令人瞩目的里程碑式成就。尽管取得了这些进步,大型语言模型在交互环境中仍面临巨大挑战,尤其是在需要多步骤推理的任务中,如…

变电站智能巡检机器人:构建智能化电力运维新模式

随着现代电力系统规模的不断扩大,变电站作为电力输送和分配的关键节点,面临着越来越高的运维要求。传统的人工巡检方式存在效率低、劳动强度大、安全隐患多等问题,无法满足日益复杂的电力系统需求。在此背景下,变电站智能巡检机器…

偷偷用了这10款AI写作神器,再也没加过班!

前言 [ 自2022年Chat-GPT在全球掀起AI革命浪潮,AI开始在内容的生产方式进行颠覆性改变。 其中,AI写作工具的崛起,为内容创作者打开了一个全新创作世界,无论用户在办公写作、自媒体写作还是兴趣写作,在效率方面都得到…

【数据结构】优先级队列 — 堆

文章目录 前言1. 优先级队列1.1 概念1.2 特性 2. 堆2.1 概念2.2 存储方式 3. 堆的模拟实现3.1 堆的创建3.2 堆的插入3.3 堆的删除 4. PriorityQueue4.1 注意事项4.2 构造器介绍4.3 常用方法介绍 5. 经典题型6. 结语 前言 我们之前学习过队列,它是遵循先进先出原则的…

云上Oracle 数据库本地备份部署测试

1.说明 由于运行在云上的Oracle数据库暂无本地备份,为了保障租户业务系统的可持续性以及数据安全,特此进行数据库备份本地部署并进行测试。 2.备份策略 (1)数据库数据量 SQL> select sum(bytes)/1024/1024/1024 from dba_segme…

自建电商网站整合Refersion教程

前言:   先介绍一下Refersion有啥用,如果你有一个自己的跨境电商独立站点,想找一些网红帮忙推广销售自己的商品,然后按照转化订单比例给网红支付佣金,这件事情对双方来说透明性和实时性很重要,Refersion就…

《多模态大规模语言模型基准》综述

论文链接:https://arxiv.org/pdf/2408.08632 MLLM:Multimodal Large Language Models 评估多模态大型语言模型(MLLMs)的重要性体现在以下几个方面: 1. 理解模型能力:通过评估,研究人员和开发…

攀高行为检测识别摄像机

攀高行为检测识别摄像机 是一种结合了图像识别技术和智能算法的设备,旨在监测和识别人员在高空作业中的攀高行为,及时发现潜在的安全隐患并提供预警。这种摄像机可以有效提高工作场所的安全管理水平,减少高空作业事故的发生。 攀高行为检测识…

微软CEO谈AI平台范式转移、AI发展趋势及资本市场动态

为大家整理编辑了近期微软CEO萨提亚纳德拉 (Satya Nadella)著名科技KOLBen Thompson播客采访的精华内容。 在采访中,萨提亚纳德拉 (Satya Nadella)畅谈了人工智能平台范式转移、与Open AI等合作伙伴的关系、AI未来五年的发展方向、以及资本市场的趋势。 萨提亚纳德…

VUE3生命周期钩子

生命周期 vue2的生命周期钩子 beforeCreate:开始初始化事件和生命周期,但还没有data、methods、computed、watch属性,也就是vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。 created:实完成数据挂载、…

PowerBi 柱形图,数据标签无法显示在端外

如图 即使设置了“数据标签”显示“端外“,仍然不作用。 原因其实是因为Y轴的数据范围设置不当,如图,当前Y轴范围是0到自动 只需要修改为最大和最小值都是自动即可,选中0 按backspace键删除,然后,鼠标在任意…

Parade Series - 3D Modeling

FBX FBX(Filmbox)文件格式是一种广泛使用的三维模型和动画文件格式,由Autodesk开发和维护。 FBX格式支持多种3D数据类型,包括几何、材质、纹理、动画、骨骼、灯光和摄像机等;OBJ MTL OBJ文件格式是一种用于表示三维几何形状的标…

OpenAI 神秘模型「草莓」预计今秋推出,ChatGPT 将迎重大升级|TodayAI

有外媒报道指出,OpenAI 内部代号为「Strawberry(草莓)」的 AI 模型即将在今年秋季面世。这一消息引发了业内广泛关注,被认为可能会为 ChatGPT 带来今年最重要的升级。 「草莓」模型的强大能力与应用潜力 据《The Information》报…

EPLAN中绘制黑盒的具体方法

EPLAN中绘制黑盒的具体方法 对于某些电气元件没有EDZ部件库时,可以自己绘制黑盒来解决,具体方法可参考以下内容: 如下图所示,打开EPLAN软件,在项目中新建一页多线原理图, 如下图所示,点击插入----盒子/连接点/安装板--------黑盒, 设置所需的参数和属性,然后放置在图框绘制…

算法入门-深度优先搜索1

第六部分:深度优先搜索 144.二叉树的前序遍历(简单) 题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 输入:root [1,null,2,3] 输出:[1,2,3] 第一种思路&am…

AtCoder Beginner Contest 366(D~E题解)

闲来无事去vp了一下之前放假没打的比赛,感觉需要总结的也就这两题吧,a,c都是水题,b只不过是实现有一点难,并不是很难写,d是一个需要自己推的三维前缀和,e也是一种前缀和,我当时没想到…

WEB渗透Win提权篇-白名单提权

提权工具合集包(免费分享): 夸克网盘分享 往期文章 WEB渗透Win提权篇-提权工具合集-CSDN博客 WEB渗透Win提权篇-RDP&Firewall-CSDN博客 WEB渗透Win提权篇-MSSQL-CSDN博客 WEB渗透Win提权篇-MYSQL-udf-CSDN博客 WEB渗透Win提权篇-Acc…

什么是代码审查(Code Review)?它有什么好处?

代码审查(Code Review)是软件开发过程中一个至关重要的环节,它指的是团队成员之间相互检查、评估代码的过程。这一过程不仅涉及对代码质量的把控,更是提升团队整体编程能力、确保软件安全性的重要手段。在本文中,我们将…

CSRF 概念及防护机制

概述 CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种网络攻击方式。在这种攻击中,恶意用户诱导受害者在不知情的情况下执行某些操作,通常是利用受害者已经登录的身份,向受害者信任的…