本站提供最佳风浪波段指标 源码服务,欢迎转载和分享。

【跑酷java源码】【全网指标源码大全】【jvm底层源码解析】hbase compact 源码

2024-12-25 02:06:28 来源:倍 主图源码 分类:百科

1.Hbase读写原理
2.hbase major和minor的区别
3.Hbase读写原理
4.HBase 底层原理详解(深度好文,源码建议收藏)
5.HBASE stop-hbase.sh 后为什么HRegionServer进程还在运行
6.LSM树详解

hbase compact 源码

Hbase读写原理

        不同列族分别存在不同的文件夹里。

        与MySQL比较

        首先Hbase是依赖于HDFS和zookeeper的。

        Zookeeper分担了Hmaster的一部分功能,客户端进行DML语句的时候,都是先跟ZK交互。

        RegionServer管理了很多的Region(表),RegionServer里面的WAL(HLog)是预写入日志,功能是防止内存中的数据没有来的及落盘时丢失。在Region里面管理的Store管理的是列族,Store里面有Mem Store(内存),Flush之后,删除内存中的数据,同时写入文件StoreFile Hfile,源码Hfile 其实是在DataNode里面的。

        Hbase的读比写慢。

        Hbase命名空间下有一张元数据表meta表和namespace表。meta表里面保存了要操作的表所在的位置等元数据。

        (1)首先客户端向zk请求元数据表所在的RegionServer,zk返回给客户端meta表所在的regionServer。

        (2)然后客户端再去对应的RegionServer查找meta表,找到真正要操作的表所在的regionServer,同时把meta表的信息缓存下来,加快后续的查询。

        (3)然后客户端再向目标表所在的RegionServer发送put请求。先把数据写到Hlog里面,再写到内存MemStore,数据会在内存排序,然后向客户端发送ack,到这里对于客户端来说写数据已经结束了。再等到MemStore的刷写时机后,将数据刷写到Hfile.

        注:meta表所在的位置信息保存在zk的meta-region-server节点上,客户端首先就是在这个节点上差询meta表所在的RegionServer。meta表里面的信息就是表与其对应的RegionServer的信息

        这个stu表可能不止一条,因为stu表可能数据量大了之后根据RowKey进行了切分,并且可能会在不同的机器上。

        不同的列族是在不同的文件夹。

        MemStore刷写时机:

        全局的MemStore的容量,默认是堆内存的%。这个容量值会触发flush操作,所有的MemStore都要刷写,flush操作会阻塞读写操作。

        会刷写并阻塞到到MemStore大小降到它的最大容量的%

        WAL日志的刷写时机:

        可以设置日志的大小和数量,当达到一定数量,刷写到HDFS

        (1)从zk找meta表所在的RegionServer

        (2)从上述RegionServer里的meta表里找目标表所在的RegionServer,同时把meta表缓存,加速后面的查询。

        (3)向目标表所在的RegionServer发送get请求。可以从block Cache,MemStore还有StoreFile里面查,具体从哪查根据时间戳,查时间戳大的,具体就都查然后merge取最新。

        RegionServer里面有block Cache可以缓存磁盘的数据,加速查询。如果block Cache里面有,就将缓存和MemStore的数据merge然后取最新时间戳,没有就是把磁盘读的和MemStore里面的合并。所以hbase大多数读要走磁盘,所以读很慢。

        每次刷写会生成新的Hfile,Hfile很小并且数量多的时候会影响查询的速度。所以要进行合并。合并分为minor Compaction和major Compaction

        minor Compaction将临近的若干较小的Hfile合并成一个较大的Hfile,不会清理过期和删除的数据,major Compaction会将一个Store里面的所有Hfile合并成一个大的Hfile,并且会清理掉过期和删除的数据。

        数据的读写可以不依赖Hmaster,只需要指定zookeeper,但是Hmaster负责region调度的元数据

        但是DDL语言是要有Hmaster的

        Flush和major Compact

        (1)flush在同一个内存中清除过期或删除(删除标记也是一行数据)的数据,但是如果数据不同的版本分布在不同的memStroe,就不能清除。删除的标记在flush之后不会被删,但在后面的major compaction会把删除标记删除掉。

        (2)major compaction 会清除过期或删除的数据。

        默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动拆分,两个子Region开始都会在一个Regionserver里面,但是出于负载均衡的考虑,Hmaster有可能会将某个Region传给其他的RegionServer。

        Split的时机:

        (1)当一个Region中的某个Store下的StoreFile的总大小查过某个值,由参数hbase.hregion.max.filesize设定(默认g),该Region就会按照RowKey进行拆分。

        (2)在新版本中这个值是Min(R^2*"hbase.hregion.memStore.flush.size(M)","hbase.hregion.max.filesize"),R是当前RegionServer中属于该Table的Region个数。分region是按照RowKey切分的。这会导致数据倾斜,就是因为切分的阈值在变化,导致切分之后的region数据量不均匀,导致热点的问题。所以在建表的时候要做预分区,就是用RowKey规划好多少个region,不让hbase自己的切分逻辑切分。

        官方建议只用一个列族,防止不同的列族之间数据不均匀,单一列族数据量增多,导致全局的flush,数据量小的列族也要flush,这样会形成很多小的storeFile。

        delete操作:

        (1)设置RowKey:打的删除标记是deleteFamily,删除多个版本

        (2)设置RowKey+Family:打的标记是deleteFamily,删除多个版本

        (3)设置RowKey+family+column:有addColumn()和addColumns().addColumn是删除最新的版本或者删除指定时间戳的版本,删除标记是delete标记。addColumns是删除所有的版本或者删除指定时间戳或之前的版本,删除标记是deleteColumn

        Delete的操作其实也是put操作,put的是删除的标记。

        在Hbase中HMaster负责监控HRegionServer的生命周期,均衡RegionServer的负载,如果HMaster挂掉了,那个整个Hbase集群将处于不健康的状态,并且此时的工作状态不会维持太久。所以Hbase支持对HMaster的高可用配置。

        在Hbase的conf目录下新建backup-masters文件,vim加入备份Master,比如slave,slave.在把文件分发到各个slave里,然后再启动hbase 就能实现HMaster的高可用了。

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

        (1)手动设定预分区

        手动设置RowKey分了5个region

        (2)生成进制序列预分区

        (3)按照文件中设置的规则预分区

        创建split.txt

        然后执行

        这里如果文件里面给的分区键不是按照顺序的,hbase会先帮我们把键排序,然后按照键来分区。

        (4)使用JavaAPI预分区

        admin的创建表的方法有多个重载,可以只传表的描述,也可以加入分区的信息。admin.createTable

        规划分区要考虑未来数据量和机器的规模。虽然提前做了分区,但是最后如果分区大于了G,还是会触发split。假设一台机器有G磁盘,那么预分区尽量大于个,这样就能避免预分区之后又触发了大于G的split。

        (1)希望数据能够尽量均匀的分配在多个分区里面(散列性)。

        (2)唯一性

        (3)长度原则(生产环境到位)

        常见的设计方案:

        (1)生产随机数、hash、散列值

        (2)字符串反转

        (3)字符串拼接

        电信项目:

        一次通话的记录:-> -- ::

        假设分个区

        分区键怎么设计:

        (个键)

        |

        |

        ...

        |

        RowKey的前面一般会拼上_,_,...,_

        这样做的好处是,根据前三位就能知道哪个分区。

        (1)我们希望手机号尽量分布在不同的分区,但是相同的手机号数据集中在同一个分区,这样方便查询某个用户的通话信息。_

        (2)因为每个人通话的需求不同,也希望把同一个人的通话记录也分布在不同的分区里面。__--

        哈希取余:[(^).hash]%

        假设要查询某用户年2月的通话记录,可以用 做startRowkey, 做endRowKey

        微博。

        1、需求

        (1)微博内容的浏览

        (2)用户社交:关注用户,取关用户

        (3)拉取关注人的微博用户

        2、设计表

        (1)微博内容表Content

        行键:用户id+时间戳

        (2)用户关系表

        因为正常情况一个用户的粉丝和关注都不多,可以用一行存储关注和粉丝的情况。

        行键:用户id

        (3)初始化页面的表(显示关注的人的最近三条微博)

hbase major和minor的区别

       HBaseAdmin提供compact方法来手动合并小文件 public void compact(final byte [] tableNameOrRegionName) public void majorCompact(final byte [] tableNameOrRegionName) majorCompact会对所有的文件进行Compact,而compact会选取合适的进行co。

Hbase读写原理

       HBase的读写原理涉及到数据的存储、管理以及优化过程。源码在写入阶段,源码客户端的源码数据首先写入内存的MenStore,然后HBase会定期将MemStore内容写入StoreFile。源码跑酷java源码触发刷写的源码因素包括MemStore大小达到预设阈值、所有MemStore总和达到上限以及RegionServer的源码WAL文件数量限制。当达到高水位,源码写入操作会暂时阻塞,源码直到数据被刷写到磁盘。源码

       读取数据时,源码与写入相反,源码HBase需要从文件开始查找,源码因此写操作通常比读操作更快。源码HBase利用LSM树(Log-Structured Merge Tree)进行底层数据存储,这种结构将数据增量保存在内存中,定期写入磁盘,以提升写入性能。读取时则涉及磁盘和内存数据的全网指标源码大全合并,有时会对读取性能产生影响。HBase通过布隆过滤器加速内存数据读取,同时提供flush、compact和major-compact指令进行数据管理和优化。

       在删除操作中,HBase并不立即删除数据,而是添加删除标记,等待major-compact阶段才彻底删除,以保持历史版本的完整性和数据一致性。文件大小和数量达到一定阈值时,HBase会自动触发文件合并,以减少磁盘I/O和提高查询性能。

       总的来说,HBase的读写机制在追求写入性能的同时,也注重数据的持久化和读取效率的优化,以适应大规模数据存储和处理的需求。

HBase 底层原理详解(深度好文,建议收藏)

       HBase是一个分布式的、面向列的jvm底层源码解析开源数据库,基于Hadoop,主要用于存储大量数据。它在HDFS之上构建,依赖Hadoop生态系统。HBase介于NoSQL和RDBMS之间,只能通过主键(row key)和范围检索数据,支持单行事务。其表具有行键排序和位置相关性特性。

       HBase中表的特点是行键用于检索记录,支持三种访问方式:按行键、按行键范围和通过Zookeeper。行键可以是任意字符串,长度为KB,实际应用中长度一般为-bytes,存储为字节数组。行键排序存储,设计时应考虑经常一起读取的行应放在一起。存储时数据按字典顺序排序,读写操作是板块排序指标源码原子的。

       列族是表的结构的一部分,列归属于列族。列族用于访问控制、磁盘和内存使用统计。列族过多会增加读取数据的I/O和搜索文件次数,因此除非必要,不要设置过多列族。

       列是列族下的具体列,类似于MySQL中的具体列。时间戳用于记录数据的多个版本,通过行键、列和时间戳确定数据单元(cell)。HBase提供两种数据版本回收方式,根据列族设置。单元由row key、column和version唯一确定。数据存储为字节码,版本号为默认时间戳,类型为Long。咸鱼支付系统源码

       HRegion存储在HDFS上的StoreFile格式,每个StoreFile包含Trailer、FileInfo、Data Index、Meta Index和Data Block。Data Block是HBase I/O的基本单位,可选择压缩方式存储,以提高效率。每个Data Block由Magic、Key、Value组成,其中Value为二进制数据。

       Memstore和StoreFile组成一个HRegion,写操作先写入Memstore,当达到阈值时,触发Flush到StoreFile。StoreFile达到一定大小,触发Compact合并操作或Split操作,实现负载均衡。读操作先在Memstore查找,找不到再查找StoreFile。

       HLog(WAL log)用于记录数据变更,用于灾难恢复。每个Region Server维护一个Hlog,而非每个Region一个。合并操作分为Minor Compact和Major Compact,将相同Key的修改合并,形成大StoreFile。当StoreFile大小达到阈值,进行Split,分为两个StoreFile。

       HBase的读写过程包括读请求和写请求。读请求先从Zookeeper获取Meta表信息,访问Meta表所在HRegionServer,扫描Memstore和StoreFile获取数据。写请求先写入HLog和Memstore,Memstore达到阈值触发Flush到StoreFile,系统记录redo point。数据写入后,进行Compact和Split操作,以维持高效的数据管理。

       HRegion管理包括分配、上线和下线。HMaster记录HRegion Server状态,当需要分配HRegion时,发送装载请求给有空闲空间的HRegion Server。HRegion Server上线和下线由HMaster监控,HRegion Server下线时,HMaster重新分配HRegion。

       HMaster工作机制包括上线和下线。HMaster下线导致元数据修改被冻结,集群短时间内不受影响。HMaster下线后,集群中会有一个HMaster等待时机抢占位置。

       HBase的三个重要机制包括Flush机制、Compact机制和Split机制。Flush机制控制Memstore大小,触发数据写入StoreFile。Compact机制合并StoreFile,清理过期数据,将版本号保存为1。Split机制将过大的HRegion一分为二,减少StoreFile数量。

HBASE stop-hbase.sh 后为什么HRegionServer进程还在运行

       æ’入数据结束后,hbase在做compact的操作呢,也就是hregionserver进程在运行呢!你当然关不掉啦

LSM树详解

       解锁LSM树的神秘面纱:存储性能的优化艺术

       LSM树,一个看似平凡实则蕴含强大魔力的数据存储结构,它通过非严格树形布局,巧妙地平衡写入速度与读取效率。其核心策略在于顺序写入,MemTable(内存表)就像是数据的高速缓冲区,记录最近产生的数据,通过Write-Ahead Log (WAL) 确保数据的可靠性。当MemTable达到容量极限,数据会被转换为Immutable MemTable,并以SSTable(顺序读取的磁盘存储结构)的形式持久化。

       LSM树巧妙地避免直接修改SSTable,从而减少写放大和存储冗余。读取时,虽然需要遍历所有SSTable,但通过索引优化,搜索效率得以提升。其中,Compact(合并SSTable)操作是关键所在,它能消除冗余,减少存储空间占用。有两种主要策略:size-tiered和leveled。

       size-tiered策略通过设置每层SSTable的数量和大小限制,虽然可以控制文件大小,但可能导致大文件和空间浪费。而leveled策略更为智能,它在不同层次管理SSTable,确保每个key只在最合适的层中占用一条记录,有效防止空间放大。然而,写放大问题在leveled策略下尤为明显,需要在性能和存储效率之间找到平衡。

       LSM树的设计思想在实践中得到广泛应用,比如在Hbase的MergeTree和ClickHouse的存储组件中,这些数据库凭借LSM树的特性实现了高效的数据处理。存储优化策略并非一蹴而就,Hbase的Major/Minor Compact提供了精细的控制,深入研究RocksDB的合并策略,能让你更深入理解LSM树的奥秘。

       虽然LSM树的世界充满了细节和复杂性,但它正是推动现代数据库性能提升的基石。深入理解LSM树,无疑能让你在数据存储和管理的道路上走得更远。

       

参考资料:

《LSM Tree-Based存储引擎的compaction策略(RocksDB)》

【本文网址:http://04.net.cn/html/76a395095973.html 欢迎转载】

copyright © 2016 powered by 皮皮网   sitemap