hbase的读写数据流程、设计原则以及时间戳反转

1.1、HBase的读数据过程

1、客户端通过 zookeeper 以及-root-表和.meta.表找到目标数据所在的 regionserver(就是数据所在的 region 的主机地址)
(0.98版本以前,0.98及以后没有-ROOT-表)
2、联系 regionserver 查询目标数据
3、 regionserver 定位到目标数据所在的 region,发出查询请求
4、 region 先在 memstore 中查找,命中则返回
5 、 如果在 memstore 中找不到,则在storefile 中扫描 (可能会扫描到很多的storefile----BloomFilter)

1.2、HBase的写数据过程
1、 client 先根据 rowkey 找到对应的 region 所在的 regionserver
2、 client 向 regionserver 提交写请求
3、 regionserver 找到目标 region
4、 region 检查数据是否与 schema 一致
5、如果客户端没有指定版本,则获取当前系统时间作为数据版本
6、将更新写入 WAL log
7、将更新写入 Memstore

1.3、HBase的rowkey的设计原则

HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这个三个维度可以对HBase中的数据进行快速定位。

HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有两种方式:

1、通过get方式,指定rowkey获取唯一一条记录
2、通过scan方式,设置startRow和stopRow参数进行范围匹配

3、全表扫描,即直接扫描整张表中所有行记录

1.4、rowkey长度原则:

rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。建议越短越好,不要超过16个字节,原因如下:

数据的持久化文件HFile中是按照KeyValue存储的,如果rowkey过长,比如超过100字节,1000w行数据,光rowkey就要占用100*1000w=10亿个字节,将近1G数据,这样会极大影响HFile的存储效率;
MemStore将缓存部分数据到内存,如果rowkey字段过长,内存的有效利用率就会降低,系统不能缓存更多的数据,这样会降低检索效率。

1.5、时间戳反转
一个常见的数据处理问题是快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分对这个问题十分有用,可以用Long.Max_Value - timestamp追加到key的末尾,例如[key][reverse_timestamp],[key]的最新值可以通过scan [key]获得[key]的第一条记录,因为HBase中rowkey是有序的,第一条记录是最后录入的数据。

比如需要保存一个用户的操作记录,按照操作时间倒序排序,在设计rowkey的时候,可以这样设计
[userId反转][Long.Max_Value - timestamp],在查询用户的所有操作记录数据的时候,直接指定反转后的userId,startRow是[userId反转][000000000000],stopRow是[userId反转][Long.Max_Value - timestamp]

猜你喜欢

转载自blog.csdn.net/IQiaoKeLi/article/details/86309892