君子终日乾乾,夕惕若厉,无咎。|

唐钰逍遥

园龄:9年9个月粉丝:0关注:0

hbase知识点

定义

Hbase 是一个分布式的、面向列的 NoSQL 数据库,是 Google BigTable 的开源实现,基于 Hadoop 和 Zookeeper 构建,可以提供海量结构化和半结构化数据的存储和随机访问。

NOSql和传统Sql的区别:

  1. 传统sql需要设计好结构化的建表语句,而NOSql不需要预先设计,想放什么字段,就放什么字段。

数据模型

Hbase 的数据模型类似于一个多维的稀疏表,由行键、列族、列限定符和时间戳组成。每个表可以有多个列族,每个列族可以有多个列限定符,每个单元格可以有多个版本,由时间戳标识。

存储架构

Hbase 的存储结构是基于 HDFS 的文件系统,

  • 每个表被划分为多个 Region;
  • 每个 Region 存储一部分行键的范围;
  • 每个 Region 由一个或多个 Store 组成;
  • 一个列族可以对应多个Store,但是一个 Store 只能对应一个列族。
    Region的可分割性决定的,一个列族数据如果过大,就会分裂到不同Region的Store中。
  • 每个 Store 由一个 MemStore 和多个 HFile 组成。
  • MemStore 是一个内存缓冲区,用于存储写入的数据。
  • HFile 是一个有序的、不可变的文件,用于存储持久化的数据。

读写流程

Hbase 的读写流程是通过客户端和 RegionServer 之间的 RPC 通信实现的。

写过程

  1. 客户端首先从 Zookeeper 或者客户端缓存中获取 Region 的位置信息;
    从zk中找到Meta这张表的RegionServer分布,拿到Rowkey和RegionServer、Region的分布关系,并且会在客户端中缓存一份。
  2. 然后根据行键找到对应的 RegionServer;
  3. 再根据列族找到对应的 Store;
  4. 先使用WAL机制写入HLog(防止内存顺序写宕机导致数据丢失),存储在HDFS。
    异常宕机后会用作恢复数据使用。
  5. 最后写入到 MemStore达到阈值或者定时flush到HFile中存到HDFS。
    HLog主要是用于HBase灾难恢复用,数据以顺序写的方式追加到文件后边,因此写入效率堪比内存写入;其内容可以看成是MemStore内容的镜像;HBase写入的时候是先写入HLog,再写入MemStore的,顺序不能颠倒,两者都写入成功才算一次提交成功。
  6. 异步流程:HFile的合并,合并尽量手动控制。且在提供查询服务之前完成。
  • 合并
    • minor compact
      一个region内部部分合并,合并的文件根据Hfile的年龄决定,年龄越大文件越小的越靠前被合并。不会清理被删除的数据、过期的数据、多余的版本。
    • major compact
      将一个store下的所有Hfile文件合并成一个Hfile,一般是禁用掉(默认七天合并一次)的然后手动执行(major_compact table_name)

读过程

  1. 客户端首先从 Zookeeper 或者客户端缓存中获取 Region 的位置信息;
    从zk中找到Meta这张表的RegionServer分布,拿到Rowkey和RegionServer、Region的分布关系,并且会在客户端中缓存一份。
  2. 然后从Region中根据行键找到对应的 RegionServer;
  3. 再根据列族找到对应的 Store;
  4. 先从MemStore中查找数据;(B+树)
  5. 最后再从HFile中查找,查到则将读取的数据块缓存到 BlockCache 中,以便下次读取时可以直接从内存中获取,提高读取性能。
  6. 读请求会将从 MemStore、BlockCache 或者 HFile 中读取的数据进行合并,得到最终的结果,并返回给客户端。
  • 为什么不是从MemStore中找到数据直接返回?

    因为MemStore中的数据可能不全也有可能不是最新的,因为数据可能不经过他们直接通过bulkload将hfile导入到hbase中。

  • HFfile中数据的查找过程
    三层B+树:跟索引、中间索引、叶子索引
    跳跃三层树找到叶子节点的数据块,判断数据块是否在BlockCache中在的话直接返回,不在的话先返回然后存储到BlockCache中。
    Block的大小默认为64KB

    1699010873028

总结:

HBase有一个元数据表,叫做hbase:meta,它存储了每个Region的信息,包括表名,Region名,起始键,结束键,RegionServer地址,列族目录,StoreFile列表等。当用户查询一个表的数据时,HBase会先根据表名和Row Key在hbase:meta表中定位到对应的Region,然后根据列族名和Column Qualifier在Region中定位到对应的StoreFile,然后根据TimestampVersion在StoreFile中定位到对应的HFile,然后根据HFile的索引布隆过滤器在HFile中定位到对应的Block,然后从Block中读取对应的KeyValue。这样,HBase可以快速地找到用户需要的数据,而不需要遍历所有的Region和StoreFile。

HFile

快速找到文件的秘密

  • 布隆过滤器
    在判断文件中存在某个rowkey方面很在乎,因为哈希碰撞问题(判存很大概率会出现误判,但是判断不存在100%)
  • LSM
    三层B+树:跟索引、中间索引、叶子索引
  • 数据预加载到内存
    读取到Hfile时就会加载:LRUBlockCache 是一种基于 LRU 算法的缓存,它存储在 JVM 内存中,主要用于缓存索引块和布隆过滤器块。
    命中数据块时加载:BucketCache 是一种基于 SlabCache 设计的缓存,它存储在堆外内存中,主要用于缓存数据块。

Region 分割和HFile合并

HBase表按照行键的范围划分为多个Region,每个Region是一个数据分片,由一个RegionServer负责管理。一个Region在存储时,会将数据刷写到一个或多个HFile中,HFile是HBase的底层存储文件,它使用LSM树的结构来实现高效的读写。HFile是和列族(Column Family)对应的,如果一个表中有多个列族,那么一个Region就会对应多个HFile。

随着数据的不断写入,HFile的数量和大小会不断增加,这会影响HBase的读写性能,因此,HBase会定期对HFile进行合并(Compaction)操作,以减少文件数,提高数据本地化率,清理无效数据。HFile的合并分为两种类型,分别是Minor Compaction和Major Compaction。Minor Compaction是将部分小的、相邻的HFile合并成一个更大的HFile,这个过程不会清理无效数据,只是为了减少文件数。Major Compaction是将一个列族中所有的HFile合并成一个HFile,这个过程会清理被删除的数据、TTL过期数据、版本号超过设定版本号的数据,这样可以释放空间,提高查询效率。Major Compaction是一个耗时和耗费资源的操作,会影响集群性能,一般情况下都是做Minor Compaction,不少集群是禁止Major Compaction的,只有在集群负载较小时进行手动Major Compaction操作,或者配置Major Compaction周期,默认为7天。

另一方面, 当 region 中最大的 store 大小超过某个阈值 (hbase.hregion.max.filesize=10G) 之后就会触发切分 ,它就会被分裂成两个新的Region,这个过程是由RegionServer完成的,叫做Region Split。Region Split的目的是为了实现HBase的水平扩展,让数据分布到多台机器上,提高并发能力。Region Split的过程大致如下:

  • 将需要拆分的Region下线,阻止所有对该Region的客户端请求,Master会检测到Region的状态为SPLITTING。
  • 将一个Region拆分成两个子Region,先在父Region下建立两个引用文件,分别指向Region的首行和末行,这时两个引用文件并不会从父Region中复制数据。
  • 之后在HDFS上建立两个子Region的目录,分别复制上一步建立的引用文件,每个子Region分别占父Region的一半数据。
  • 复制登录完成后删除两个引用文件。
  • 完成子Region创建后,向Meta表发送新产生的Region的元数据信息。
  • 将Region的拆分信息更新到HMaster,并且每个Region进入可用状态。

HBase 有多种分割策略,可以根据 Region 的大小、数量、前缀等条件来触发分割,也可以手动指定分割点或强制分割。

  • 分割可以提高数据的分布均衡性,避免出现数据倾斜和热点问题,影响读写性能和负载均衡。
  • 分割可以提高数据的查询效率,减少扫描的范围和时间,提高并发度。
  • 分割可以提高数据的可扩展性,支持海量数据的存储和访问,利用多台机器的资源。

分布式结构

Hbase 的分布式架构由三种角色组成:Master、RegionServer 和 Zookeeper。

  • Master 负责管理表的元数据、负载均衡和故障恢复。
  • RegionServer 负责处理客户端的请求、维护 Region 的生命周期和执行数据刷写和合并。
  • Zookeeper 负责协调 Master 和 RegionServer 之间的状态信息和选举。

优化点

  • 热点问题
    • 预分区
    • RowKey Hash 散列

本文作者:唐钰逍遥

本文链接:https://www.cnblogs.com/tyxy/p/17807284.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   唐钰逍遥  阅读(28)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起