hbase查询rowkey后缀范围_Server


8、hbase数据flush过程

① 当MemStore数据达到阈值(默认是128M,老版本是64M),把数据刷到硬盘,将内存中的数据删除,同时删除HLog中的历史数据。

② 将数据存储到HDFS中。

③ 在HLog中做标记点。

9、数据合并过程

① 当数据块达到4块,hmaster将数据块加载到本地,进行合并。

② 当合并的数据超过256M,进行拆分,将拆分后的region分配给不同的hregionserver管理。

③ 当hregionser宕机后,将hregionserver上的hlog拆分,然后分配给不同的hregionserver加载,修改.META。

注意:hlog会同步到hdfs

10、Hmaster和Hgionserver的职责

Hmaster的职责

① 管理用户对Table的增、删、改、查操作。

② 记录region在哪台Hregion server上。

③ 在Region Split后,负责新Region的分配。

④ 新机器加入时,管理HRegion Server的负载均衡,调整Region分布。

⑤ 在HRegion Server宕机后,负责失效HRegion Server 上的Regions迁移。

Hgionserver的职责

① HRegion Server主要负责响应用户I/O请求,向HDFS文件系统中读写数据,是HBASE中最核心的模块。

② HRegion Server管理了很多table的分区,也就是region。


hbase查询rowkey后缀范围_搜索_02


11、HBase列族和region的关系

HBase有多个RegionServer,每个RegionServer里有多个Region,一个Region中存放着若干行的行键以及所对应的数据,一个列族是一个文件夹,如果经常要搜索整个一条数据,列族越少越好,如果只有一部分的数据需要经常被搜索,那么将经常搜索的建立一个列族,其他不常搜索的建立列族检索较快。

12、请简述Hbase的物理模型是什么?

13、如果使用Hbase做即席查询,如何设计二级索引?

14、如何避免读、写HBase时访问热点问题?

加盐

这里所说的“加盐”,不是密码学中的“加盐”,而是在rowkey的前面增加随机数。具体就是给rowkey分配一个随机前缀,使得它和之前的rowkey的开头不同。

那么,给多少个前缀?这个数量应该和我们想要分散数据到不同的region的数量一致(类似hive里面的分桶)。

更通俗易懂的理解:region数量是一个范围,我们给rowkey分配一个随机数,前缀(随机数)的范围是region的数量。

加盐之后的rowkey就会根据随机生成的前缀分散到各个region上,以避免热点。


hbase查询rowkey后缀范围_Server_03


哈希

哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。

反转

第三种防止热点的方法是“反转”-固定长度或者数字格式的rowkey。这样可以使得rowkey中经常改变的部分(最没有意义的部分)放在前面。这样做可以有效的随机rowkey,但是牺牲了rowkey的有序性。

反转rowkey的例子:以手机号为rowkey,可以将手机号反转后的字符串作为rowkey,从而避免诸如139、158之类的固定号码开头导致的热点问题。

时间戳反转

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


hbase查询rowkey后缀范围_hbase查询rowkey后缀范围_04


减少行和列的大小

在HBase中,value永远和它的key一起传输的。当具体的值在系统间传输时,它的rowkey,列名,时间戳也会一起传输。如果你的rowkey和列名很大,HBase storefiles中的索引(有助于随机访问)会占据HBase分配的大量内存。因为具体的值和它的key很大。此时,可以增加block大小,使得storefiles索引再更大的时间间隔增加,或者修改表的模式以减小rowkey和列名的大小。压缩也有助于更大的索引。

其他办法

列族名的长度尽可能小,最好是只有一个字符。冗长的属性名虽然可读性好,但是更短的属性名存储在HBase中会更好。也可以在建表时预估数据规模,预留region数量,例如create ‘myspace:mytable’, SPLITS => [01,02,03,…99]。

我是IT鸣人,喜欢我的文章欢迎 转发 及 关注

如果你在学习过程中或者择业时有什么问题和困惑,欢迎私信或留言。