HBase解决Region Server Compact过程占用大量网络出口带宽的问题

HBase 0.92版本之后,RegionServer的Compact过程根据待合并的文件大小分为smallcompaction和large compaction两种,由此可能导致在集群写入量大的时候Compact占用过多的网络出口带宽。本文将详细描述集群使用过程中遇到这一问题的排查过程及其解决方法。

1. 发现问题

HBase集群(版本为0.94.0)运行过程中,发现5台Region Server的网络出口带宽经常维持在100MB/s以上,接近到网卡的极限;同时Region Server的机器load负载也很高,高峰时候能够达到30~50。

2. 排查问题

1、集群实际运行过程中,观察到RegionServer服务端的网卡,平均每台写入流量大概60MB/s(此时写入量已经很大了);读出流量90MB/s,有时甚至突破100MB/s(注:每台机器都是千兆网卡);

2、观察实际的写入数据量在每秒5w tps左右,单条记录平均大小为1KB,大概会占用50MB/s左右的网卡入口带宽请求量,和观察到的现象一致;

3、观察查询量在每秒6w qps左右,单条记录平均大小为1KB,大概会占用60MB/s左右的网卡出口带宽请求量,奇怪的是实际观察到有接近甚至超过100MB/s的网络出口带宽请求量,多出了40MB/s左右的网络出口带宽;

4、经分析排查确定导致上述过程的原因,可能是HBase服务端由于写入量过大频繁触发compaction过程,而compaction是需要读HBase数据的,因此占据了相当部分的网络出口带宽;

5、结合对相关源码org/apache/hadoop/hbase/regionserver/CompactSplitThread.java的分析,决定对HBase集群配置做出变更(具体见下一小节),主要目的是减少compaction的发生;

6、接下来,观察到RegionServer的网络利用率明显降低,一般进出口带宽能维持在70MB/s以下。

3. 解决问题

HBase 0.92版本之后增加了关于compact的配置选项,compact分为small compaction和large compaction两个线程池执行(默认都是各有1个线程,具体源代码见:org/apache/hadoop/hbase/regionserver /CompactSplitThread.java),由于compact过程需要从HBase集群读取数据,因此实际运行中导致了compact占用大 量网络出口流量,解决方案为选择性地关闭smallcompaction或large compaction。有以下两种变更方式均可解决:

1)方案一

(1) 修改hbase.regionserver.thread.compaction.throttle为一个很大的值(如50GB),强制让所有compact都变为small compaction,减少compact的压力;

(2) 将smallcompaction和large compaction线程数均设置为1,减少compact的压力(可不配置,系统默认也会将其初始化为1)。

操作步骤:

准备hbase-site.xml文件,添加或修改如下选项:

<property>

<name>hbase.regionserver.thread.compaction.throttle</name>

<value>53687091200</value>

</property>

<property>

<name>hbase.regionserver.thread.compaction.small</name>

<value>1</value>

</property>

<property>

<name>hbase.regionserver.thread.compaction.large</name>

<value>1</value>

</property>

重启集群使配置生效。

2)方案二

将small compaction线程数均设置为0,从而关闭small compaction,只剩下large compaction,也可减少compact的压力。

操作步骤:

准备hbase-site.xml文件,添加或修改如下选项:

<property>

<name>hbase.regionserver.thread.compaction.small</name>

<value>0</value>

</property>

重启集群使配置生效。

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2024-10-11 18:45:12

HBase解决Region Server Compact过程占用大量网络出口带宽的问题的相关文章

解决adb server端口被占用的问题

先执行adb nodaemon server ,查看adb server的端口是多少 C:\Users\xxxx>adb nodaemon server   cannot bind 'tcp:5037' 再执行下netstat -ano | findstr "5037" C:\Users\xxxxxx>netstat -ano | findstr "5037"     TCP    127.0.0.1:5037         0.0.0.0:0    

Hbase合并Region的过程中出现永久RIT的解决

在合并Region的过程中出现永久RIT怎么办?笔者在生产环境中就遇到过这种情况,在批量合并Region的过程中,出现了永久MERGING_NEW的情况,虽然这种情况不会影响现有集群的正常的服务能力,但是如果集群有某个节点发生重启,那么可能此时该RegionServer上的Region是没法均衡的.因为在RIT状态时,HBase是不会执行Region负载均衡的,即使手动执行balancer命令也是无效的. 如果不解决这种RIT情况,那么后续有HBase节点相继重启,这样会导致整个集群的Regio

Hbase Region Server整体架构

Region Server的整体架构 本文主要介绍Region的整体架构,后续再慢慢介绍region的各部分具体实现和源码 RegionServer逻辑架构图 RegionServer职责 1.      监听协作,通过zk来侦听master.meta位置.集群状态等信息的变化,更新本地数据. 2.      管理region的offline.online.open.close等操作,这些操作是和hmaster配合这来做的,region的状态有如下这些 offline.opening.open.

hbase源码系列(三)Client如何找到正确的Region Server

客户端在进行put.delete.get等操作的时候,它都需要数据到底存在哪个Region Server上面,这个定位的操作是通过HConnection.locateRegion方法来完成的. loc = hConnection.locateRegion(this.tableName, row.getRow()); 这里我们首先要讲hbase的两张元数据表-ROOT-和.META.表,它们一个保存着region的分部信息,一个保存着region的详细信息.在<hbase实战>这本书里面详细写了

关于hbase的read操作的深入研究 region到storefile过程

这里面说的read既包括get,也包括scan,实际底层来看这两个操作也是一样的.我们将要讨论的是,当我们从一张表读取数据的时候hbase到底是怎么处理的.分二种情况来看,第一种就是表刚创建,所有put的数据还在memstore中,并没有刷新到hdfs上:第二种情况是,该store已经进行多次的flush操作,产生了多个storefile了.在具体说明两种情况前,先考虑下表的region的问题,如果表只有一个region,那么没有说的,肯定是要扫描这个唯一的region.假设该表有多个regio

Hbase 操作表时,连接超时,或者找不到对应的region Server

在Hbase操作表时,突然报出ERROR: Failed 1 action: NotServingRegionException: 1 time, servers with issues: hadoop104,16020,1584783879148, 而且在flush时,会报错TimeoutException: Timeout elapsed! Source:Timeout caused Foreign Exception Start:1584783789686, End:15847838496

HBase Region的flush过程

触发region flush的因素有很多,如手动触发,memstore压力触发,memstore到达限制触发,flush时间触发等. regionserver的flush由 flush实际操作步骤为 1.获得region写锁,将region的所有store执行prepare,产生snapshort,释放region写锁 2.将region的所有store执行flushcache,将数据写入hdfs中的一个或多个临时文件中 3.将临时文件移到region/store相应的目录下,删除memstor

解决VS2010在新建实体数据模型出现&ldquo;在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误。请与提供程序供应商联系以解决此问题。&rdquo;的问题

最近想试着学习ASP.NET MVC,在点击 添加--新建项--Visual C#下的数据中的ADO.NET 实体数据模型,到"选择您的数据连接"时,出现错误,"在 .NET Framework Data Provider for Microsoft SQL Server Compact 3.5 中发生错误.请与提供程序供应商联系以解决此问题.",这里写下,以防自己忘记. 网上查了一下,说是重新安装一下 .NET Compact Framework 3.5,http

三 Client如何找到正确的Region Server

客户端在进行put.delete.get等操作的时候,它都需要数据到底存在哪个Region Server上面,这个定位的操作是通过 Connection.locateRegion方法来完成的. loc = hConnection.locateRegion(this.tableName, row.getRow()); 这里我们首先要讲hbase的两张元数据 表-ROOT-和.META. 表,它们一个保存着 region的分部信息,一个保存着region的详细信息.在<hbase实战>这本书里面详