HBase优化

本文详细介绍了HBase的高可用配置,包括主从节点切换和HMaster的高可用设置,确保集群稳定性。同时,讲解了预分区策略以提升HBase性能,并给出了参数调优的建议,如memstore和blockcache的内存占比,以及不同场景下触发MemStore flush的情况,旨在帮助优化HBase集群的运行效率。
摘要由CSDN通过智能技术生成

主从节点切换

在某节点上运行

./hbase-daemon.sh start master

高可用

在HBase中HMaster负责监控HRegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,那么整个HBase集群将陷入不健康的状态,并且此时的工作状态并不会维持太久。所以HBase支持对HMaster的高可用配置。
1.关闭HBase集群(如果没有开启则跳过此步)

  [atguigu@hadoop102 hbase]$ bin/stop-hbase.sh  

2.在conf目录下创建backup-masters文件

   [atguigu@hadoop102 hbase]$ touch conf/backup-masters

3.在backup-masters文件中配置高可用HMaster节点

[atguigu@hadoop102 hbase]$ echo hadoop103 > conf/backup-masters` 

4.将整个conf目录scp到其他节点

 [atguigu@hadoop102 hbase]$ scp -r conf/ hadoop103:/opt/module/hbase/ 
 [atguigu@hadoop102 hbase]$ scp -r conf/ hadoop104:/opt/module/hbase/

预分区

每一个region维护着StartRow与EndRow,如果加入的数据符合某个Region维护的RowKey范围,则该数据交给这个Region维护。那么依照这个原则,我们可以将数据所要投放的分区提前大致的规划好,以提高HBase性能。
1.手动设定预分区

 Hbase>create 'staff1','info','partition1',SPLITS['1000','2000','3000','4000'] 

2.生成16进制序列预分区

 create 'staff2','info','partition2',{NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'} 

3.按照文件中设置的规则预分区 创建splits.txt文件内容如下:
aaaa
bbbb
cccc
dddd
然后执行:

  create 'staff3','partition3',SPLITS_FILE => 'splits.txt'

4.使用JavaAPI创建预分区
//自定义算法,产生一系列hash散列值存储在二维数组中 byte[][] splitKeys = 某个散列值函数
//创建HbaseAdmin实例

HBaseAdmin hAdmin = new HBaseAdmin(HbaseConfiguration.create());

//创建HTableDescriptor实例

  HTableDescriptor tableDesc = new HTableDescriptor(tableName); 

//通过HTableDescriptor实例和散列值二维数组创建带有预分区的Hbase表

  hAdmin.createTable(tableDesc, splitKeys);

参数调优

hbase.regionserver.global.memstore.size

默认值0.4,RS所有memstore占用内存在总内存中的比例,当达到该值,则会从整个RS中找出最需要flush的region进行flush,直到总内存比例降至该数限制以下,并且在降至限制比例前,将阻塞所有的写memstore的操作,在以写为主的集群中,可以调大该配置项,不建议太大,因为block cache和memstore cache的总大小不会超过0.8,而且不建议这两个cache的大小总和达到或者接近0.8,避免OOM,在偏向写的业务时,可配置为0.45

hfile.block.cache.size

RS的block cache的内存大小限制,默认值0.4,在偏向读的业务中,可以适当调大该值,具体配置时需试hbase集群服务的业务特征,结合memstore的内存占比进行综合考虑。

hbase.regionserver.global.memstore.size.lower.limit

默认值0.95,相当于上一个参数的0.95

如果有 16G 堆内存,默认情况下:
达到该值会触发刷写
#达到该值会触发刷写
16 * 0.4 * 0.95 = 6.08
#达到该值会触发阻塞
16 * 0.4 = 6.4

什么时候触发 MemStore Flush

有很多情况会触发 MemStore 的 Flush 操作,主要有以下几种情况:

  • Region 中任意一个 MemStore 占用的内存超过相关阈值

    ​ 当一个 Region 中所有 MemStore 占用的内存大小超过刷写阈值的时候会触发一次刷写,这个阈值由 hbase.hregion.memstore.flush.size 参数控制,默认为128MB。我们每次调用 put、delete 等操作都会检查的这个条件的。

    ​ 但是如果我们的数据增加得很快,达到了 hbase.hregion.memstore.flush.size * hbase.hregion.memstore.block.multiplier 的大小,hbase.hregion.memstore.block.multiplier 默认值为4,也就是128*4=512MB的时候,那么除了触发 MemStore 刷写之外,HBase 还会在刷写的时候同时阻塞所有写入该 Store 的写请求!这时候如果你往对应的 Store 写数据,会出现 RegionTooBusyException 异常。

  • 整个 RegionServer 的 MemStore 占用内存总和大于相关阈值

    ​ 如果达到了 RegionServer 级别的 Flush,那么当前 RegionServer 的所有写操作将会被阻塞,而且这个阻塞可能会持续到分钟级别。

  • WAL数量大于相关阈值或WAL的大小超过一定阈值

    ​ 如果设置了 hbase.regionserver.maxlogs,那就是这个参数的值;否则是 max(32, hbase_heapsize * hbase.regionserver.global.memstore.size * 2 / logRollSize)

    (logRollSize 默认大小为:0.95 * HDFS block size)

    如果某个 RegionServer 的 WAL 数量大于 maxLogs 就会触发 MemStore 的刷写。

    ​ WAL的最大值由hbase.regionserver.maxlogs * hbase.regionserver.hlog.blocksize决定(默认32*2*128M=8G),一旦达到这个值,就会被触发flush memstore,如果memstore的内存增大了,但是没有调整这两个参数,实际上对大量小文件没有任何改进,调整策略:hbase.regionserver.hlog.blocksize * hbase.regionserver.maxlogs 设置为略大于hbase.regionserver.global.memstore.size* HBASE_HEAPSIZE。

  • 定期自动刷写

    ​ 如果我们很久没有对 HBase 的数据进行更新,这时候就可以依赖定期刷写策略了。RegionServer 在启动的时候会启动一个线程 PeriodicMemStoreFlusher 每隔 hbase.server.thread.wakefrequency 时间(服务线程的sleep时间,默认10000毫秒)去检查属于这个 RegionServer 的 Region 有没有超过一定时间都没有刷写,这个时间是由 hbase.regionserver.optionalcacheflushinterval 参数控制的,默认是 3600000,也就是1小时会进行一次刷写。如果设定为0,则意味着关闭定时自动刷写。

    ​ 为了防止一次性有过多的 MemStore 刷写,定期自动刷写会有 0 ~ 5 分钟的延迟

  • 数据更新超过一定阈值

    如果 HBase 的某个 Region 更新的很频繁,而且既没有达到自动刷写阀值,也没有达到内存的使用限制,但是内存中的更新数量已经足够多,比如超过 hbase.regionserver.flush.per.changes 参数配置,默认为30000000,那么也是会触发刷写的。

  • 手动触发刷写

    分别对某张表、某个 Region 进行刷写操作。

    可以在 Shell 中执行 flush 命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值