Hbase compact以及split跟踪

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 为了准确了解HBASE内部工作原理,我们需要做一些测试,在大量数据插入的情况下,HBASE内部到底有什么表现? 比如插入速度, hstore compact,split等相关活动,了解了这些才能更好的维护HBASE系统本身。此次测试会有几轮,所以测试到哪里就写到哪里,我随便找了一张大概120W来的表,我会写一个mapreduce任务,来读取这张表,再写入另外一个测试表: test2, 没有选择更大的表是因为毕竟整个拷贝是需要时间,通常20分钟-30分钟,太大的表,不太利于跟踪。 拷贝过程,HBASE会针对此表有相关的活动日志,依据日志,我们来看看HBASE到底在干什么。测试开始,

为了准确了解HBASE内部工作原理,我们需要做一些测试,在大量数据插入的情况下,HBASE内部到底有什么表现? 比如插入速度, hstore compact,split等相关活动,了解了这些才能更好的维护HBASE系统本身。

此次测试会有几轮,所以测试到哪里就写到哪里,我随便找了一张大概120W来的表,我会写一个mapreduce任务,来读取这张表,再写入另外一个测试表: test2, 没有选择更大的表是因为毕竟整个拷贝是需要时间,通常20分钟-30分钟,太大的表,不太利于跟踪。 拷贝过程,HBASE会针对此表有相关的活动日志,依据日志,我们来看看HBASE到底在干什么。

测试开始, 下面是我的mapreduce任务进度,reduce开始的时间,实际就是写入HBASE的时间,那么从11:36开始,应该HBASE在插入

17/06/29 11:31:41 INFO mapreduce.Job: map 71% reduce 0%
17/06/29 11:32:07 INFO mapreduce.Job: map 81% reduce 0%
17/06/29 11:32:08 INFO mapreduce.Job: map 86% reduce 0%
17/06/29 11:32:19 INFO mapreduce.Job: map 86% reduce 29%
17/06/29 11:36:07 INFO mapreduce.Job: map 95% reduce 29%
17/06/29 11:36:11 INFO mapreduce.Job: map 96% reduce 29%

跟踪日志过程

  1. 11:36分日志显示flush一个memstore,大小为129M, 这个和设置的参数值是一样的,hbase.hregion.memstore.flush.size=128M, flush之后,会生产一个hfile,实际文件大小为48.9M, 另外注意最后的compaction requested=false

2017-06-29 11:36:34,505 INFO org.apache.hadoop.hbase.regionserver.HRegion: Flushing 1/1 column families, memstore=129.14 MB
2017-06-29 11:36:36,157 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=54, memsize=129.1 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/047e3c0dad4940788b97b203495c1536
2017-06-29 11:36:36,182 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/047e3c0dad4940788b97b203495c1536, entries=644303, sequenceid=54, filesize=48.9 M
2017-06-29 11:36:36,185 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~129.14 MB/135411576, currentsize=36.78 MB/38569776 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1681ms, sequenceid=54, compaction requested=false

  1. 第二次刷新, 注意最后的compaction requested=false,

2017-06-29 11:36:41,766 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=107, memsize=128.7 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/57d95a2f46454109b336161e9ae9bc14
2017-06-29 11:36:41,786 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/57d95a2f46454109b336161e9ae9bc14, entries=636412, sequenceid=107, filesize=49.5 M
2017-06-29 11:36:41,788 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~128.74 MB/134994216, currentsize=26.27 MB/27549840 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1318ms, sequenceid=107, compaction requested=false

  1. 第三次刷新, 此时日志明确的表示,要进行合并, 当有3个HFILE的时候,HBASE会合并,这是因为默认我们的参数hbase.hstore.compactionThreshold=3 ,此时发生的是QQ号码买卖平台minor合并

2017-06-29 11:36:48,023 INFO org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher: Flushed, sequenceid=160, memsize=128.7 M, hasBloomFilter=true, into tmp file hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp/1fa335caa3144c8da5e0ca7697f551cf
2017-06-29 11:36:48,041 INFO org.apache.hadoop.hbase.regionserver.HStore: Added hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/cf/1fa335caa3144c8da5e0ca7697f551cf, entries=636412, sequenceid=160, filesize=49.9 M
2017-06-29 11:36:48,054 INFO org.apache.hadoop.hbase.regionserver.HRegion: Finished memstore flush of ~128.74 MB/134994216, currentsize=31.53 MB/33059808 for region test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. in 1343ms, sequenceid=160, compaction requested=true

跟踪HFILE合并, 日志显示,3个文件合并在一起,一共148M,花费的时间为3秒,很显然minor合并的速度还是很快的。

2017-06-29 11:36:48,058 INFO org.apache.hadoop.hbase.regionserver.HStore: Starting compaction of 3 file(s) in cf of test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94. into tmpdir=hdfs://nameservice1/hbase/data/default/test2/786ef51a9c89f0e31073ba8aafc7ef94/.tmp, totalSize=148.3 M

2017-06-29 11:36:51,792 INFO org.apache.hadoop.hbase.regionserver.CompactSplitThread: Completed compaction: Request = regionName=test2,,1498706810880.786ef51a9c89f0e31073ba8aafc7ef94., storeName=cf, fileCount=3, fileSize=148.3 M, priority=7, time=17006286308699473; duration=3sec

  1. flush
  2. flush
  3. 要求合并(此时第一个合并之后只有一个文件,加上flush的2个文件,一共3个,达到了合并条件)
  4. 要求split (split之后为2个文件)
  5. flush
  6. 要求合并(之前split为2个文件,加上flush的一个为3个文件,达到合并条件)
  7. 要求split

以上是根据日志显示得到的一个跟踪过程。 我们可以看到minor compact速度很快,根据参数设置,每3个文件就会合并一次。 至于major compact由hbase.hregion.majorcompaction来控制,
默认是7天时间,0表示关闭major compact. 所以从理论来讲,minor compact对于一个数据量大的系统,可能时时刻刻在合并, 因为memstore 默认128M可能1分钟就满了,刷出之后产生HFILE,然后达到合并条件就合并。

而split有3个策略,默认是IncreasingToUpperBoundRegionSplitPolicy , 还有KeyPrefixRegionSplitPolicy, ConstantSizeRegionSplitPolicy, 根据规则在128M的时候就应该split,但是实际从日志来看,并没有,后续再做观察。

通常我们会提到手动拆分,也就是关闭自动拆分,从拆分策略来看,只有ConstantSizeRegionSplitPolicy能完全禁止自动拆分,设置这个策略之后,然后修改region的max filesize,比如100G,那么基本就可以关闭自动拆分。

根据以上合并以及拆分理论知识,我们假设有一个系统负载极大,不停的大量数据写入,那么我们可以知道,HBASE内部在不停的合并,达到拆分规则又拆分,又合并,又拆分,周而复始。
在拆分的时候,1个大region拆分成2个小region, 然后修改meta,再online2个小region, 删除大的region. 但是在这过程,我们知道数据还在不停的写入,hbase.hstore.blockingStoreFiles默认为10,这个参数是用来控制当一个region下超过多少个文件就BLOCK更新插入,等待合并结束,问题是这个参数不会一直BLOCK,hbase.hstore.blockingWaitTime 默认90秒,超过这个时间又会放行插入和更新。很显然,出现这种情况之后,小region如果出现了需要split的情况怎么办? 开始的合并还没有结束,大region还没有offline, 小region又要拆分。

如果出现了上面的情况,我不知道具体HBASE是什么规则,但是我想这是一个极度复杂的处理,简单处理的话只有BLOCK插入和更新,等待合并或者拆分结束。目前我还没找到有完全BLOCK HBASE插入和更新的参数, 所以为了更好管理HBASE, 建议关闭自动拆分,为什么? 不仅仅是为了说SPLIT可能会影响性能,如果说SPLIT会影响,那么合并也会影响,更多的是,拆分和合并我们要有取舍,关闭了自动拆分,人为来控制,那么在HBASE内部仅仅存在合并,至少不会出现上述极度复杂的情况。

最后,如果系统负载极大的时候,rowkey分配不规则,大量线程往一个region写数据,默认单个memstore是128M,最大大小为128*2=256M, 这个时候按照规则会BLOCK写入,甚至出现org.apache.hadoop.hbase.RegionTooBusyException: org.apache.hadoop.hbase.RegionTooBusyException: Above memstore limit memstoreSize=269744800, blockingMemStoreSize=268435456 之类的错误。

这里简单说一下memstore block写入规则,默认memstore size=128M, 结合hbase.hregion.memstore.block.multiplier=2 ,也就是说memstore最大大小为256M, 将BLOCK写入,阻止大量写入避免出现outofmemory错误. 上面你看到的above memstore size > 256M.

所以预先分区以及估算写入量就显的非常重要,如果你的系统负载并没有那么大,那么就显的不是那么重要了。

相关实践学习
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
NoSQL 大数据 分布式数据库
【HBase】(6)-Compact合并StoreFile流程
【HBase】(6)-Compact合并StoreFile流程
229 0
【HBase】(6)-Compact合并StoreFile流程
|
分布式数据库 Hbase Java
hbase region split源码分析
hbase region split : split执行调用流程: 1.HbaseAdmin发起split:### 2.RSRpcServices实现类执行split(Implements the regionserver RPC services.)### 3.CompactSplitThread类与SplitRequest类用来执行region切割:### 4.splitRequest执行doSplitting操作### 4.1初始化两个子region### 4.2执行切割#### 4.2.1:(创建子region。
1773 0
|
分布式数据库 Hbase 存储
HBase源码分析之HRegion上compact流程分析(一)
        首先来想两个问题:1、何谓compact?2、它产生的背景是怎样的?         compact是指HBase表中HRegion上某个Column Family下,部分或全部HFiles的合并。
1030 1
|
分布式数据库 Hbase
HBase flush&split&compact
HBase的memstore flush处理流程,以及split/compact的处理流程
1677 0
|
分布式数据库 Hbase
|
存储 Java Shell
HBase源码分析之HRegionServer上compact流程分析
        前面三篇文章中,我们详细叙述了compact流程是如何在HRegion上进行的,了解了它的很多细节方面的问题。但是,这个compact在HRegionServer上是如何进行的?合并时文件是如何选择的呢?在这篇文章中,你将找到答案!         首先,在HRegionServer内部,我们发现,它定义了一个CompactSplitThread类型的成员变量compactSplitThread,单看字面意思,这就是一个合并分裂线程,那么它会不会就是HRegionServer上具体执行合并的工作线程呢?我们一步一步来看。
1395 0
|
存储 分布式数据库 Hbase
HBase源码分析之HRegion上compact流程分析(三)
        在《HBase源码分析之HRegion上compact流程分析(二)》一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法。现在我们来分析下它的具体实现。
1330 0
|
存储 监控 分布式数据库
HBase源码分析之HRegion上compact流程分析(二)
        继《HBase源码分析之HRegion上compact流程分析(一)》一文后,我们继续HRegion上compact流程分析,接下来要讲的是针对表中某个列簇下文件的合并,即HStore的compact()方法,代码如下: /** * Compact the StoreFiles. This method may take some time, so the calling * thread must be able to block for long periods. * * 合并存储文件。
1277 0
|
分布式数据库 Hbase 算法
Hbase写入量大导致region过大无法split问题
最近在线上往hbase导数据,因为hbase写入能力比较强,没有太在意写的问题。让业务方进行历史数据的导入操作,中间发现一个问题,写入速度太快,并且业务数据集中到其中一个region,这个region无法split掉,处于不可用状态。
1076 0