hbase数据仓库already

HBase分布式数据库概念与实操

2022-04-07  本文已影响0人  马小莫QAQ

一、HBase的整体架构

1、Client客户端

Client是操作HBase集群的入口,对于管理类的操作,如表的增、删、改操纵,Client通过RPC与HMaster通信完成,对于表数据的读写操作,Client通过RPC与RegionServer交互,读写数据。 Client类型:

2、ZooKeeper集群

作用: 1、实现了HMaster的高可用,多HMaster间进行主备选举 2、保存了HBase的元数据信息meta表,提供了HBase表中region的寻址入口的线索数据 3、对HMaster和HRegionServer实现了监控

3、HMaster

HBase集群也是主从架构,HMaster是主的角色,主要负责Table表和Region的相关管理工作,管理Client对Table的增删改的操作,在Region分裂后,负责新Region分配到指定的HRegionServer上,管理HRegionServer间的负载均衡,迁移region分布。当HRegionServer宕机后,负责其上的region的迁移。

4、HRegionServer

HBase集群中从的角色,作用为响应客户端的读写数据请求、负责管理一系列的Region、切分在运行过程中变大的region。

5、Region

HBase集群中分布式存储的最小单元,一个Region对应一个Table表的部分数据。

如下为HBase的整体架构图:

二、HBase的数据存储原理

( 如果一个表中只有1个列族,那么这个表的每一个region中只有一个store,如果一个表中有N个列族,那么这个表的每一个region中有N个store)

三、HBase读数据流程

说明:HBase集群,只有一张meta表,此表只有一个region,该region数据保存在一个HRegionServer上

  1. 客户端首先与zk进行连接; 从zk找到meta表的region位置,即meta表的数据存储在某一HRegionServer上; 客户端与此HRegionServer建立连接,然后读取meta表中的数据;meta表中存储了所有用户表的region信息,我们可以通过scan 'hbase:meta'来查看meta表信息
  2. 根据要查询的namespace、表名和rowkey信息。找到写入数据对应的region信息
  3. 找到这个region对应的regionServer,然后发送请求
  4. 查找并定位到对应的region
  5. 先从memstore查找数据,如果没有,再从BlockCache上读取 HBase上Regionserver的内存分为两个部分 一部分作为Memstore,主要用来写; 另外一部分作为BlockCache,主要用于读数据;
  6. 如果BlockCache中也没有找到,再到StoreFile上进行读取 从storeFile中读取到数据之后,不是直接把结果数据返回给客户端,而是把数据先写入到BlockCache中,目的是为了加快后续的查询;然后再返回结果给客户端。

四、HBase写数据流程

1、客户端首先从zk找到meta表的region位置,然后读取meta表中的数据,meta表中存储了用户表的region信息 2、根据namespace、表名和rowkey信息。找到写入数据对应的region信息 3、找到这个region对应的regionServer,然后发送请求 4、把数据分别写到HLog(write ahead log)和memstore各一份 5、memstore达到阈值后把数据刷到磁盘,生成storeFile文件 6、删除HLog中的历史数据

HLog(write ahead log):也称为WAL意为Write ahead log,类似mysql中的binlog,用来做灾难恢复时用,HLog记录数据的所有变更,一旦数据修改,就可以从log中进行恢复。

五、HBase的flush、compact机制

5.1 Flush触发条件

5.1.1 memstore级别限制
<property>
   <name>hbase.hregion.memstore.flush.size</name>
   <value>134217728</value>
</property>
5.1.2 region级别限制

当Region中所有Memstore的大小总和达到了上限(
hbase.hregion.memstore.block.multiplier * hbase.hregion.memstore.flush.size,默认 2* 128M = 256M),会触发memstore刷新。

<property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>134217728</value>
</property>
<property>
    <name>hbase.hregion.memstore.block.multiplier</name>
    <value>4</value>
</property>
5.1.3 Region Server级别限制
<property>
    <name>hbase.regionserver.global.memstore.size.lower.limit</name>
    <value>0.95</value>
</property>
<property>
    <name>hbase.regionserver.global.memstore.size</name>
    <value>0.4</value>
</property>
5.1.4 HLog数量上限

当一个Region Server中HLog数量达到上限(可通过参数
hbase.regionserver.maxlogs配置)时,系统会选取最早的一个 HLog对应的一个或多个Region进行flush

5.1.5 定期刷新Memstore

默认周期为1小时,确保Memstore不会长时间没有持久化。为避免所有的MemStore在同一时间都进行flush导致的问题,定期的flush操作有20000左右的随机延时。

5.1.6 手动flush

用户可以通过shell命令flush ‘tablename’或者flush ‘region name’分别对一个表或者一个Region进行flush。

5.2 flush的流程

5.3 Compact合并机制

5.3.1 minor compaction 小合并

在将Store中多个HFile合并为一个HFile,在这个过程中会选取一些小的、相邻的StoreFile将他们合并成一个更大的StoreFile,对于超过了==TTL的数据、更新的数据、删除的数据==仅仅只是做了标记。并没有进行物理删除,一次Minor Compaction的结果是更少并且更大的StoreFile。这种合并的触发频率很高。 minor compaction触发条件由以下几个参数共同决定:

<!--默认值3;表示一个store中至少有4个store file时,会触发minor compaction-->
<property>
    <name>hbase.hstore.compactionThreshold</name>
    <value>3</value>
</property>

<!--默认值10;表示一次minor compaction中最多合并10个store file-->
<property>
    <name>hbase.hstore.compaction.max</name>
    <value>10</value>
</property>

<!--默认值为128m;表示store file文件大小小于该值时,一定会加入到minor compaction的-->
<property>
    <name>hbase.hstore.compaction.min.size</name>
    <value>134217728</value>
</property>

<!--默认值为LONG.MAX_VALUE;表示store file文件大小大于该值时,一定会被minor compaction排除-->
<property>
    <name>hbase.hstore.compaction.max.size</name>
    <value>9223372036854775807</value>
</property>
5.3.2 major compaction 大合并

合并Store中所有的HFile为一个HFile,将所有的StoreFile合并成一个StoreFile,这个过程还会清理三类无意义数据:被删除的数据、TTL过期数据、版本号超过设定版本号的数据。合并频率比较低,默认7天执行一次,并且性能消耗非常大,建议生产关闭(设置为0),在应用空闲时间手动触发。一般可以是手动控制进行合并,防止出现在业务高峰期。

major compaction触发时间条件

<!--默认值为7天进行一次大合并,-->
<property>
    <name>hbase.hregion.majorcompaction</name>
    <value>604800000</value>
</property>

手动触发

##使用major_compact命令
major_compact tableName

六、HBase表的预分区

当一个table刚被创建的时候,Hbase默认的分配一个region给table。也就是说这个时候,所有的读写请求都会访问到同一个regionServer的同一个region中,这个时候就达不到负载均衡的效果了,集群中的其他regionServer就可能会处于比较空闲的状态。 解决这个问题可以用pre-splitting,在创建table的时候就配置好,生成多个region。

6.1 预分区意义

6.2 预分区原理

6.3 手动指定预分区

方式一:直接创建时使用数组指定

create 'person','info1','info2',SPLITS => ['1000','2000','3000','4000']

方式二:也可以把分区规则创建于文件中

cd /book/install
vim prepart.txt

文件内容

aaa
bbb
ccc
ddd

hbase shell中,执行命令

create 'student','info',SPLITS_FILE => '/book/install/prepart.txt'

方式三: HexStringSplit 算法 HexStringSplit会将数据从“00000000”到“FFFFFFFF”之间的数据长度按照n等分之后算出每一段的起始rowkey和结束rowkey,以此作为拆分点。

如:

create 'mytable', 'base_info',' extra_info', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

作者:大力橙子
链接:https://juejin.cn/post/7081815636510736398
来源:稀土掘金

上一篇下一篇

猜你喜欢

热点阅读