Tuning Of Hbase

序言

持续整理cuiyaonan2000@163.com

参考资料:

  1. hbase的调优_hbase调优_AllenGd的博客-CSDN博客

历史数据

因为:

Hbase的所有操作都是追加插入操作(故此hbase有历史版本的概念存在)。它可以往数据里面insert,也可以update一些数据,但update的实际上也是insert,只是插入一个新的时间戳的一行。Delete数据,也是insert,只是insert一行带有delete标记的一行。
 

所以有必要进行历史数据的删除,否则Region的数量会越来越大.

创建表的时候,可以通过HColumnDescriptor.setMaxVersions(int maxVersions)设置表中数据的最大版本,如果只需要保存最新版本的数据,那么可以设置setMaxVersions(1)。

Compact

在HBase中,数据在更新时首先写入WAL 日志(HLog)内存(MemStore)中,MemStore中的数据是排序的,当MemStore累计到一定阈值时,就会创建一个新的MemStore,并且将老的MemStore添加到flush队列,由单独的线程flush到磁盘上,成为一个StoreFile。于此同时, 系统会在zookeeper中记录一个redo point,表示这个时刻之前的变更已经持久化了(minor compact)。---由此可见minor的合并是将 内存中的数据实例化到hdfs中cuiyaonan2000@163.com

StoreFile是只读的,一旦创建后就不可以再修改。因此Hbase的更新其实是不断追加的操作。当一个Store中的StoreFile达到一定的阈值后,就会进行一次合并(major compact),将对同一个key的修改合并到一起,形成一个大的StoreFile,当StoreFile的大小达到一定阈值后,又会对 StoreFile进行分割(split),等分为两个StoreFile。-----------major compact是针对一个Region下的所有StroreFile进行合并和拆分 ,所以比较消耗资源.另针对的是相同的key为id进行合并,不是随便合并cuiyaonan2000@163.com

由于对表的更新是不断追加的,处理读请求时,需要访问Store中全部的StoreFile和MemStore,将它们按照row key进行合并,由于StoreFile和MemStore都是经过排序的,并且StoreFile带有内存中索引,通常合并过程还是比较快的。

实际应用中,可以考虑必要时手动进行major compact,将同一个row key的修改进行合并形成一个大的StoreFile。同时,可以将StoreFile设置大些,减少split的发生

hbase为了防止小文件(被刷到磁盘的menstore)过多,以保证保证查询效率,hbase需要在必要的时候将这些小的store file合并成相对较大的store file,这个过程就称之为compaction。在hbase中,主要存在两种类型的compaction:minor  compaction和major compaction。

Minor Compact

  Minor Compact是指少量HFile文件按照Minor Compact规则进行合并;它的正常流程是这样的,探测到有新的文件刷进来(比如因为memstore的flush,当然可以直接写入HFile而跳过memstore,比如Bulk写入),此时Region Server只要发现同一个列簇3个及以上的文件,将会扫描文件列表,然后将符合合并规则文件纳入到list中,并且list中文件数>1,则将会进行compact;其中规则如下:

  • hbase.hstore.compaction.min :默认值为 3,表示至少需要三个满足条件的store file时,minor compaction才会启动
  • hbase.hstore.compaction.max 默认值为10,表示一次minor compaction中最多选取10个store file
  • hbase.hstore.compaction.min.size 表示文件大小小于该值的store file 一定会加入到minor compaction的store file中
  • hbase.hstore.compaction.max.size 表示文件大小大于该值的store file 一定会被minor compaction排除
  • hbase.hstore.compaction.ratio 将store file 按照文件年龄排序(older to younger),minor compaction总是从older store file开始选择

  所以看到minor的规则稍微有点复杂,原则是减少合并(文件合并要门当户对),避免形成大文件(达到一定程度之后就不在合并)。
 


Major Compact

  数据清理的工作,都是在Major Compact里面去做,Major操作是无差别的将所有的同一个column family的所有文件进行合并;在合并的过程中将会对数据进行清理,那些需要删除掉的,过期的数据都会在Major Compact里面去做,当然也包括整合数据排序(HBase的数据排序是字段顺序)。所以Major Compact在数据层面做的事情还是挺多的,但是因为他产生的IO消耗同样非常巨大,所以一般都会禁用自动major compact,而是会手工进行数据合并

region文件大小(hbase.hregion.max.filesize)

HFile存储数据是按column family存储的,也就是任何一个列蔟存储值大于这个参数,都会发生hbase的split 以产生多个Region

  • 当文件过大: 读写hbase的速度会变慢,因为底层对hdfs的读写操作由于文件数量少,很难做到高并发,高吞吐
  • 当过小: 会发生频繁的文件split,split会使数据短暂offline,会对数据的访问有一定影响,不太稳定,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cuiyaonan2000

给包烟抽吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值