【RBF SBN READ】hadoop社区基于RBF的SBN READ请求流转

读写分离功能的背景及架构

当前联邦生产集群的各个子集群只有Active NameNode在工作,当读写任务变得繁忙的时候,只有一个Active负责处理的话,此时集群的响应和处理能力业务侧感知会明显下降,为此,我们将引入Observer架构,实现读写功能的分离,使得Active只负责写请求,而读请求由Observer去负责,并且我们可以引入多个Observer,这将大大增加集群的读写吞吐量和性能,具体架构变更如下:

在这里插入图片描述

实现原理

讲解Client、Router、NameNode等子模块如何实现该功能。

RPC原理介绍

纯裸TCP的粘包问题

假设我们需要在 A 电脑的进程发一段数据到 B 电脑的进程,我们一般会在代码里使用 socket 进行编程。

在这里插入图片描述

使用纯裸的 TCP 进行字节流的传输会导致无法辨认消息的边界,即粘包现象,发送端的数据包在接收端被不完整地分割或者多个数据包被合并在一起,导致数据边界混乱,接收端无法正确区分数据。

比如,当我们选择使用 TCP 发送 “夏洛"和"特烦恼” 的时候,接收端收到的就是 “夏洛特烦恼” ,这时候接收端没发区分你是想要表达 “夏洛”+“特烦恼” 还是 “夏洛特”+“烦恼”

消息对比

所以我们会把每条要发送的数据都包装一下,比如加入 消息头 ,消息头里写清楚一个完整的包长度是多少,根据这个长度可以继续接收数据,截取出来后它们就是我们真正要传输的 消息体

消息边界长度标志

而这里头提到的 消息头 ,还可以放各种东西,比如消息体是否被压缩过和消息体格式之类的,只要上下游都约定好了,互相都认就可以了,这就是所谓的 协议。

协议有很多种,比如 HTTP 和 RPC。

网络的分层图

四层网络协议

上面介绍的TCP是传输层的协议,而基于 TCP 造出来的 HTTP 和各类 RPC 协议,它们都只是定义了不同消息格式的 应用层协议 而已。

HTTP

HTTP(Hyper Text Transfer Protocol)协议又叫做 超文本传输协议 。我们用的比较多,平时上网在浏览器上敲个网址就能访问网页,这里用到的就是 HTTP 协议。

RPC

定义

RPCRemote Procedure Call)又叫做 远程过程调用,它本身并不是一个具体的协议,而是一种 调用方式

举个例子,我们平时调用一个 本地方法 就像下面这样。

 res = localFunc(req)

如果现在这不是个本地方法,而是个远端服务器暴露出来的一个方法remoteFunc,如果我们还能像调用本地方法那样去调用它,这样就可以屏蔽掉一些网络细节,用起来更方便,岂不美哉?

res = remoteFunc(req)

RPC可以像调用本地方法那样调用远端方法

基于这个思路,大佬们造出了非常多款式的 RPC 协议,比如比较有名的gRPCthrift

值得注意的是,虽然大部分 RPC 协议底层使用 TCP,但实际上 它们不一定非得使用 TCP,改用 UDP 或者 HTTP,其实也可以做到类似的功能。

RPC结构图

RPC 的 核心功能图:

在这里插入图片描述

  1. client以本地调用的方式调用远程服务;
  2. client stub 接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体(序列化):RpcRequest
  3. client stub找到远程服务的地址,并将消息发送到服务提供端;
  4. Server Stub收到消息将消息反序列化为 Java 对象: RpcRequest;根据RpcRequest中的类、方法、方法参数等信息调用本地的方法;
  5. Server Stub得到方法执行结果并将组装成能够进行网络传输的消息体:RpcResponse(序列化)发送至消费方;
  6. client stub接收到消息并将消息反序列化为 Java 对象:RpcResponse ,这样也就得到了最终结果。
有了HTTP,为什么还使用RPC
RPC出现时间更早

在这里插入图片描述

在Client/Server (C/S) 架构下,客户端(Client) 需要跟服务端(Server) 建立连接收发消息,不涉及标准化,主要使用RPC协议。

在 Browser/Server (B/S) 架构下,比如说Chrome浏览器,需要访问各个公司的服务器,这时候需要统一标准,不然大家没法交流,主要使用HTTP协议。

底层连接形式

底层连接形式,RPC使用连接池,性能更高。

connection_pool

以主流的 HTTP1.1 协议为例,其默认在建立底层 TCP 连接之后会一直保持这个连接(keep alive),之后的请求和响应都会复用这条连接。

RPC 协议,也跟 HTTP 类似,也是通过建立 TCP 长链接进行数据交互,但不同的地方在于,RPC 协议一般还会再建个 连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用,可以说非常环保。

传输的内容

HTTP的消息头含有更多的内容,内容非常多的冗余,显得非常啰嗦。

HTTP报文

HTTP原理

而 RPC,因为它定制化程度更高,消息头冗余较少,可以采用体积更小的 Protobuf 或其他序列化协议去保存结构体数据,同时也不需要像 HTTP 那样考虑各种浏览器行为,比如 302 重定向跳转啥的。因此性能也会更好一些,这也是在公司内部微服务中抛弃 HTTP,选择使用 RPC 的最主要原因。

RPC原理

而我们的HADOOP生产集群的存储系统,服务端和客户端进行远程调用时使用就是Protobuf序列化协议。

protobuf序列化

在hadoop中,大量需要进行RPC调用传输的数据参数是通过protobuf协议去序列化。

使用protobuf进行序列化有如下好处:

  • protobuf序列化和反序列化更加高效,简洁,字段在传输过程中只传输序列号
  • protobuf支持跨语言,可以根据 .proto 文件的配置自动生成各种编程语言的数据结构代码,简化开发过程。

为了在联邦集群中支持observer功能,引入消息namespaceStateIds,主要保存各个ns的最新的state id。

RouterFederatedStateProto

message RouterFederatedStateProto {map<string, int64> namespaceStateIds = 1; // Last seen state IDs for multiple namespaces.
}

RpcRequestHeaderProto

message RpcRequestHeaderProto { // the header for the RpcRequestenum OperationProto {RPC_FINAL_PACKET        = 0; // The final RPC PacketRPC_CONTINUATION_PACKET = 1; // not implemented yetRPC_CLOSE_CONNECTION     = 2; // close the rpc connection}optional RpcKindProto rpcKind = 1;optional OperationProto rpcOp = 2;required sint32 callId = 3; // a sequence number that is sent back in responserequired bytes clientId = 4; // Globally unique client ID// clientId + callId uniquely identifies a request// retry count, 1 means this is the first retryoptional sint32 retryCount = 5 [default = -1];optional RPCTraceInfoProto traceInfo = 6; // tracing infooptional RPCCallerContextProto callerContext = 7; // call contextoptional int64 stateId = 8; // The last seen Global State ID// Alignment context info for use with routers.// The client should not interpret these bytes, but only forward bytes// received from RpcResponseHeaderProto.routerFederatedState.optional bytes routerFederatedState = 9;
}

RpcResponseHeaderProto

message RpcResponseHeaderProto {/*** * RpcStastus - success or failure* The reponseHeader's errDetail,  exceptionClassName and errMsg contains* further details on the error**/enum RpcStatusProto {SUCCESS = 0;  // RPC succeededERROR = 1;    // RPC or error - connection left open for future callsFATAL = 2;    // Fatal error - connection closed}enum RpcErrorCodeProto {// Non-fatal Rpc error - connection left open for future rpc callsERROR_APPLICATION = 1;      // RPC Failed - rpc app threw exceptionERROR_NO_SUCH_METHOD = 2;   // Rpc error - no such methodERROR_NO_SUCH_PROTOCOL = 3; // Rpc error - no such protocolERROR_RPC_SERVER  = 4;      // Rpc error on server sideERROR_SERIALIZING_RESPONSE = 5; // error serializign responseERROR_RPC_VERSION_MISMATCH = 6; // Rpc protocol version mismatch// Fatal Server side Rpc error - connection closedFATAL_UNKNOWN = 10;                   // unknown Fatal errorFATAL_UNSUPPORTED_SERIALIZATION = 11; // IPC layer serilization type invalidFATAL_INVALID_RPC_HEADER = 12;        // fields of RpcHeader are invalidFATAL_DESERIALIZING_REQUEST = 13;     // could not deserilize rpc requestFATAL_VERSION_MISMATCH = 14;          // Ipc Layer version mismatchFATAL_UNAUTHORIZED = 15;              // Auth failed}required uint32 callId = 1; // callId used in Requestrequired RpcStatusProto status = 2;optional uint32 serverIpcVersionNum = 3; // Sent if success or failoptional string exceptionClassName = 4;  // if request failsoptional string errorMsg = 5;  // if request fails, often contains strack traceoptional RpcErrorCodeProto errorDetail = 6; // in case of erroroptional bytes clientId = 7; // Globally unique client IDoptional sint32 retryCount = 8 [default = -1];optional int64 stateId = 9; // The last written Global State ID// Alignment context info for use with routers.// The client should not interpret these bytes, but only// forward them to the router using RpcRequestHeaderProto.routerFederatedState.optional bytes routerFederatedState = 10;
}

状态流转

下图为rbf架构下的状态id流转

在这里插入图片描述

Client模块

故障转移代理提供类

当客户端执行hdfs请求时,比如hdfs dfs -cat /t.sh,由于是高可用模式,请求首先会通过故障转移代理提供类获取一个NN的代理,这样客户端就知道请求应该发向哪个NN,在联邦集群中,NN则换成了Router。

目前生产环境常用的有

dfs.client.failover.proxy.provider=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

在初始化ConfiguredFailoverProxyProvider类的时候,会获取所有的NN的代理,并且可以random打散,这对rbf集群的router负载均衡非常有用。

而为了在rbf集群中支持读写分离,读请求发送到observer,写请求发送到active,我们需要变更配置类,如下,

dfs.client.failover.proxy.provider=org.apache.hadoop.hdfs.server.namenode.ha.RouterObserverReadConfiguredFailoverProxyProvider

RouterObserverReadConfiguredFailoverProxyProvider主要继承RouterObserverReadProxyProvider,之所以扩展RouterObserverReadProxyProvider,是因为单独使用RouterObserverReadProxyProvider不支持高可用模式。

这是因为RouterObserverReadProxyProvider使用IPFailoverProxyProvider去初始化NN代理,只能识别单个ip。

    public RouterObserverReadProxyProvider(Configuration conf, URI uri, Class<T> xface,HAProxyFactory<T&g

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

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

相关文章

记事本建java及java命名规范

1.桌面开发&#xff1a;c# 2. 记事本建java&#xff1a; 以class的名称(类名)为名&#xff0c;名称.java 编译jdk&#xff1a;javac 名称.java 调动运行jre : java 名称 查看名称.java里面的内容&#xff1a;cat 名称.java java 的命名规范 大驼峰&#xff08;每个单词首…

YOLOv8模型改进 第二十讲 添加三重注意力机制Triplet Attention 提升小目标/遮挡目标

本文这次分享的是三重注意力机制Triplet Attention。现在注意力机制在计算机视觉任务中被广泛研究和应用&#xff0c;如 Squeeze-and-Excitation Networks (SENet)、Convolutional Block Attention Module (CBAM) 等。然而&#xff0c;这些方法存在一些局限性&#xff0c;例如需…

2024年认证杯SPSSPRO杯数学建模D题(第一阶段)AI绘画带来的挑战解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 D题 AI绘画带来的挑战 原题再现&#xff1a; 2023 年开年&#xff0c;ChatGPT 作为一款聊天型AI工具&#xff0c;成为了超越疫情的热门词条&#xff1b;而在AI的另一个分支——绘图领域&#xff0c;一款名为Midjourney&#xff08;MJ&#xff…

如何修复和防止 500 内部服务器错误的发生

当遭遇 500 内部错误时&#xff0c;意味着服务器出现了意外状况&#xff0c;以至于无法对请求予以回应。这种错误往往源于服务器端的各类问题&#xff0c;像是服务器配置出现偏差、脚本存在漏洞或者服务器瞬间负荷过重等。在不少情形下&#xff0c;服务器管理员能够化解此难题&…

算法刷题Day11: BM33 二叉树的镜像

点击题目链接 思路 转换为子问题&#xff1a;左右子树相反转。遍历手法&#xff1a;后序遍历 代码 class Solution:def Transverse(self,root: TreeNode):if root None:return rootnewleft self.Transverse(root.left)newright self.Transverse(root.right)# 对root节点…

【项目】基于YOLOv10的目标检测项目

【项目】基于YOLOv10的目标检测项目 &#xff08;一&#xff09;模型性能&#xff08;二&#xff09;安装与使用&#xff08;1&#xff09;环境安装&#xff08;2&#xff09;快速使用&#xff08;3&#xff09;模型评估Validation&#xff08;4&#xff09;模型训练Training&a…

与火山引擎合作深化,观测云携一站式监控解决方案登陆万有商城

近日&#xff0c;观测云正式宣布入驻火山引擎的万有商城。作为一款全栈式数据观测与分析平台&#xff0c;观测云的加入不仅丰富了火山引擎生态&#xff0c;也为广大企业用户带来了更便捷的数字化工具&#xff0c;助力企业快速实现业务监控与优化。 从全球覆盖到本地深耕&#x…

计算机网络原理之HTTP与HTTPS

一、前言 为了理解HTTP&#xff0c;我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信&#xff0c;双方必须基于相同的方法。比如&#…

java注解(二):注解的解析以及应用场景、用注解和反射模拟junit框架代码演示

目录 1、什么是注解的解析&#xff1f; 2、解析注解的案例 1、自定义一个注解 2、在类和方法上使用自己定义的注解 3、解析注解 3、模拟Junit框架案例 1、自定义一个MyTest注解 2、定义一个测试类&#xff0c;使用自定义的注解 3、写一个启动类 本文章主要讲解什么是注…

15.三数之和

给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 示例 1&am…

03_Webpack模块打包工具

03_Webpack模块打包工具 目录 知识点自测 以下哪个选项是 ECMAScript 默认导出和导入的语法&#xff1f; A&#xff1a;export 和 require B&#xff1a;module.exports {} 和 import 变量名 C&#xff1a;export default 和 import 变量名 D&#xff1a;export 和 import {…

实验七 用 MATLAB 设计 FIR 数字滤波器

实验目的 加深对窗函数法设计 FIR 数字滤波器的基本原理的理解。 学习用 Matlab 语言的窗函数法编写设计 FIR 数字滤波器的程序。 了解 Matlab 语言有关窗函数法设计 FIR 数字滤波器的常用函数用法。 掌握 FIR 滤波器的快速卷积实现原理。 不同滤波器的设计方法具有不同的优…

day07 接口测试(2)

目录 1、接口用例设计 1.1 接口测试的测试点 1.1.1 功能测试 &#xff01;&#xff01; &#xff08;1&#xff09;单接口功能&#xff1a; &#xff08;见1.3&#xff09; &#xff08;2&#xff09;业务场景功能:&#xff08;见1.4&#xff09; 1.1.2 性能测试&#xf…

CentOS 二进制安装部署MongoDB 4.0

一、安装MongoDB 1. 下载 MongoDB 二进制文件 前往 MongoDB 官方下载页面(https://www.mongodb.com/try/download/community) 选择对应版本的 tar 包。 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.28.tgz 2. 解压并移动至目标目录 解压文件&#xff…

《Scientific Reports》2024最新投稿经验

"Scientific Reports" 是Nature Portfolio旗下一本备受推崇的开放获取多学科期刊&#xff0c;自2011年起被JCR收录。这本月刊致力于发表自然科学、心理学、医学和工程学领域的突破性原创研究。它的收稿范围广泛&#xff0c;覆盖物理学、化学、生物学、地球科学、环境…

C++内存布局以及常用关键字

C内存布局以及常用关键字 C的内存空间 代码存储区域&#xff1a;常量区、代码区、静态区&#xff08;全局区&#xff09;、堆区、栈区 栈区向下增长&#xff0c;堆区向上增长。栈由系统管理&#xff0c;没有内存碎片&#xff0c;每个元素之间都是连续的&#xff0c;大小比较…

设计模式:19、桥接模式

目录 0、定义 1、桥接模式的四种角色 2、桥接模式的UML类图 3、示例代码 0、定义 将抽象部门与实现部分分离&#xff0c;使它们都可以独立地变化。 1、桥接模式的四种角色 抽象&#xff08;Abstraction&#xff09;&#xff1a;一个抽象类&#xff0c;包含实现者&#xf…

Linux中文件操作

文件由文件内容和文件属性构成&#xff0c;因此对文件的操作就是对文件内容或文件属性的操作。所谓的“打开一个文件”就是将文件的属性或内容加载到内存中&#xff0c;而没有被打开的文件存在于磁盘上。打开的文件称作“内存文件”&#xff0c;未被打开的文件称作“磁盘文件”…

elasticsearch基础总结

最近实习&#xff0c;项目用的elasticseatch做的存储库&#xff0c;但是之前对于es接触的不多&#xff0c;查询语法有些不熟&#xff0c;每次想写个DSL查询时都要gpt或者施展搜索大法&#xff0c;所以索性就自己总结总结&#xff0c;以后忘了也方便查。所以这篇文章会持续更新。…

c++ map对其值排序

无法直接排序,转换成vector<std::pair<string,int>> #include <iostream> #include <map> #include <vector> #include <algorithm>// 用于排序的比较函数 bool compareByValue(const std::pair<std::string, int>& a, const …