HBase读取(GET/SCAN)流程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HBase读取(GET/SCAN)流程相关的知识,希望对你有一定的参考价值。
参考技术A 一、概述二、图解
三、扩展
1、为什么不把META表信息直接保存在ZK中?
ZK中不宜保存大量数据,而META表主要是保存Region和RegionServer的映射信息,Region的数量没有具体约束,只要在内存允许的范围内,Region数量可以有很多,如果保存在ZK中,ZK的压力会很大。通过一个ROOT-表来转存到RegionServer中是一个比较理想的方案,相比直接保存在ZK中,也就多了一层-ROOT-表的查询,对性能来说影响不大。
2、每次访问都需要走ZK –> -ROOT- —> .META.的流程么?
不需要,Client端有缓存,第一次查询到相应region所在RS后,这个信息将被缓存到Client端,以后每次访问都直接从缓存中获取RS地址即可。当然这里有个意外:访问的region若果在RS上发生了改变,比如被balancer迁移到其他RS上了,这个时候,通过缓存的地址访问会出现异常,在出现异常的情况下,Client需要重新走一遍上面的流程来获取新的RS地址。总体来说,region的变动只会在极少数情况下发生,一般变动不会很大,所以在整个集群访问过程中,影响可以忽略。
hbase scan的startRow和endRow
参考技术A 举一个场景,安全领域的溯源分析,查询维度包括ip,时间戳,端口,协议,可能根据前两的维度的一个或者几个进行原始日志查询,我们可以把原始日志存储到hbase中,而前面提到的几个维度可以分别作为key的一部分。首先我们应该考虑的是rowkey的设置,第一:散列或者反转,保证数据会随机分布到不同的region当中。第二:预分区,先对数据做一个基本的统计,比如我们预分十个区,我们可以统计一下每个区的startrow和endrow,这样保证每个区的数据相当,另外这样的好处是当我们根据rowkey查询的时候,可以保证直接定位到某个分区。我们线上的数据就是采用的第二种方式。
然后我们应该考虑rowkey的组成。分两种情况,第一种情况:维度不是特别多,我们完全可以把各个维度分别作为rowkey的一部分,比如上文提到的需求,就是采用的这种方式,因为一共四个维度,相对来说比较少。第二种情况:维度过多,如果都作为rowkey的一部分的话长度太大,此时建议考虑二级索引,举个例子:比如对于上面提到的四个维度,如果现在进行扩展,ip,端口,协议需要定位到源和目的,这样的话,整个维度提升到了七个,此时就建议采用二级索引。
目前我们已经确定了hbase存储,并且采用预分区的方式并且采用rowkey进行过滤查询,那么现在考虑rowkey的设计。从技术角度考虑,预分区的方式时间戳不能作为第一部分,这样一定会出现数据倾斜的现象;从业务角度考虑,我们定位日志的时候,首先需要定位ip,然后是端口,最后才是协议,也就是说我们的用户去定位日志的时候,如果定位到端口,那必须先定位ip,如果定位协议的话,必须先定位ip和端口。
综上所述,我们的rowkey设计为ip+timestamp+port+prot
设计搞定之后,我们再考虑查询的问题。我们知道对于hbase的查询,最快的方式就是get,这样的话,可以迅速定位到一条数据。而get查询其实就是scan的特殊情况,只是startRow和endRow一样。所以此时我们可以采用scan+startRow+endRow的方式进行操作。
e.g
这样的话就可以吧该范围的数据查出来,当然我们可以再在内存中进行过滤
当着startRow和endRow需要注意一些情况。
请参考:https://www.cnblogs.com/llphhl/p/5719119.html
以上是关于HBase读取(GET/SCAN)流程的主要内容,如果未能解决你的问题,请参考以下文章
2021年大数据HBase(十三):HBase读取和存储数据的流程