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。便于日志文件管理。