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

news2025/1/10 23:33:39

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

当前联邦生产集群的各个子集群只有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 RpcRequest
  enum OperationProto {
    RPC_FINAL_PACKET        = 0; // The final RPC Packet
    RPC_CONTINUATION_PACKET = 1; // not implemented yet
    RPC_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 response
  required bytes clientId = 4; // Globally unique client ID
  // clientId + callId uniquely identifies a request
  // retry count, 1 means this is the first retry
  optional sint32 retryCount = 5 [default = -1];
  optional RPCTraceInfoProto traceInfo = 6; // tracing info
  optional RPCCallerContextProto callerContext = 7; // call context
  optional 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 succeeded
   ERROR = 1;    // RPC or error - connection left open for future calls
   FATAL = 2;    // Fatal error - connection closed
  }

  enum RpcErrorCodeProto {

   // Non-fatal Rpc error - connection left open for future rpc calls
   ERROR_APPLICATION = 1;      // RPC Failed - rpc app threw exception
   ERROR_NO_SUCH_METHOD = 2;   // Rpc error - no such method
   ERROR_NO_SUCH_PROTOCOL = 3; // Rpc error - no such protocol
   ERROR_RPC_SERVER  = 4;      // Rpc error on server side
   ERROR_SERIALIZING_RESPONSE = 5; // error serializign response
   ERROR_RPC_VERSION_MISMATCH = 6; // Rpc protocol version mismatch


   // Fatal Server side Rpc error - connection closed
   FATAL_UNKNOWN = 10;                   // unknown Fatal error
   FATAL_UNSUPPORTED_SERIALIZATION = 11; // IPC layer serilization type invalid
   FATAL_INVALID_RPC_HEADER = 12;        // fields of RpcHeader are invalid
   FATAL_DESERIALIZING_REQUEST = 13;     // could not deserilize rpc request
   FATAL_VERSION_MISMATCH = 14;          // Ipc Layer version mismatch
   FATAL_UNAUTHORIZED = 15;              // Auth failed
  }

  required uint32 callId = 1; // callId used in Request
  required RpcStatusProto status = 2;
  optional uint32 serverIpcVersionNum = 3; // Sent if success or fail
  optional string exceptionClassName = 4;  // if request fails
  optional string errorMsg = 5;  // if request fails, often contains strack trace
  optional RpcErrorCodeProto errorDetail = 6; // in case of error
  optional bytes clientId = 7; // Globally unique client ID
  optional 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.coloradmin.cn/o/2254970.html

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

相关文章

计算机运行时提示错误弹窗“由于找不到 quazip.dll,无法继续执行代码。”是什么原因?“quazip.dll文件缺失”要怎么解决?

计算机运行时错误解析&#xff1a;解决“quazip.dll缺失”问题指南 在软件开发和日常计算机使用中&#xff0c;我们经常会遇到各种运行时错误。今天&#xff0c;我们将深入探讨一个常见的错误提示&#xff1a;“由于找不到quazip.dll&#xff0c;无法继续执行代码。”这一弹窗…

NuHertz/HFSS: 使用矩形、径向和阻抗短截线的平面 LPF 切比雪夫-II 实现

我们今天的主题是使用 NuHertz 和 HFSS 设计 Microstrip Lowpass Chebyshev-Type2 滤波器。切比雪夫 2 型在通带中具有平坦的响应&#xff0c;在阻带中具有波纹。我们将比较 NuHertz 中的不同选项。 低通滤波器由集总 L 和 C 组件制成。这种方法很难用于高频应用程序。高频滤波…

SpringBoot整合knife4j,以及会遇到的一些bug

这篇文章主要讲解了“Spring Boot集成接口管理工具Knife4j怎么用”&#xff0c;文中的讲解内容简单清晰&#xff0c;易于学习与理解&#xff0c;下面请大家跟着小编的思路慢慢深入&#xff0c;一起来研究和学习“Spring Boot集成接口管理工具Knife4j怎么用”吧&#xff01; 一…

高效的 Java 对象映射库“Orika”

什么是 Orika Orika 是一个高效的 Java 对象映射库&#xff0c;专门用于简化 Java 应用程序中对象之间的转换。它以自动化和优化的方式将一个对象的属性映射到另一个对象&#xff0c;从而减少了手动编写重复代码的需要。Orika 特别适合处理复杂的对象结构以及数据传输对象 &am…

汽车总线协议分析-CAN-FD总线

随着汽车功能的增多&#xff0c;各ECU之间的信息交互也越来越频繁&#xff0c;导致总线负载持续走高&#xff0c;CAN2.0报文只有约40%-50%带宽实际用于数据传输&#xff0c;响应机制易受车内布线的物理特性限制&#xff0c;如广播延迟、导线延迟等&#xff0c;CAN的局限性也逐渐…

【JavaEE】多线程(6)

一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态&#xff0c;在这种状态下&#xff0c;CPU只能执行用户态下的指令&#xff0c;并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态&#xff0c;内核是计算机系统的核心部分&#xff0c;CPU可以执行所有…

故障处理--kuboard无法访问,etcd磁盘空间不足

问题现象&#xff1a; kuboard页面报错 排查过程&#xff1a; 1、查看kuboard是否正常。 2、查看kuboard容器的日志&#xff1a; docker logs -f --tail10 kuboard 大概内容如下&#xff1a; levelerror msg"failed to rotate keys: etcdserver: mvcc: database sp…

unity3d—demo(实现给出图集名字和图片名字生成对应的图片)

目录 实现给出图集名字和图片名字生成对应的图片&#xff1a; 代码示例&#xff1a; dic: 键 是图集名称 值是一个字典 该字典键是图片名称 值是图片&#xff0c;结构如图&#xff1a; 测试代码&#xff1a; 结果&#xff1a; SpriteRenderer 讲解&#xff1a; Resour…

工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet

论文&#xff1a;https://arxiv.org/pdf/2311.14897v3.pdf 项目&#xff1a;https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位&#xff0c;这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…

WPF编写工业相机镜头选型程序

该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…

springai结合ollama

目录 ollama 介绍 使用 下载&#xff1a; 安装&#xff1a; 点击这个玩意next就行了。 运行 spring ai使用ollama调用本地部署的大模型 加依赖 配置yml 写代码 ollama 介绍 官网&#xff1a;Ollama Ollama是一个用于部署和运行各种开源大模型的工具&#xff1b; …

Linux 统信UOS 设置程序“桌面快捷方式”与“开机自启动”

最近在统信uos系统 arm64架构上进行QT程序的开发&#xff0c;基本开发完毕后&#xff0c;开始着手准备程序的开机自启动模块&#xff0c;因为一般来说&#xff0c;程序在客户现场使用都是需要开机自启的。 然后在百度海淘&#xff0c;很少有这类相关的博客介绍&#xff0c;有一…

WiFi受限不再愁,电脑无网络快速修复指南

有时在试图连接WiFi时&#xff0c;会发现网络连接受限&#xff0c;或无法正常访问互联网。这种情况不仅影响了工作效率&#xff0c;还可能错过重要的信息。那么&#xff0c;究竟是什么原因导致了电脑WiFi连接受限呢&#xff1f;又该如何解决这一问题呢&#xff1f;小A今天就来教…

java注解(一):什么是注解?什么是元注解?如何自定义注解?注解的原理是什么?

目录 1、什么是注解&#xff1f; 2、什么是元注解 1、Target() 2、Retention() 3、Documented 4、Inherited 3、如何自定义注解以解使用 4、注解的原理 本篇文章主要是介绍注解的概念、原理&#xff0c;以及通过代码演示4种元注解、如何自定义注解。通过反编译的形式进…

【Docker】Linux与Windows系统安装Docker+Docker上简单安装MySQL

一、Windows安装Docker 由于我在许多平台搜索Windows下安装Docker的方法&#xff0c;都提到了Win10家庭版无法直接安装Docker。个人电脑就是Win10家庭版&#xff0c;本着实践出真知的想法&#xff0c;个人在本机Win10家庭版实验结果为需要采用下述传统手动安装的办法&#xff…

阿里云整理(二)

阿里云整理 1. 访问网站2. 专业名词2.1 域名2.2 域名备案2.3 云解析DNS2.4 CDN2.5 WAF 1. 访问网站 用户使用浏览器访问网站大体分为几个过程&#xff1a; 用户在浏览器输入域名URL&#xff0c;例如www.baidu.com。 不过&#xff0c;浏览器并不知道为该域名提供服务的服务器具…

Robust Depth Enhancement via Polarization Prompt Fusion Tuning

paper&#xff1a;论文地址 code&#xff1a;github项目地址 今天给大家分享一篇2024CVPR上的文章&#xff0c;文章是用偏振做提示学习&#xff0c;做深度估计的。模型架构图如下 这篇博客不是讲这篇论文的内容&#xff0c;感兴趣的自己去看paper&#xff0c;主要是分享环境&…

Oceanbase离线集群部署

准备工作 两台服务器 服务器的配置参照官网要求来 服务器名配置服务器IPoceanbase116g8h192.168.10.239oceanbase216g8h192.168.10.239 这里选oceanbase1作为 obd机器 oceanbase安装包 选择社区版本的时候自己系统的安装包 ntp时间同步rpm包 联网机器下载所需的软件包 …

Ajax:回忆与节点

一点回忆 面对我的Ajax学习&#xff0c;实现前后端交互&#xff0c;最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法&#xff0c;然后最终成功&#xff0c;然后按照相关教程配置java ee项目&#xff0c;然后中间又去配置了Tomcat服务器&#xff0c;然后又去学习了一…

《鸣潮》运行时电脑提示“d3dx9_41.dll丢失”是什么原因?“缺失d3dx9_41.dll文件”的解决方法和预防方案

游戏运行时文件丢失与报错解决方案&#xff1a;《鸣潮》提示“d3dx9_41.dll丢失”怎么办&#xff1f; 大家好&#xff0c;我是一名在软件开发领域有着丰富经验的从业者。在游戏爱好者的世界里&#xff0c;遇到游戏运行时提示文件丢失或损坏的情况并不少见。今天&#xff0c;我…