Hbase 读取流程

Hbase 读取复杂原因:

主要基于两个方面的原因:

  • 一是因为HBase一次范围查询可能会涉及多个Region、多块缓存甚至多个数据存储文件(HFile);
  • 二是因为HBase中更新操作以及删除操作的实现都很简单。
    插入&删除: 没有更新原始数据,而是通过时间戳属性新增版本。
    删除:只是插入deleted标签。在Major Compact的时候删除真正数据。
    读取过程需要根据版本进行过滤,对已经标记删除的数据也要进行过滤。

读流程步骤:

  • Client-Server读取交互逻辑
  • Server端Scan框架体系
  • 过滤淘汰不符合查询条件的HFile
  • 从HFile中读取待查找Key。

1. Client-Server读取交互逻辑

Client首先会从ZooKeeper中获取元数据hbase:meta表所在的RegionServer,然后根据待读写rowkey发送请求到元数据所在RegionServer,获取数据所在的目标RegionServer和Region(并将这部分元数据信息缓存到本地),最后将请求进行封装发送到目标RegionServer进行处理。

  • hbase的读取请求分为get和scan,而get实际是最简单的一次scan。

  • client-server端将scan没有使用一次rpc,原因:
    •大量数据传输会导致集群网络带宽等系统资源短时间被大量占用,严重影响集群中其他业务。
    •客户端很可能因为内存无法缓存这些数据而导致客户端OOM。


    image.png
  • 一次大的scan操作会拆分为多个RPC请求。每个RPC是一次next请求,分会规定数量的结果。每次next()操作,客户端先检查本地缓存,没有就发一次RPC请求给服务器,然后缓存到本地。

  • 单次RPC caching大小默认是Integer.MAX_VALUE。设置过大可能因为一次获取到的数据量太大导致服务器端/客户端内存OOM;设置太小会导致一次大scan进行太多次RPC,网络成本高。

  • 对于一张表列过大,可以通过setBatch方法设置一次RPC请求的数据列数量。

  • 客户端还可以通过setMaxResultSize方法设置每次RPC请求返回的数据量大小(不是数据条数),默认是2G。

2 Server端Scan框架体系

  • 一次scan可能会同时扫描一张表的多个Region。客户端会根据hbase:meta元数据将扫描的起始区间[startKey, stopKey)进行切分,切分成多个互相独立的查询子区间,每个子区间对应一个Region。

  • HBase中每个Region都是一个独立的存储引擎,因此客户端可以将每个子区间请求分别发送给对应的Region进行处理。下文会聚焦于单个Region处理scan请求的核心流程。

  • RegionServer接收到客户端的get/scan请求之后做了两件事情:首先构建scanner iterator体系;然后执行next函数获取KeyValue,并对其进行条件过滤。

image.png

image.png
  1. 构建Scanner Iterator体系
    1)过滤淘汰部分不满足查询条件的Scanner。
    主要过滤策略有:TimeRange过滤、Rowkey Range过滤以及布隆过滤器


    image.png

    2)每个Scanner seek到startKey

  • 根据HFile索引树定位目标Block


    image.png
  • BlockCache中检索目标Block
    Block缓存到Block Cache之后会构建一个Map,Map的Key是BlockKey,Value是Block在内存中的地址。其中BlockKey由两部分构成——HFile名称以及Block在HFile中的偏移量。BlockKey很显然是全局唯一的。根据BlockKey可以获取该Block在BlockCache中内存位置,然后直接加载出该Block对象。如果在BlockCache中没有找到待查Block,就需要在HDFS文件中查找。
  • HDFS文件中检索目标Block


    image.png

    根据文件索引提供的Block Offset以及Block DataSize这两个元素可以在HDFS上读取到对应的Data Block内容。

为什么HDFS的Block设计为128M,而HBase的Block设计为64K ?
1. HDFS Block 为128M,因为 主要存储文件,Block太小,会导致Block元数据(Block所在DataNode位置、文件与Block之间的对应关系等)庞大。因为HDFS元数据都存储在NameNode上,大量的元数据很容易让NameNode成为整个集群的瓶颈。
2. HBase的缓存策略是缓存整个Block,如果Block设置太大会导致缓存很容易被耗尽,尤其对于很多随机读业务,设置Block太大会让缓存效率低下。

  • 从Block中读取待查找KeyValue

3)KeyValueScanner合并构建最小堆
最小堆管理Scanner可以保证取出来的KeyValue都是最小的,这样依次不断地pop就可以由小到大获取目标KeyValue集合,保证有序性。

执行next函数获取KeyValue并对其进行条件过滤

1)检查该KeyValue的KeyType是否是Deleted/DeletedColumn/DeleteFamily等
2)检查该KeyValue的Timestamp是否在用户设定的Timestamp Range范围
3)检查该KeyValue是否满足用户设置的各种filter过滤器
4)检查该KeyValue是否满足用户查询中设定的版本数

总结: 读取过程中,是先根据TimeRange,Rowkey Range,bloomfilter判断数据是否在对应文件,再将文件中的数据读取出来,判断是否删除,是否符合用户条件。

读取过程总结:

  1. 客户端: 将scan 转变为多次next请求。将请求转变为发送对应region(读zk,读meta找到对应region)的请求
  2. 服务器端:过滤掉不符合查询条件的hfile,读取符合条件的hfile,构建最小堆
    (1)过滤hfile方式:TimeRange,RowKey,bloomfiler
    (2) hfile索引树定位目标block
    (3)检索block: blockcache中检索、hdfs文件中检索block
  3. 获取keyvalue,next过滤:
    (1)keytype判断是否删除
    (2)timestamp判断timerange
    (3) 判断用户filter
    (4) 判断版本号
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容