HBase Scan过程解析

记录一次HBase的读取操作 问题 在清洗数据的过程中开发了这样一个功能,由于我们的数据传输上来的经纬度,缺少地址信息,所以,设计了一个先从hbase里读取经纬度对应的地址数据,如果没有查询到符合的数据,再去从高德地图进行经纬度反向查询,获取到数据后,缓存在HBase中。 潜在问题 高德地图有每日200万次调用的限制,如果突破了,数据就会有问题; 实现方式 from thrift.protocol import TBinaryProtocol from hbase import Hbase from hbase.ttypes impo 阅读详情

转载自:http://zlx19900228.iteye.com/blog/1178233

(1) 卖家导出订单部分: 
卖家导出订单部分的表结构设计: 
Rowkey: seller_id+ gmt_create+ parent_id+biz_order_id 
Family:s quality:s value: 93个字段的String串,并且做gzip压缩。 
Hbase中的参数设置: 
maxVersions:1  Blocksize:128*1024  CompressionType:lzo 
BloomFilterType: ROW 
业务逻辑:is_main=1,is_detail=0则biz_order_id=0 
卖家导出订单只会用到hbase的scan,所以先分析hbase的scan过程,首先设置Scan的参数,这里主要用到了(cacheing,startRow,endRow,Filter,column,maxVersions) 
cacheing是设置需要缓存的result的个数,startRow设置的是scan开始的rowKey,endRow是设置的结束的rowKey,filter过滤作用,column设置需要scan的column,具体的会结合后面分析源码介绍。设置好了之后,调用你需要scan的Htable,得到scanner,这里返回的是ClientScanner,它是一个If there are multiple regions in a table, this scanner will iterate through them all.是遍历table的scanner,与RegionScanner不同,RegionScanner是RegionScanner is an iterator through a bunch of rows in an HRegion. It is used to combine scanners from multiple Stores ,是遍历一个region中的一批rows,首先调用构造方法,传入scan,接下来调用initialize方法,通过nextScanner,因为是第一次调用,所以会获得ServerCallable,接下来调用ServerCallable的instantiateServer方法,从已经prewarm的connection缓存中取得HregionLocation以及HRegionInterface的proxy,这里的proxy就是调用的java的dynamicProxy,然后通过rpc进行调用server端的代码,这里可以参考HSF,HSF也是一个RPC框架,内部仍然是用dynamicProxy进行的调用,这里调用的其实是ScannerCallable,继承自ServerCallable,调用完成init方法之后,就会调用ScannerCallable的call方法,因为第一次调用,所以会执行 
if (scannerId != -1L && closed) { 
      close(); 
    } else if (scannerId == -1L && !closed) { 
      this.scannerId = openScanner(); 
} 
这句代码,然后调用服务端的openScanner,根据regionName,得到HRegion,再根据region以及scan获得一个InternalScanner,实现是RegionScanner,然后将这个InternalScanner加入到server端的scanners的map中,到此,openScanner方法调用完成,返回scannerId,这个scannerId就是server端的map的key,至此,就在服务端建立了一个scanner,供客户端通过传递scannerId,rpc调用,。接下来最后一步,就是设置当前的currentRegion为初始化时得到的HRegionInfo,记录当前scan的region信息,到目前为止,初始化已经完成,得到了scanner,接下来,就是对得到的scanner进行iter,遍历了,我们的ResultScanner的实现是ClientScanner,该类实现了iterator方法,仔细看代码会在hasNext方法中调用ClientScanner的next方法,next方法中,仍然又会调用getConnection().getRegionServerWithRetries(callable);方法,这里就又会调用ScannerCallable的call方法,因为在首次调用的时候,已经初始化了scannerId,所以这里会根据scannerId去hbase调用对应的InternerScanner,调用next方法,next方法会调用刚刚通过scannerId拿到的InternerScanner,然后调用next方法,核心的是调用nextInternal方法,nextInternal, nextInternal方法会先调用byte [] currentRow = peekRow();去拿出currentRow,这个过程是一个递归的过程,调用的是KeyValueHeap,看到这里,就不得不提一下RegionScanner的初始化方法了,首先,Hregion信息已经被加载了,加载了之后,就会调用你传入的scan的cf,去从已经加载完毕的Hregion中,根据CF去定位Store,定位到了之后,调用scanners.add(store.getScanner(scan, entry.getValue()));,这里会加入StoreScanner,然后构造KeyValueHeap,这里有一个递归的过程,首先这个peek操作是操作的一个递归操作,Scanner链由上到下依次是StoreScanner-> StoreFileScanner -> MemStoreScanner,所以peek操作会由上到下的去拿row信息,Peek操作是不会改变iterator的,所以拿到currentRow之后,调用之前我们定义的一系列filter完成之后,就会调用this.storeHeap.next(results, limit - results.size());这里的limit就是我们实现设置的cached,这里会不断的调用StoreScanner的next方法,直到从StoreScanner的heap中递归的调用StoreFile拿到row. 
RegionScanner初始化过程: 
从scan中得到传入的各项参数,filter等等,接下来重要的就是根据scan传入的cf,定位到store,然后从Hregion中获得已经预先初始化好了的stores map,根据cf name作为key,拿到store信息,然后调用store的getScanner,调用StoreScanner的构造函数,根据传入的Store,Scan,以及columns,进行构造,其中会构造一个ScanQueryMatcher,接下来会调用getScanners,getScanners方法会根据scan设置的是否memOnly or filesOnly,来初始化下一级的scanner,如果没有刻意设置是否只扫描MemStore或者StoreFile,那么首先会拿到当前store中存放的StoreFiles的信息,以及cacheBlocks,会为这个store中存放的每个storeFile创建StoreFileScanner,创建方式是首先获得StoreFile的信息,接下来根据这个storeFile打开一个reader,StoreFile.Reader,接下来调用reader的getStoreFileScanner,这个构造方法中即创建了StoreFileScanner,并且将HfileScanner绑定在这个StoreFileScanner上,接下来将调用shouldSeek方法,判断是否将通过reader得到的scanner加入StoreFileScanner的scanners集合中,storeFileScanner初始化完成之后,会调用this.store.memstore.shouldSeek(scan)),看memStore中是否包含需要scan的row,如果包含,那么就在scanners list中加入MemStoreScanner,然后将这些scanners返回,然后遍历scanners,对每个scanner调用seek方法,根据matcher设置的StartKey,去seekAtOrAfter,将不匹配的scanner close掉,这个方法的具体实现,还要仔细//TODO接下来将所有匹配的scanner合并起来,构造KeyValueHeap。 

初始化好了之后,遍拿到初始化好的ClientScanner,开始遍历,这里是实现了iterator()方法,hasNext,会调用ClientScanner的next方法,如果cache.size()==0,调用getConnection().getRegionServerWithRetries(callable);得到values,这个方法,最终会调用ScannerCallable的call方法,从而最终rpc调用next方法,这个方法在server端,会根据传入的scannerId,拿到scanner,这些都是已经在openScanner初始化好了的,最终会调用nextInternal方法,该方法中,先从heap中拿出当前的currentRow,这是一个递归的过程,即openScanner初始化好的scanners,最终会落在StoreFileScanner上,拿出之后,开始调用filter进行过滤,过滤通过,执行下一步,接下来就是一个不断调用peek以及next的过程,归根到底都是顺序调用storeFileScanner,memtoreScanner的过程,直到达到设置的缓存上限,然后便会返回结果,经过过滤器过滤,以及检验是否是stopRow。 
StoreFile遍历完成,MemStore遍历完成,返回,然后根据上一个region的endKey,作为下一次的startKey,然后再去定位Hregion,HregionLocation,因为是tree结构,所以定位是查找不小于startKey的最小值,查找到之后,又继续开始遍历。 

HBase的scan源码分析客户端部分之整体流程(一) scan的调用代码示例如下: // 创建HBase配置config Configuration config = HBaseConfiguration.create(); config.set("hbase.zookeeper.quorum", "192.168.1.226");// zookeeper部署的服务器IP config.set("hbas 阅读详情

相关推荐

python DEA: 基于非径向距离NDDF的Malmquist-Luenberger 指数及其分解

点赞发Nature 关注中Science Malmquist-Lenberger指数(ML指数)是距离函数与DEA计算中常用的指数,ML指数可以进一步分解为技术进步technological progress和效率改善effeciency change. 技术进步常被当做增长模型中的全要素生产率,用到许多计量经济研究中,探讨影响技术进步的环境变量。这里我分享一个考虑非期望产出下的NDDF方法计算ML指数。 该ML指数为global ML(区别于sequential ML) import numpy as

Cmmmmm丶的博客 5295

HBase分页查询---指定PageNumber和PageSize

问题:通过指定的页码和每页记录的条数来进行分页查询。 分析问题: 要实现分页查询,因为查询的是一个范围,所以使用Scan的查询方式。然后还使用PageFilter,这样能够获取指定数量的记录。 那么问题来了,要使用scan的方式进行区间查询那么startRow是什么??? 所以现在将问题转换成了求每一页的startRow !!! 当我们使用scan查询又没有指定StartRow的时候,结...

_a_0_ 1万+

OpenVox 8FXO板卡驱动安装记录

OpenVox A800P和A1200P的板卡驱动安装及问题解决方法

clliu的专栏 2463

HBase实现分页倒序查询

HBase的Scan查询功能(setStartRow, setStopRow),通过这两个方法,可以实现小范围的扫描,扫描的规则是[startRowKey,endRowKey),扫描的结果是起始行包括在内,终止行不包括在内。但rowkey的存储顺序是按照rowkey的ASCAII值排序,正常情况下是将ASCAII码值小的先查出来。要实现倒序查询,需要将startRow设置为终止行,endRow设置...

单车人的博客 6084

Vienna整流器SVPWM调制:7扇区划分与中点电位平衡的MATLAB/Simulink实现解析

本文深入解析Vienna整流器的SVPWM调制技术,重点介绍7扇区划分与中点电位平衡的MATLAB/Simulink实现方法。通过详细的算法推导和仿真模型构建,帮助工程师掌握整流器闭环控制策略,优化功率转换效率。内容涵盖扇区判断逻辑、矢量作用时间计算及中点电位平衡的PID调节等核心技术要点。

weixin_33937499的博客 385

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 149

【HBase高级】7. HBase调优、常见问题处理

Standalone最普遍的单磁盘储存方式。Cluster集群储存是通过将数据分布到集群中各节点的存储方式,提供单一的使用接口与界面,使用户可以方便地对所有数据进行统一使用与管理。Hot swap用户可以再不关闭系统,不切断电源的情况下取出和更换硬盘,提高系统的恢复能力、拓展性和灵活性。Raid0Raid0是所有raid中存储性能最强的阵列形式。

优快云GuoYuying的博客 528

Win10系统下海思SS928开发板烧写工具ToolPlatform-1.0.11安装避坑指南

本文详细介绍了在Windows 10系统下安装和配置海思SS928开发板烧写工具ToolPlatform-1.0.11的完整流程与避坑指南。核心解决了JVM内存配置导致的界面卡顿、闪退问题,并提供了驱动安装、硬件连接、镜像烧写的实战步骤,帮助嵌入式开发新手快速搭建稳定的烧写环境。

kite3的博客 453

彷徨 | 20 种 HBase 过滤器介绍

使用TScan过滤器进行过滤,20种过滤器进行介绍 英文介绍: TScan 使用filter的用法 1 操作符合: The client should use the symbols (<, ⇐, =, !=, >, >=) to express compare operators 2修饰值符号:BinaryComparator - binary;BinaryPrefix...

彷徨的博客 1129

DDR内存设计必看:DFI接口协议详解与实战避坑指南(附时序图解析)

本文深入解析了DDR内存设计中连接内存控制器与物理层的DFI接口协议,聚焦于DDR4/DDR5设计的实际痛点。文章详细阐述了协议版本兼容性、时钟架构(匹配频率与频率比系统)、PCB信号完整性设计以及上电初始化与调试等关键环节,为硬件工程师提供了一套从理论到实战的完整避坑指南,并附有时序图解析以助理解。

weixin_29256771的博客 329

Visual Studio Code ADT Extension 能不能连接 ECC,答案是可以,但真正的门槛在 ABAP 后端版本

Visual Studio Code 版 ABAP Development Tools(ADT)支持连接传统 SAP ECC 系统,关键不在于系统名称,而在于底层 SAP NetWeaver AS ABAP 版本是否达到最低要求(7.31 SP04 及以上)。只要系统已支持 Eclipse ADT,即可无缝使用 VS Code ADT,无需升级后端。SAP 通过复用原有 ADT 技术栈,将兼容性逻辑置于客户端,实现对老系统的持续支持。尽管初期侧重 ABAP Cloud 模型,但 1.1 及后续版本已全面覆盖

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 46

【Hbase】数据读取流程解析

转载至 http://hbasefly.com/2016/12/21/hbase-getorscan/ 请多多支持原作者!! HBase原理-数据读取流程解析 和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片、多块缓存甚至多个数据存储文件;其二是因为HBase中更新操作以...

Together 5629

爬虫:一文掌握网站加密和混淆以及浏览器调试的技巧

面对加密和混淆技术的网站,传统的爬虫方法可能难以奏效。通过结合浏览器调试工具(如Puppeteer、Playwright)、代理工具(如Burp Suite、Fiddler)以及动态和静态分析技巧,可以深入理解网站的运行机制,绕过加密和混淆,实现有效的数据抓取。同时,务必注意合法合规,尊重目标网站的规则和用户的隐私,确保爬虫行为的正当性和可持续性。

数据知道的博客 9887

HBase原理-数据读取流程解析

和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片、多块缓存甚至多个数据存储文件;其二是因为HBase中更新操作以及删除操作实现都很简单,更新操作并没有更新原有数据,而是使用时间戳属性实现了多版本。删除操作也并没有真正删除原有数据,只是插入了一条打上”deleted”标签的...

u010766519的博客 255

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

go-hbase的Scan模型源码分析

git地址在这里: https://github.com/Lazyshot/go-hbase 这是一个使用go操作hbase的行为。 分析scan行为 如何使用scan看下面这个例子,伪代码如下: func scan(phone string, start time.Time, end time.Time) ([]Loc, error) { ... client := hba...

weixin_34026484的博客 220

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入理解hbase(一)hbase中java客户端详解

hbase中java客户端详解

qq_44665283的博客 2333

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HBase的get过程(一)

 0.90.X的get和scan操作原理上是比较一致的,get操作都变为scan操作。不过在分析之前我们还是从get说起 话不多说首先看看get这个接口,hbase客户端对于get有以下几种: public Get(byte [] row) public Get(byte [] row, RowLock rowLock)  其中rowlock主要是用来保证行的事务性,即每个get是以一个r...

punishzhou的专栏 339

日志写入hbase_深入HBase读写

在了解HBase架构的基础上,我们需要进一步学习HBase的读写过程,一方面是了解各个组件在整个读写过程中充当的角色,另一方面只有了解HBase的真实请求过程,才能为后续的正确使用打下初步基础,毕竟,除了会使用api,你还得知道怎么能写得更快,怎么查得更快。1.首次读写的基本过程在上一篇 深入HBase架构(建议收藏)中已经做了介绍。这里再重申一下。这里要解决的主要问题是,client如何知道去那...

weixin_39801158的博客 208

HBase学习之数据读取流程详解

本文和大家分享的主要是HBase数据读取流程相关知识,希望对大家学习HBase有所帮助,一起来看看吧。   和写流程相比,HBase读数据是一个更加复杂的操作流程,这主要基于两个方面的原因:   其一是因为整个HBase存储引擎基于LSM-Like树实现,因此一次范围查询可能会涉及多个分片、多块缓存甚至多个数据存储文件;   其二是因为HBase中更新操作以及删除操作实现都很简单

qq_32506555的博客 405

HBase Timeout-OutOfOrderScannerNextException-was there a rpc timeout

     0 工作中遇到问题如下:   Casuse by: org.apche.hadoop.hbase.exceptions.OutofOrderScannerNextException: Excepted nextCallSeq: 1 but the nextcallseq got from client:0: request=scanner_id: 431 number_of_r...

后知后觉的it路 1716

Hbase读写流程及架构

有一个特殊的HBase目录表,叫做META table,保存了集群中各个region的位置。zookeeper中保存了这个meta table 的位置信息。当我们第一次访问HBase集群时,会做以下操作:1)客户端从zk中获取保存meta table的位置信息,知道meta table保存在了哪个region server,并在客户端缓存这个位置信息;2)client会查询这个保存meta table的特定的region server,查询meta table信息,在table中获取自己想要访问的row k

weixin_46580067的博客 791

hbase读数据之client

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34015566的博客 121
上一篇: 回调函数
下一篇: 论文中的图目录与表目录
lxf310
博客等级 码龄17年 26粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值