Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hbase 调优之 RPC

Hbase 调优之 RPC

原创
作者头像
liubang01
修改于 2017-07-27 03:44:31
修改于 2017-07-27 03:44:31
6.3K0
举报

导语:hbase作为hadoop生态的一部分,在越来越多的大数据方面得到了应用,但是如何用好它是一个比较考究的过程,本文暂时先研究了hbaserpc部分的代码,rpc作为调用的入口,先从入口处明白原理以及内部实际控制参数进行调整来满足自己的以为需要

HBase 采用了和 Hadoop 相同的 RPC 机制,作为它的主要通信手段.这是一个轻量的,不同于 Java 标准的 RMI 的一种方式,HBase RPC 有明显的客户端和服务端之分。由 HBase Client,Region server, Master server 三者组成了三个信道。最右边的一列是通信两端之间约定的通信接口。客户端调用这个接口,而服务端实现这个接口。所以最基本的工作流程就是: 

(1)客户端取得一个服务端通信接口的实例

(2)客户端调用这个实例中的方法 

(3)客户端向服务端传输调用请求 

(4)服务端接口实现被调用 

(5)服务端向客户端传输结果

HbaseRPC 结构如下:

Hbase 的协议文件位于源码的 hbase-protocol 模块下,1.1.3 版本的协议文件如下:

HBaseRPC 服务端处理流程

Hbase 服务端 rpc 服务接口为类 RpcServerInterface,其具体实现类为 RpcServer,其服务端 rpc 总体架构如下图

Listener

JavaNIO 线程以 reactor 模式负责接受网络请求,其核心源码如下

代码语言:txt
AI代码解释
复制
while (running) {

        SelectionKey key = null;

        try {

          selector.select(); // FindBugs IS2_INCONSISTENT_SYNC

          Iterator<SelectionKey> iter = selector.selectedKeys().iterator();

         while (iter.hasNext()) {

            key = iter.next();

            iter.remove();

            try{

              if (key.isValid()) {

                if (key.isAcceptable())

                  doAccept(key);

              }

            } catch (IOException ignored) {

              if (LOG.isTraceEnabled()) LOG.trace("ignored", ignored);

            }

            key = null;

          }

        }

 

void doAccept(SelectionKey key) throws IOException, OutOfMemoryError {

      Connection c;

      ServerSocketChannel server = (ServerSocketChannel) key.channel();

 

      SocketChannel channel;

      while ((channel = server.accept()) != null) {

       try {

          channel.configureBlocking(false);

          channel.socket().setTcpNoDelay(tcpNoDelay);

          channel.socket().setKeepAlive(tcpKeepAlive);

        } catch (IOException ioe) {

          channel.close();

          throw ioe;

        }

 

        Reader reader = getReader();

       try {

          reader.startAdd();

          SelectionKey readKey = reader.registerChannel(channel);

          c = getConnection(channel, System._currentTimeMillis_());

          readKey.attach(c);

          synchronized (connectionList) {

            connectionList.add(numConnections, c);

            numConnections ;

          }

          if (LOG.isDebugEnabled())

            LOG.debug(getName() ": connection from " c.toString() 

                "; # active connections: " numConnections);

        } finally {

          reader.finishAdd();

        }

      }

    }

从源码中可以看出,其主要职责就是负责接受网络请求并把链接转给 Reader

Reader

reader 主要职责是从网络链接里读取数据并把数据封装成 call 交给 rpcschedule 进行调度,

其调用链路如下:

doread 方法会依次调用 Connection 对象的 readAndProcess、process、processOneRpc、processRequest 方法完成协议的解析以及需要调用服务端的那个方法,因为传输协议为 protobuf 因此服务端提供服务的 service 都必须实现 BlockingService 接口,如果是调用 regionserver 那么对应的实现类为 RSRpcServices,在查找到要调用的方法后把服务封装为一个 Call 对象交给 rpcschedule 进行调度。

RpcScheduler

RpcScheduler 实现了对接受到的 rpc 请求进行调度,hbase 的 rpc 调度器有两个分别是 FifoRpcScheduler 和 SimpleRpcScheduler,区别是 fifo 是先进先出调度,而 SimpleRpcScheduler 是按照优先级进行调度的,hbase 默认使用了 SimpleRpcScheduler 调度器,可以通过参数 hbase.region.server.rpc.scheduler.factory.class 进行修改。

RpcExecutor

RpcExecutor 真正负责调度执行 call 对象,其调用链路如下图

如上图,hbase 的 RpcExecutor 分为 BalancedQueueRpcExecutor 和 RWQueueRpcExecutor,分别是平衡队列调度和读写因子调度队列,在 rpc 请求加入到 RpcExecutor 后 RpcExecutor 会按照规则进行调度,请求最终会调用 call 即调用业务方法,最后把响应通过 Respoder 返回给客户端。hbase 在最外层分为 3 个 RpcExecutor,每种 Executor 都有一定的线程数来处理队里里的请求,调度器中的 3 个 RpcExecutor 分别是

  • callExecutor
  • priorityExecutor 
  •  replicationExecutor

callExecutor 具体是那种类型取决与参数 hbase.ipc.server.callqueue.handler.factor,默认是 0,如设置该值后为 RWQueueRpcExecutor 否则为 BalancedQueueRpcExecutor,priorityExecutor 和 replicationExecutor 为 BalancedQueueRpcExecutor,如果其封装的请求是基于 meta 表格的操作,将其划分到 priorityExecutor 组里;如果其封装的请求是基于用户表格的操作,将其划分到 callExecutor 组里;如果其封装的是 replication 请求,将其划分到 replicationExecutor 组里。每个调度池分一到多个队列,默认都是一个队列,这样产品组中的所有 Handler 都会去竞争该队列中的资源,为了防止竞争惨烈的情况发生,可将每一个产品组划分成多个产品队列,让每个 Handler 只去抢占指定队列中的资源。在 HRegionServer 中,可通过如下方法来计算 callExecutor 组可以划分成多少个产品队列:

Math.max(1,hbase.regionserver.handler.count*hbase.ipc.server.callqueue.handler.factor)

其中 hbase.ipc.server.callqueue.handler.factor 属性值默认为 0,即在默认情况下只将该产品组划分成一个产品队列,单个产品队列的容量并不是按需使用无限增长的,HBase 对其长度及空间大小都做了相应的阀值控制,其中:hbase.ipc.server.max.callqueue.length 用于限制产品队列的长度(默认为 handler 数乘以 10),hbase.ipc.server.max.callqueue.size 用于限制产品队列的空间大小(默认为 1G),成功将 CallRunner 产品分配给 Handler 之后,该 Handler 开始对其进行消费处理,消费过程主要是通过调用 RpcServer 的 call 方法来执行指定服务的相应方法,并通过 Responder 将方法的执行结果返回给客户端。

如果 hbase.ipc.server.callqueue.handler.factor 为 0,那么 callExecutor 池 BalancedQueueRpcExecutor,如果 hbase.ipc.server.callqueue.handler.factor 大于 0,那么池的 executor 为 RWQueueRpcExecutor,该 executor 中分为 3 个队列:write,read 和 scan,分别通过参数 hbase.ipc.server.callqueue.read.ratio 和参数 hbase.ipc.server.callqueue.scan.ratio 进行控制,其中 hbase.ipc.server.callqueue.handler.factor 用来控制队列个数

HbaseRPC 比较重要的参数

hbase.ipc.server.read.threadpool.size

默认值 10,Reader 网络 IO 个数,reader 的个数决定了从网络 io 里读取数据的速度也就是网络吞吐量

hbase.ipc.server.tcpnodelay

默认值值 true

hbase.ipc.server.tcpkeepalive

默认值 true

hbase.regionserver.handler.count

regionserver 的 rcp 请求队列处理线程数,默认为 30

hbase.regionserver.metahandler.count

regionserver 操作系统表 rpc 请求处理线程数,默认为 20

hbase.ipc.server.max.callqueue.length

call 队列最大长度,默认值为 handler 的个数*10

hbase.ipc.server.callqueue.handler.factor

改值决定了 regionserver 的 rpcexecutor 的类型,如果大于 0,那么 rpcexecutor 为读写分别调度,改值为厚点数,该值要配合参数 hbase.ipc.server.callqueue.read.ratio 联合使用(其中还需要设置参数 hbase.ipc.server.callqueue.scan.ratio),含义是 hbase 支持 put、get、scan 分开调度,可以结合自己的业务场景来控制读写

hbase.rpc.timeout

客户端 rpc 调用超时时间,默认为 5 分钟

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从源码中分析 Hadoop 的 RPC 机制
RPC是Remote Procedure Call(远程过程调用)的简称,这一机制都要面对两个问题 对象调用方式; 序列/反序列化机制 在此之前,我们有必要了解什么是架构层次的协议。通俗一点说,就是我
Star先生
2017/07/28
2.5K0
从源码中分析 Hadoop 的 RPC 机制
Hbase源码系列之regionserver应答数据请求服务设计
一,基本介绍 Hbase源码系列主要是以hbase-1.0.0为例讲解hbase源码。本文主要是将Regionserver服务端RPC的结构及处理流程。希望是帮助大家彻底了解hbase Regionserver的内部结构。 本文会涉及Regionserver端接受客户端链接,处理读事件,交由调度器去执行,然后由Responder将结果返回给客户端整个过程。 建议大家多读读浪尖前面关于JAVA网络IO模型相关文章<JAVA的网络IO模型彻底讲解>和kafka的<Kafka源码系列之Broker的IO服务及业务
Spark学习技巧
2018/01/30
1.8K0
Hbase源码系列之regionserver应答数据请求服务设计
Hbase1.3 生产优化,源码分析
regionserver服务端使用的ReadQueues,WriteQueues,ScanQueues来代替传统线程池处理客户端读写请求,每个对列都有对等比例的线程hbase.regionserver.handler.count消费队列,负载均衡策咯比如ReadQueues使用的随机策咯getNextQueue.ThreadLocalRandom.current().nextInt(queueSize)
857技术社区
2022/05/17
3990
RegionServer RPC队列请求数较大
在EMR控制台进入“集群监控”,点击“DashBoard”,点击 “集群服务” --> HBASE --> 角色管理 -->RegionServer
用户9559193
2022/09/01
6850
Hadoop-Yarn源码-RPC基础
一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式程序在内的应用程序更加轻易。 (Hadoop 2.6版本)
Dlimeng
2023/06/30
2730
Hadoop-Yarn源码-RPC基础
hadoop源码解析之RPC分析
因为hadoop底层各种通讯都用的是rpc,如client和namenode、client和datanode、namanode和datanode等。所以首先学习了一下hadoop rpc的内部实现,拜读了一下hadoop的源码
大数据技术与应用实战
2020/09/15
2870
hadoop源码解析之RPC分析
EMR之HBASE集群参数调优与压测
HBase 是Hadoop生态里重要一员。对HBase的调优,对节约成本,提升用户体验有重要意义。
fastio
2018/05/28
2K3
EMR之HBASE集群参数调优与压测
如何避免HBase写入过快引起的各种问题
client api ==> RPC ==> server IPC ==> RPC queue ==> RPC handler ==> write WAL ==> write memstore ==> flush to filesystem
加米谷大数据
2018/07/25
1.2K0
HBase写入过快性能分析及调优
整个写入流程从客户端调用API开始,数据会通过protobuf编码成一个请求,通过scoket实现的IPC模块被送达server的RPC队列中。最后由负责处理RPC的handler取出请求完成写入操作。写入会先写WAL文件,然后再写一份到内存中,也就是memstore模块,当满足条件时,memstore才会被flush到底层文件系统,形成HFile。
大数据技术架构
2019/08/16
2.5K0
Hbase 源码分析之 Get 流程及rpc原理
分析版本为hbase 0.94 附上趋势团队画的图: rpc角色表: HBase通信信道 HBase的通信接口 客户端 服务端 HBase Client Master Server HMasterInterface HBase Client Region Server HRegionInterface Region Server Master Server HMasterRegionInterface 客户端发起请求: htable.get(Get) public Resul
架构师刀哥
2018/03/20
2.4K0
Hadoop总结篇之四---底层通信是怎么做到的
上一篇介绍了一个job的提交过程。期间多次提到通信协议。那么协议是什么? 协议其实就是通信的双方所遵守的一套规范,这套规范规定了通信时传输的数据的固定的格式。 4.1 RPC协议:在hadoop中,我们采用的是RPC协议。 该协议主要包含四个部分: 序列化层:协议中的参数采用Protocol Buffers来序列化/反序列化。 这个Protocol Buffers是一种数据存储格式,可以理解我们按照其语法格式定义一个数据结构类model,然后使用工具(Protocol Buffers编译器)编译为我们所使用
小端
2018/04/16
8040
Hadoop总结篇之四---底层通信是怎么做到的
hbase问题总结
 1 java.io.IOException: java.io.IOException: java.lang.IllegalArgumentException: offset (0) + length (8) exceed the capacity of the array: 4 做简单的incr操作时出现,原因是之前put时放入的是int  长度为 vlen=4 ,不适用增加操作,只能改为long型 vlen=8 2 写数据到column时 org.apache.hadoop.hbase.client.R
架构师刀哥
2018/03/20
3.8K0
HBase默认配置文件 hbase-default.xml 注释解析
HBase默认配置文件注释解析: hbase-default.xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="co
黑泽君
2019/03/15
2.5K0
HBase集群服务端replication CallQueue被打满
regionserver日常信息如上图所示,很明显服务端的replication  CallQueue被打满是因为
stevenxi
2022/08/24
8340
Ubuntu下HBase数据库的安装和配置文件详解
1.从http://www.apache.org/dyn/closer.cgi/hbase/下载稳定版安装包,我下的是hbase-1.2.6-bin.tar.gz
星哥玩云
2022/08/17
1.2K0
Hbase源码系列之scan源码解析及调优
一,hbase的scan基本使用问题介绍 Hbase的Scan方法是基于Rowkey进行数据扫描的,过程中client会将我们的请求,转化为向服务端的RPC请求。那么这个时候我们可以考虑的优化,那么主要有一下三点: A,减少带宽(通过过滤器减少无用数据的 传输); B,减少RPC请求的次数; C,加缓存。 具体的转化为scan相关的操作如下: 1,scan可以设置过滤器 过滤器可以减少数据网络传输的数据量。 过滤器可以用来扫描ROWkey不连续的数据。 2,scan可以设置每批次的扫描行数 Scan.set
Spark学习技巧
2018/01/30
2.6K0
HBase生产环境优化不完全指南
HBase集群一旦部署使用,再想对其作出调整需要付出惨痛代价,所以如何部署HBase集群是使用的第一个关键步骤。
王知无-import_bigdata
2020/04/02
1.8K0
Haodoop RPC解析
RPC是对外的接口类,主要提供两个方法:getProxy和getServer。
一见
2018/08/06
4540
Haodoop RPC解析
Hbase集群搭建及所有配置调优参数整理及API代码运行
  最近为了方便开发,在自己的虚拟机上搭建了三节点的Hadoop集群与Hbase集群,hadoop集群的搭建与zookeeper集群这里就不再详细说明,原来的笔记中记录过。这里将hbase配置参数进行相应整理,方便日后使用。
用户3003813
2018/09/06
1.3K0
Hbase集群搭建及所有配置调优参数整理及API代码运行
HBase行锁探索
https://github.com/sgp2004/JavaTools 代码地址 HBase客户端的行锁会对相同rowkey的读写造成很大影响,同一个进程并发更新rowkey的计数有可能造成阻塞(场景 热门短链点击增加 热门微博评论数). 例如一个线上问题: 转发微博 抱歉,此微博已被作者删除。查看帮助:http://t.cn/zWSudZc | 转发| 收藏| 评论 所有被删除的微博里短链被引用的计数要减一,结果因为微博内容删除,只剩一个帮助短链,计数都减到帮助短链里,导致服务器响应缓慢 分析行锁关
架构师刀哥
2018/03/20
1.5K0
相关推荐
从源码中分析 Hadoop 的 RPC 机制
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档