【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

定义

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

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

 res = localFunc(req)

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

res = remoteFunc(req)

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

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

值得注意的是,虽然大部分 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.tpcf.cn/diannao/63305.html

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

相关文章

利用R包QstFstComp包进行Qst-Fst分析

1.Qst-Fst分析 安装和加载QstFstComp包 首先&#xff0c;你需要安装devtools包&#xff0c;如果尚未安装&#xff0c;可以使用以下命令安装&#xff1a; install.packages("devtools") 2. 然后&#xff0c;使用devtools安装QstFstComp包&#xff1a;R library(de…

视频自学笔记

一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像&#xff0c;以前所接触的电影、电视都是模拟信号&#xff0c;之所以将它们称为模拟信号&#xff0c;是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…

操作系统——大容量存储结构

笔记内容及图片整理自XJTUSE “操作系统” 课程ppt&#xff0c;仅供学习交流使用&#xff0c;谢谢。 大容量存储结构概述 磁盘 磁盘为现代计算机系统提供大量外存。每个盘片为平的圆状&#xff08;类似CD&#xff09;&#xff0c;普通盘片直径为4.5~9.0厘米。盘片的两面都涂着…

Python 正则表达式常用特殊字符及其含义

以下是 Python 正则表达式常用特殊字符及其含义 的全面整理&#xff0c;涵盖了常见和重要的正则符号&#xff0c;以及它们的示例&#xff0c;适合用来写博客或学习使用&#xff1a; Python 正则表达式常用特殊字符及其含义 1. . (点号) 含义&#xff1a;匹配除换行符 \n 以外…

子类调用父类同名方法和属性

1、全量代码 class Master:def __init__(self):self.kongfu [古法煎饼果子配方]print(fMaster_self:{self})def make_cake(self):print(f运用{self.kongfu}制作煎饼果子)class School():def __init__(self):self.kongfu [学校煎饼果子配方]print(fSchool_self:{self})def m…

Java Serializable 序列化

Java的Serializable接口是Java序列化机制的核心&#xff0c;它允许一个对象的状态被转换为字节流&#xff0c;从而可以方便地进行存储或传输。 序列化后的对象可以被写到数据库、存储到文件系统&#xff0c;或者通过网络传输。 要在 Java 中使一个类可序列化&#xff0c;你需要…

CSS一些小点 —— 12.7

1. box-sizing: border-box box-sizing 属性&#xff0c;默认值为 content-box box-sizing: border-box 使padding和border的值不会再影响元素的宽高&#xff1b;padding和border的值算在指定宽高的内部&#xff08;但是外边距依然算做外部&#xff09; 2. overflow: hidden …

【GESP】C++一级练习 luogu-P1425, 小鱼的游泳时间

GESP一级综合练习&#xff0c;主要涉及时间计算&#xff0c;难度★☆☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-1-luogu-p1425/ 【GESP】C一级练习 luogu-P1425, 小鱼的游泳时间 | OneCoderGESP一级综合练习&#xff0c;主要涉及时间计算&#xff0c;难…

【网络协议栈】数据链路层(内附手画分析图 简单易懂)以太网、MAC地址、局域网、交换机、MTU、ARP协议

每日激励&#xff1a;【无限进步】“梦想可以大&#xff0c;但第一步总是小” 绪论​&#xff1a; 本章将开始到达TCP/IP协议中的最后一层数据链路层&#xff0c;本章将会写到我们日常中常见的局域网以及认识数据链路层中非常重要的协议ARP协议&#xff0c;后续还将进行更新网络…

docker怎么commit tag push?

在 Docker 中&#xff0c;commit、tag 和 push 是用于创建和推送自定义镜像到仓库的三个不同步骤。以下是每个命令的详细说明和使用方法&#xff1a; ### 1. docker commit 当你对一个运行中的容器做了修改&#xff0c;并希望将这些修改保存为一个新的镜像时&#xff0c;可以使…

Java多线程与线程池技术详解(四)

接受失败&#xff1a;“失败是什么&#xff1f;没有什么&#xff0c;只是更走近成功一步&#xff1b;成功是什么&#xff1f;就是走过了所有通向失败的路&#xff0c;只剩下一条路&#xff0c;那就是成功的路。”这句话很好地诠释了如何看待失败的问题&#xff0c;即每一次跌倒…

二叉树的深搜(不定期更新。。。。。)

二叉树的深搜 验证二叉搜索树 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉…

51c嵌入式~单片机合集3

我自己的原文哦~ https://blog.51cto.com/whaosoft/12581900 一、STM32代码远程升级之IAP编程 IAP是什么 有时项目上需要远程升级单片机程序&#xff0c;此时需要接触到IAP编程。 IAP即为In Application Programming&#xff0c;解释为在应用中编程&#xff0c;用户自己的程…

使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available

前言 最近在使用OLT的DHCP Server的时候发现一些异常现象&#xff0c;就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到&#xff0c;导致其他服务器也发了offer包&#xff0c;ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE&#xff0c;后面查到使…

02 conda常用指令

目录 命令快速查找命令详细解释列出当前conda中存在的解释器环境使用指定的解释器环境创建虚拟环境激活自己创建的虚拟环境虚拟环境删除切换回主环境找到你计算机中安装的miniconda3的跟目录找到虚拟环境的目录选择需要删除的虚拟环境文件夹确认环境是否删除 补充删除虚拟环境指…

BEVFormer详细复现方案

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

应用案例 | 船舶海洋: 水下无人航行器数字样机功能模型构建

水下无人航行器数字样机功能模型构建 一、项目背景 为响应水下装备系统研制数字化转型及装备系统数字样机建设的需要&#xff0c;以某型号水下无人航行器&#xff08;Underwater Unmanned Vehicle&#xff0c;UUV&#xff09;为例&#xff0c;构建UUV数字样机1.0功能模型。针对…

npm (Node Package Manager) 简介

npm 是 Node.js 的默认包管理工具&#xff0c;用于管理和分发JavaScript库和工具。它允许开发者轻松安装、更新、配置和卸载这些包。npm 提供了一个命令行客户端&#xff0c;同时也维护着一个大型的在线软件注册表&#xff08;npm registry&#xff09;&#xff0c;其中包含了成…

【NIPS2024】Unique3D:从单张图像高效生成高质量的3D网格

背景&#xff08;现有方法的不足&#xff09;&#xff1a; 基于Score Distillation Sampling &#xff08;SDS&#xff09;的方法&#xff1a;从大型二维扩散模型中提取3D知识&#xff0c;生成多样化的3D结果&#xff0c;但存在每个案例长时间优化问题/不一致问题。 目前通过微…

手机LCD分区刷新技术介绍

分区刷新也称为分区变频&#xff0c;LCD分区刷新功能的目的是将屏幕分为上下半区&#xff0c;分区显示不同帧率&#xff0c;上方区块High Frame Rate&#xff0c;下方区块Low Frame Rate。使用者可以动态自定义上方高刷显示区的结尾位置。 当前的智能手机屏幕上&#xff0c;显示…