今天来讲讲HBase读的过程:

1、HBase读过程详解

2.1影响HBase读取命令的参数

HBase读包含两种命令:get ,基于确切的RowKey去获取一行数据,通常被称之为随机点查;scan,指定一个RowKey的范围区间,获取该区间的所有记录,当区间未明确指定时,scan退化为全表扫描;

图2.1 client端scan的示意图

Client每一次往RegionServer发送scan请求,都会批量拿回一批数据(由Caching决定每一次拿回的Results数量),然后放到本次的Result Cache中:应用每一次读取数据都是从本地的Result Cache中获取的,如果Result Cache中的数据读完了,则Client会再次往RegionServer发送scan请求获取更多的数据。此处有8个编程参数会影响读取过程:

①Caching: 设置一次RPC请求批量读取Results的数量;scan.setCaching(100);

②Batch: 设置每一个Result中的列的数量;scan.setBatch(10);

③Limit: 限制一次Scan操作所获取的行的数量;scan.setLimit(1000);

④Cache Block: RegionServer侧是否要缓存本次Scan所涉及的HFileBlocks;scan.setCacheBlocks(true);

⑤Raw Scan: 是否可以读取到删除标识以及被删除但尚未被清理的数据;scan.setRaw(true);

⑥MaxResultSize: 从内存占用量的维度限制一次Scan的返回结果集;scan.setMaxResultSize(5*1024*1024);

⑦Reversed Scan: 反向扫描,普通的Scan操作是按照字典顺序从小到大的顺序读取的,而Reversed Scan则恰好相反:scan.setReversed(true);

⑧带Filter的Scan,Filter可以在Scan的结果集基础之上,对返回的记录设置更多条件值,这些条件可以与RowKey有关,可以与列名有关,也可以与列值有关,还可以将多个Filter条件组合在一起等;scan.setFilter(filter);

2.2读取过程详述

Client发送读取请求后,整个读取过程叙述如下:

2.2.1 定位Region

定位请求关联的Region的时候,对于get定位与rowkey参数关联的region;对于scan先定位与starRow参数关联的region;过程详述如下:

2.2.1.1找到-ROOT-表

要根据查询参数的rowkey找到到对应的结果数据,需要先找-ROOT-表,-ROOT-表中存放了.META.表是由哪个regionServer管理的信息,而.META.表保存了Hbase中所有数据表的region的位置信息。要找-ROOT-表,则需要先与zookeeper通信,找到管理-ROOT-表的RegionServer的地址,这个地址存在zookeeper中,默认值是:/hbase/root-region-server;找到管理-ROOT-表的Regionserver的地址后,就可以与这个RegionServer通信,获取到-ROOT-表的内容,-ROOT-表的内容如下:

表2.2.1.1.1 -ROOT-表结构

可以看到,-ROOT-表的内容包含了各个RegionServer上都管理了哪些.META.表的信息,这些.META.表中又有哪些Region,相关的rowkey在怎样的范围等信息,因此通过rowkey可以在-ROOT-表中找到具体和rowkey相关的.META.表所在的regionServer地址信息;因.META.表也是有region的,也会不断进行分裂的,所以需要记录timestamp,查找的时候要找最新timestamp对应的记录;

每个regionServer启动的时候,都会分配一个startcode,和host,port,startcode统一构成一个regionserver的唯一标志,所以一台机器重启前后其实是两个不同rs。

注意:-ROOT-表只有一个region,且永远不会分裂;

图2.2.1.1.1 -ROOT-表示例

2.2.1.2找到.META.表

通过-ROOT-表找到某个regionServer上的.META.表后,可以通过.META.表来找到rowkey相关的Region,我们来看看.META.表的结构:

表2.2.1.2.1.META.表结构

可以看到,.META.表结构和-ROOT-表结构完全一致,只是rowkey构成不同;因此通过rowkey可以找到管理region的RegionServer的地址;

图2.2.1.2.1.META.表示例

注意:由于一个HBase数据库中会存在很多表,也会存在很多region,因此.META表会非常大,而.META.表只是HBase中的一张普通表,因此本身也需要分裂成多个region,所以.META.表会存在与多个Regionserver上,这也是为什么需要设置-ROOT-表的原因。.META.表一般都全部加载在内存中;

当然 HBase 客户端会缓存这些寻址的数据,只有在数据失效或无相关数据的时候才会按照上面的流程定位到对应的 RegionServer。

从.META.表中得到管理region的Regionserver后,连接对应的RegionServer,发送读取Region的请求;

2.2.1.3找到对应的Region后的过程

向regionserver发送读取请求,之后的过程如下图:

2.2.1.3.1 找到Region后RegionServer读取扫描数据的过程

这里有三种情况:

①对于新写入的Cell数据,它可能会存在于MemStore中;

②对于已经Flush到HFile中的Cell数据,它会存在于某个或某些StoreFile(HFile)中;

③对于刚读取过的Cell数据,它可能存在于BlockCache中;

所以对于任意数据,Cel上数据可能存储在三个地方,在读取的时候需要扫瞄这三个地方,然后将结果合并即可(Merge Read),RegionServer中扫描的顺序依次是:BlockCache、MemStore、StoreFile(HFile)。

其中StoreFile的扫描先会使用Bloom Filter过滤那些不可能符合条件的HFile,然后读取HFile中的Trailer,将Data Block Index读入内存,这样,检索某个rowkey时,不需要扫描整个HFile,而只需从内存中找到rowkey所在的data block,通过一次磁盘io将整个 data block读取到内存中,再找到需要的rowkey。使用Block Index快速定位到数据后,将其加载到BlockCache中,然后从BlockCache中读取数据。

这里要注意,一个HStore可能存在多个StoreFile(HFile),此时需要扫瞄多个HFile,如果HFile过多,则会引起性能问题,因此需要对HFile进行Compation。

如果觉得有用,记得关注点赞哦,:)

hbase scan超时设置_深入浅出HBase系列(二)相关推荐

  1. hbase scan超时设置_如何在优化生产环境的hbase

    hbase 是hadoop生态圈的一员,在数据服务应用中具有举足轻重的地位,我们当然有必要掌握,hbase日常的大部分应用在数据查询服务中,因此查询的时候必然涉及到scan操作,因此在建表的时候就要对 ...

  2. hbase scan超时设置_hbase scan超时问题

    下面是异常信息: 2018-11-08 16:55:52,361 INFO [main] org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl ...

  3. hbase scan超时设置_HBase学习之路 (六)过滤器

    点击上方蓝字  关注我们 HBase学习之路 (六)过滤器 过滤器(Filter) 基础API中的查询操作在面对大量数据的时候是非常苍白的,这里Hbase提供了高级的查询方法:Filter.Filte ...

  4. hbase数据读取优化_从hbase读取数据优化策略和实验对照结果

    起因:工作须要.我须要每5分钟从hbase中.导出一部分数据,然后导入到ES中.可是在開始阶段编写的python脚本,我发现从hbase读取数据的速度较慢,耗费大量的时间.影响整个导数过程,恐怕无法在 ...

  5. python 线程超时设置_爬虫基础知识(一)多线程与threading模块

    点击上方"蓝字"关注我们,第一时间推送优质文章! 前言 "本期带来的文章是python中多线程与threading模块的主要内容.主要分为「并发与并行」,「进程与线程」, ...

  6. 三星E1200R语言设置_三星 S20 系列评测:依旧是 Android 阵营最高水平

    注意,我要开吹三星 Galaxy S20 系列了. 我不是一个星粉,对三星也从来没有什么信仰,三星吸引我的只有对全产业链控制带来的堆料能力,以及自从三星 Galaxy S6 突然丑小鸭变天鹅的设计进化 ...

  7. 大数据_MapperReduce_Hbase的优化和Hbase相关面试题_以及hbase的javaapi的一部分源码---Hbase工作笔记0029

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们进一步去看一下,这个hbase相关的一些优化情况. 首先我们去看这个内存优化. 可以看到, ...

  8. netty socket超时设置_彻底搞懂 netty 线程模型

    编者注:Netty是Java领域有名的开源网络库,特点是高性能和高扩展性,因此很多流行的框架都是基于它来构建的,比如我们熟知的Dubbo.Rocketmq.Hadoop等.本文就netty线程模型展开 ...

  9. java webservice超时设置_[CXF]Spring下设置CXF的WebService客户端超时时长

    评论 # re: [CXF]Spring下设置CXF的WebService客户端超时时长 2010-01-05 21:47 Emily32Av A kind of good information a ...

最新文章

  1. 粉丝们请注意!送款全新的AirPods Pro!
  2. GNU make manual 翻译(六十九)
  3. 【转】HashTable 和 HashMap的区别
  4. 当初怎么就入了VS的坑
  5. 机器人matlab仿真步骤,MATLAB机器人仿真程序.doc
  6. Redis 官方可视化工具,功能真强大
  7. Jenkins - Update information obtained: 不可用 ago;
  8. python 获取股票的交易数据
  9. surface pro 写php,surface pro7尺寸
  10. ASEMI代理ADI(亚德诺)AD5934YRSZ-REEL7车规级芯片
  11. 我的大学 --- 郭天祥【1】
  12. 木子-后端-Spring配置时间触发器的方法
  13. 王峻涛:大萧条中的机会
  14. cache 是什么意思 它包括的L1,L2,L3分别是什么东西
  15. 阿里云函数计算使用imagemagick处理oss图片
  16. 为什么下载那种小电影时,经常会卡在99%?
  17. 从销冠到失业,最后选择软件测试,回头看看这段路,我很幸运!
  18. arm-linux东东之nand
  19. using and configure emule (amule) on ubuntu
  20. 微信小程序canvas实现简易手写签名版(uni-app)

热门文章

  1. STM32 电机教程 6 - 步进电机转动控制
  2. 构建根文件系统之启动第1个程序init
  3. shell排序-c语言
  4. win10下如何设置开机自启动
  5. 【arduino】初测ESP32的DAC生成AV视频模拟信号项目:ESP32CompositeVideo
  6. 长沙校园招聘总结-做为技术面试官
  7. 【Flocking、PPO无人机群控制算法】基于Flocking和PPO深度强化学习的无人机群控制算法的MATLAB仿真
  8. 十六、字符驱动及应用
  9. zynq 文件系统中加载PL fpga.bit笔记
  10. 好好学python · 内置函数(range(),zip(),sorted(),map(),reduce(),filter())