Hbase 的相关原理

  • hbase架构
  • hbase中的核心概念
  • region 分区
  • store
  • memoryStore
  • storeFile
  • hfile
  • wal


hbase架构

Hbase是主从架构:
主:hmaster
从:hregionserver
hregionserver 里面存储的是一个个 region

hbase中的核心概念

region 分区

  • 每一个表的数据, 都需要划分为多个region
  • region 是对hbase表在行的方向上的划分,一个region代表的是一个表中的多行数据,或者说是一定行健范围的数据(数据是连续的)。
  • region 是hbase进行 分布式存储的最小单位,负载均衡的最小单位,不是物理存储的最小单位。
  • 一个region不可再进行分割。在进行分布式存储的时候,一个region最终只能存储在一个hbase 节点上(hregionserver);一个hregionserver 上可以存储多个region。
  • 每一个hbase表进行创建的时候,默认只有一个region
  • 刚开始进行数据插入的时候,操作只是在这一个region上进行。随着数据插入,数据量不断增加,当数据量达到一定的大小的时候,必然进行region的split(切分)。一个region切分为2个region,一旦切分完成,就会面临新的region的重新分配,hmaster决定每个region存储在哪一个hregionserver(节点)上。原来的老的region 需要下线。
  • 每一个region到多大进行split?在hbase的配置文件中,已经配置了。
<property>
    <name>hbase.hregion.max.filesize</name>
    <value>10737418240</value>
    <description>
    Maximum HStoreFile size. If any one of a column families' HStoreFiles has
    grown to exceed this value, the hosting HRegion is split in two.</description>
    </property>

每一个region中一个列族的物理文件达到10G 才进行切分

  • 切分时候 如何切分?按照rowkey的中间值进行切分
  • 每一个region 都会有一个全局唯一的一个编号。
  • 一个表可能对应多个region
  • 一个region可能对应多个物理文件(一个列族对应一个物理文件)
  • 物理文件最终存储在hdfs上

安装hbase时,在hbase-site.xml上配置过

<property>
        <!-- 指定 hbase 在 HDFS 上存储的路径 -->
        <name>hbase.rootdir</name>
        <value>hdfs://bd1904/user/hbase</value>
</property>

所以一个region在hdfs上的路径为:/user/hbase/data/default/user_info/313c7bb8491d6207ac0153c0392cc392(region编号)

  • 刚开始进行hbase表数据插入操作时候,在这个region分裂之前,所有操作的都是这一个region上进行。操作只在一个regionserver进行这种现象在另一个层面,也被称为数据热点。
  • 如何解决数据热点? 在建表的时候 进行表预分区(region),也就是建表的时候,指定多个分区。
  • 如何操作? 可以通过api或者shell操作。shell操作时,指定splits。eg:SPLITS => [‘10’, ‘20’, ‘30’, ‘40’]
  • 预分区之后,在插入数据的时候,应尽量避免 数据的rowkey顺序递增。

hbase中的数据热点:

  • 客户端在进行数据操作(读或写)的时候,频繁地操作某一个或某几个region,造成这个region所在的regionServer(节点)拥挤,成为热点。
  • 数据热点产生的根源:经常访问的数据被集中分配在了某一个或者某几个region上了。
  • 所以在hbase的操作过程中,要尽量避免数据热点。

store

  • 一个Store对应一个列族.,是hbase 物理存储的最小单元。
  • 1个region可能对应多个Store,一个store对应一个 列族
  • 进行存储的时候,一个Store,包含一个memestore 和 0~多个 storefile

memoryStore

  • 每一个store中,都会有一段内存存储空间。
  • 写入数据的时候,每一个Store中的数据,都会先写入到memstore
  • 读取数据的时候,先从内存中读取。即 memoryStore

storeFile

  • storefile就是文件,磁盘文件。
  • memstore 中达到一定的阈值时候,就会进行数据flush,形成一个个的storefile。

在hbase-default.xml中已经配置好了。

<property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>134217728</value>
    <description>
    Memstore will be flushed to disk if size of the memstore
    exceeds this number of bytes.  Value is checked by a thread that runs
    every hbase.server.thread.wakefrequency.</description>
</property>

memstore 达到阈值128M的时候,就会进行flush。

  • storefile 是 hbase中的数据,是一个中间存储结果。

hfile

hfile文件 是storefile文件写入到hdfs上的最终文件

wal

  • write-ahead-log :写前日志文件,或者叫 预写日志文件,有时候也写作 hlog
  • 为了防止memstore中的数据丢失, 做容错用的。
  • 写入数据之前,会先将数据操作写入到 wal中,一旦数据写入成功,就会将数据写入wal-old
  • 一个regionserver中会存储一个wal文件。
  • 因为一个regionserver中会存储多个region,所以同一个regionserver的所有的region公用一个wal。便于日志文件管理。