[Hbase]Hbase常用的优化方法

目录

 

Hbase shell常用的维护命令

集群命令

Region命令

region 自动split

常见问题处理方法

HBase的region分布不均

HBase写入数据慢

大批量、连续put|delete|get 的优化


Hbase shell常用的维护命令

集群命令

  1. help 查看Hbase的命令帮助
  2. version 查看Hbase集群的版本
  3. whoami 查看当前登录用户
  4. status 查看集群的状态

如:status ‘simple’;查看基本信息。status ‘detail’;查看详细信息。

  1. user_permision 查看用户的权限

 如:user_permision ‘username’

Region命令

  1. assign手动让region上线
  2. unassign手动让region下线
  3. compact手动对一个表或一个Region进行compact操作
  4. major_compact手动对一个表或一个Region进行Compact操作

该操作是对Region下的HStore下的所有StoreFile执行合并操作,最终的结果是整理合并出一个文件

  1. minor_compaction Minor操作只用来做部分文件的合并操作以及包括minVersion=0并且设置ttl的过期版本清理,不做任何删除数据、多版本数据的清理工作
  2. split手动对一个表或一个Region进行分裂操作

split 't1', 'rowkey' //其中t1为要split的table , ‘rowkey’ 为split 点

  1. balancer手动触发HBase负载均衡

 

region 自动split

写请求或compaction前都会检测store size是否达到阈值。检查阈值的算法主要有两种:ConstantSizeRegionSplitPolicy和

IncreasingToUpperBoundRegionSplitPolicy。

  1. ConstantSizeRegionSplitPolicy : 系统会遍历region所有store的文件大小,如果有文件大小 > hbase.hregion.max.filesize,就会触发切分操作。
  2. IncreasingToUpperBoundRegionSplitPolicy:该策略则是store大小大于一个变化的阀值就允许split。这个策略中,最小的分裂大小和table的某个region server的region 个数有关,当store file的大小大于如下公式得出的值的时候就会split,公式如下:

Min (R^2 * “hbase.hregion.memstore.flush.size”, “hbase.hregion.max.filesize”)

 R为同一个table中在同一个region server中region的个数。

例如:

hbase.hregion.memstore.flush.size 默认值 128MB。

hbase.hregion.max.filesize默认值为10GB 。

  1. 如果初始时R=1,那么Min(128MB,10GB)=128MB,也就是说在第一个flush的时候就会触发分裂操作。
  2. 当R=2的时候Min(2*2*128MB,10GB)=512MB ,当某个store file大小达到512MB的时候,就会触发分裂。

如此类推,当R=9的时候,store file 达到10GB的时候就会分裂,也就是说当R>=9的时候,store file 达到10GB的时候就会分裂

split 点都位于region中row key的中间点。

 

常见问题处理方法

HBase的region分布不均

HBase的region分布不均, 某些RegionServer节点上的region数量比其他节点高出很多。

原因分析

  1. HBase的自动均衡机制被关闭后,如果region频繁发生分裂会导致节点上的region越来越多;
  2. 另外,如果其他节点异常后,会将异常节点上的region转移到其他节点,即使异常节点恢复后,region也不会转移回去,这样会导致经过异常恢复的节点上没有或者有很少的region。

解决办法

在hbase shell执行如下命令:

  1.  balance_switch true
  2.  balancer

HBase写入数据慢

应用侧往HBase写入数据慢,调整并发数后性能未见提升

原因分析

  1. 建表时如果未指定分区或者分区不合理,会导致写入的数据集中在某个或者某几个region中,导致无法充分利用所有的RegionServer资源;
  2. 随着数据的不断写入,导致region频繁分裂,影响读写性能。

解决办法

调研Hbase数据表的key的分布情况,在建表的时候对hbase进行region的预分区。这样做的好处是防止大数据量插入的热点问题,提高数据插入的效率。

如预分区:

create 'ns1:t1',{NAME => 'info',TTL=>'8640000'},{NAME => 'roomid',TTL=>'8640000'},{SPLITS => ['00','01','02','03','04','05']}

大批量、连续put|delete|get 的优化

1)hbase.regionserver.wal.durable.sync=true

控制HLog文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。 把该值设置为false比true在写入性能上会更优。

2)hbase.regionserver.hfile.durable.sync=true

控制HFile文件在写入到HDFS时的同步程度。如果为true,HDFS在把数据写入到硬盘后才返回;如果为false,HDFS在把数据写入OS的缓存后就返回。 把该值设置为false比true在写入性能上会更优。

3) hbase.regionserver.handler.count=100

表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力。根据资源情况,适当增加处理线程数。 建议根据CPU的使用情况,可以选择设置为100至300之间的值。

4) hbase.hregion.max.filesize=10737418240

表示HBase中Region的文件总大小的最大值。当Region中的文件大于该参数时,将会导致Region分裂。 该参数设置过小时,可能会导致Split操作过于频繁。当设置过大时,可能导致Compact需要处理的文件大小增加,影响Compact执行效率。默认为10G。

5)hbase.hregion.memstore.flush.size=

在RegionServer中,当写操作内存中存在超过memstore.flush.size大小的memstore,则MemStoreFlusher就启动flush操作将该memstore以hfile的形式写入对应的store中。 如果RegionServer的内存充足,而且活跃Region数量也不是很多的时候,可以适当增大该值,可以减少compaction的次数,有助于提升系统性能。同时,这种flush产生的时候,并不是紧急的flush,flush操作可能会有一定延迟,在延迟期间,写操作还可以进行,Memstore还会继续增大,最大值为“memstore.flush.size” * “hbase.hregion.memstore.block.multiplier”。当超过最大值时,将会阻塞操作。适当增大“hbase.hregion.memstore.block.multiplier”可以减少阻塞,减少性能波动。

6)hbase.regionserver.global.memstore.size=0.4

RegionServer中,负责flush操作的是MemStoreFlusher线程。该线程定期检查写操作内存,当写操作占用内存总量达到阈值,MemStoreFlusher将启动flush操作,按照从大到小的顺序,flush若干相对较大的memstore,直到所占用内存小于阈值。

阈值 = “hbase.regionserver.global.memstore.size” * “hbase.regionserver.global.memstore.size.lower.limit” * “HBase_HEAPSIZE”

7)hbase.hstore.blockingStoreFiles=7

在region flush前首先判断file文件个数,是否大于hbase.hstore.blockingStoreFiles。 如果大于需要先compation 并且让flush延时90s(这个值可以通过hbase.hstore.blockingWaitTime进行配置),在延时过程中,将会继续写从而使得Memstore还会继续增大超过最大值 “memstore.flush.size” * “hbase.hregion.memstore.block.multiplier”,导致写操作阻塞。当完成compation后,可能就会产生大量写入。这样就导致性能竞争激烈。增加hbase.hstore.blockingStoreFiles,可以减低BLOCK几率。

8) hbase.hstore.compaction.min=3

当一个Store中文件超过该值时,会进行compact,适当增大该值,可以减少文件被重复执行compaction。但是如果过大,会导致Store中文件数过多而影响读取的性能。

9) hbase.regionserver.thread.compaction.throttle= 1610612736

控制一次Minor Compaction时,进行compation的文件总大小的阈值。Compaction时的文件总大小会影响这一次compaction的执行时间,如果太大,可能会阻塞其它的compaction或flush操作。

10) hbase.hstore.compaction.max=10

控制一次compaction操作时的文件数量的最大值。与“hbase.hstore.compaction.max.size”的作用基本相同,主要是控制一次compaction操作的时间不要太长。

11) hbase.hstore.compaction.max.size= 2684354560

如果一个HFile文件的大小大于该值,那么在Minor Compaction操作中不会选择这个文件进行compaction操作,除非进行Major Compaction操作。 这个值可以防止较大的HFile参与compaction操作。在禁止Major Compaction后,一个Store中可能存在几个HFile,而不会合并成为一个HFile,这样不会对数据读取造成太大的性能影响。

12) hbase.hregion.majorcompaction= 86400000

(单位:毫秒)

设置Major Compaction的执行周期。默认值为86400000毫秒,也就是1天。由于执行Major Compaction会占用较多的系统资源,如果正在处于系统繁忙时期,会影响系统的性能。 如果业务没有较多的更新、删除、回收过期数据空间时,可以把该值设置为0,以禁止Major Compaction。

13) Hlog参数

以下两个参数共同决定了RegionServer中可以存在的未进行Flush的hlog数量。当这个数据量小于MemStore的总大小的时候,会出现由于HLog文件过多而触发的强制flush操作。这个时候可以适当调整这两个参数的大小,以避免出现这种强制flush的情况。

(1)hbase.regionserver.maxlogs=32

表示一个RegionServer上未进行Flush的Hlog的文件数量的阈值,如果大于该值,RegionServer会强制进行flush操作。

(2)hbase.regionserver.hlog.blocksize

表示每个HLog文件的最大大小。如果HLog文件大小大于该值,就会滚动出一个新的HLog文件,旧的将被禁用并归档。

14)hbase.regionserver.handler.count=100

该参数表示RegionServer在同一时刻能够并发处理多少请求。如果设置过高会导致激烈线程竞争,如果设置过小,请求将会在RegionServer长时间等待,降低处理能力.根据资源情况,适当增加处理线程数。 建议根据CPU的使用情况,可以选择设置为100至300之间的值

15)hfile.block.cache.size=0.25

HBase 缓存区大小,主要影响查询性能。根据查询模式以及查询记录分布情况来决定缓存区的大小。如果采用随机查询使得缓存区的命中率较低,可以适当降低缓存区大小。

猜你喜欢

转载自blog.csdn.net/henku449141932/article/details/111531899
今日推荐