HBase简介
2018-11-30 本文已影响109人
丹之
简介
物理视图
- HBase支持数据多版本特性,通过带有不同时间戳的多个KeyValue版本来实现的;
- 每次put,delete都会产生一个新的Cell,都拥有一个版本;
- 默认只存放数据的三个版本,可以配置;
- 查询默认返回最新版本的数据,可以通过制定版本号或版本数获取旧数据。
架构设计
HBase 的写过程如下:
- 先将数据写到WAL中;
- WAL 存放在HDFS之上;
- 每次Put、Delete操作的数据均追加到WAL末端;
- 持久化到WAL之后,再写到MemStore中;
-
两者写完返回ACK到客户端。
MemStore 其实是一种内存结构,一个Column Family 对应一个MemStore,MemStore 里面的数据也是对 Rowkey 进行字典排序的,如下:
既然我们写数都是先写 WAL,再写 MemStore ,而 MemStore 是内存结构,所以 MemStore 总会写满的,将 MemStore 的数据从内存刷写到磁盘的操作成为 flush:
每次 flush 操作都是将一个 MemStore 的数据写到一个 HFile 里面的,所以上图中 HDFS 上有许多个 HFile 文件。文件多了会对后面的读操作有影响,所以 HBase 会隔一定的时间将 HFile 进行合并。根据合并的范围不同分为 Minor Compaction 和 Major Compaction:
Minor Compaction: 指选取一些小的、相邻的HFile将他们合并成一个更大的Hfile。
Major Compaction: - 将一个column family下所有的 Hfiles 合并成更大的;
-
删除那些被标记为删除的数据、超过TTL(time-to-live)时限的数据,以及超过了版本数量限制的数据。
HBase 读操作相对于写操作更为复杂,其需要读取 BlockCache、MemStore 以及 HFile。
Rowkey 的作用
HBase 中的 Rowkey 主要有以下的作用:
- 读写数据时通过Row Key找到对应的Region
- MemStore 中的数据按RowKey字典顺序排序
-
HFile中的数据按RowKey字典顺序排序
从下图可以看到,底层的 HFile 最终是按照 Rowkey 进行切分的,所以我们的设计原则是结合业务的特点,并考虑高频查询,尽可能的将数据打散到整个集群。