Hbase compact以及split跟踪

2024-04-16 18:58
文章标签 跟踪 split hbase compact

本文主要是介绍Hbase compact以及split跟踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了准确了解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.hstore.compactionThreshold=3  ,此时发生的是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

4. flush  

5. flush 

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

7. 要求split (split之后为2个文件)

8. flush

9. 要求合并(之前split为2个文件,加上flush的一个为3个文件,达到合并条件)

10. 要求split

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

而split有3个策略,默认是 KeyPrefixRegionSplitPolicy, ConstantSizeRegionSplitPolicy能完全禁止自动拆分,设置这个策略之后,然后修改region的max filesize,比如100G,那么基本就可以关闭自动拆分。


根据以上合并以及拆分理论知识,我们假设有一个系统负载极大,不停的大量数据写入,那么我们可以知道,HBASE内部在不停的合并,达到拆分规则又拆分,又合并,又拆分,周而复始。
在拆分的时候,1个大region拆分成2个小region, 然后修改meta,再online2个小region,  删除大的region. 但是在这过程,我们知道数据还在不停的写入,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,  结合<span white-space:normal;background-color:#f5f5f5;"="" style="word-wrap: break-word; color: rgb(85, 85, 85); font-family: 宋体, Arial;">hbase.hregion.memstore.block.multiplier=2 ,也就是说memstore最大大小为256M, 将BLOCK写入,阻止大量写入避免出现outofmemory错误. 上面你看到的above memstore size > 256M.

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


这篇关于Hbase compact以及split跟踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/909627

相关文章

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

Linux内置的审计跟踪工具:last命令

如果你是一个服务器管理员,你或许知道你要保护你的服务器的话,不仅是从外部,还要从内部保护。Linux有一个内置工具来看到最后登陆服务器的用户,可以帮助你保护服务器。   这个命令是last。它对于追踪非常有用。让我们来看一下last可以为你做些什么。   last命令的功能是什么   last显示的是自/var/log/wtmp文件创建起所有登录(和登出)的用户。这个文件是二进制

YOLOv8/v10+DeepSORT多目标车辆跟踪(车辆检测/跟踪/车辆计数/测速/禁停区域/绘制进出线/绘制禁停区域/车道车辆统计)

01:YOLOv8 + DeepSort 车辆跟踪 该项目利用YOLOv8作为目标检测模型,DeepSort用于多目标跟踪。YOLOv8负责从视频帧中检测出车辆的位置,而DeepSort则负责关联这些检测结果,从而实现车辆的持续跟踪。这种组合使得系统能够在视频流中准确地识别并跟随特定车辆。 02:YOLOv8 + DeepSort 车辆跟踪 + 任意绘制进出线 在此基础上增加了用户

Hive和Hbase的区别

Hive 和 HBase 都是 Hadoop 生态系统中的重要组件,它们都能处理大规模数据,但各自有不同的适用场景和设计理念。以下是两者的主要区别: 1. 数据模型 Hive:Hive 类似于传统的关系型数据库 (RDBMS),以表格形式存储数据。它使用 SQL-like 语言 HiveQL 来查询和处理数据,数据通常是结构化或半结构化的。HBase:HBase 是一个 NoSQL 数据库,基

简单Hbase 分页方案

简单Hbase分页方案 网上大多数分页方案分为从服务端分页或者从客户端分页 服务端分页方式主要利用PageFilter过滤器,首先太复杂,其次针对集群的兼容性不是很好,作者利用服务端分页+客户端分页结合方式给出一种简单易行的中间方案。 1.利用PageFilter过滤器从服务端分页,过滤出所需要的最大条数, 注:作者认为大多数用户不会进行太深的翻页,假设pageSize=5,客户饭100页一共

Hbase Filter+Scan 查询效率优化

Hbase Filter+Scan 查询效率问题 众所周知,Hbase利用filter过滤器查询时候会进行全表扫描,查询效率低下,如果没有二级索引,在项目中很多情况需要利用filter,下面针对这种情况尝试了几种优化的方案,仅供参考,欢迎交流。 根据业务要求,作者需要根据时间范围搜索所需要的数据,所以作者设计的rowKey是以时间戳为起始字符串的。 正确尝试: 1.scan 设置 开始行和结

Hbase 查询相关用法

Hbase 查询相关用法 public static void main(String[] args) throws IOException {//Scan类常用方法说明//指定需要的family或column ,如果没有调用任何addFamily或Column,会返回所有的columns; // scan.addFamily(); // scan.addColumn();// scan.se

深度学习 目标分类 目标检测 多目标跟踪 基础 进阶

深度学习 目标分类 目标检测 多目标跟踪 基础 进阶 flyfish 深度学习基础 文章名称链接深度学习基础 - 直线链接深度学习基础 - 梯度垂直于等高线的切线链接深度学习基础 - 向量投影链接一阶优化算法(如梯度下降)和二阶优化算法(如牛顿法)与泰勒级数链接Eigen中的array() square() asDiagonal()链接普通的矩阵乘法和Strassen矩阵乘法算法的比较 代码