HBase读写原理剖析以及客户端优化策略

HBase架构图

在这里插入图片描述

HBase写数据流程分析:

在这里插入图片描述
1、hbase客户端若想将数据写进habse集群的RegionServer上,首先需要获取要写入数据的目标表所在的regionServer服务信息,而服务信息是存储在系统元数据meta表中,即首先需要获取meta表所在位置,而meta表节点位置信息存储在zookeeper中,此时hbase的客户端的对象会首先向zk集群发起请求,请求获取meta表所在位置信息。
2、zk集群收到请求后,返回系统meta表所在的regionServer信息。
3、当客户收接收到了从zk集群返回的meta表的位置信息后,会去该节点上获取meta表内容,meta表内容包括表的存储位置,同时根据目标写入数据的rowkey来查找需要将数据写到该表的哪个region上,
4、此时将rowkey所在的regionServer信息返回给客户端。同时会将meta表的内容信息加入至缓存中,方便下次读取。
5、由客户端发出数据写入请求到目标region。
6、首先会将数据先写入到目标region的 WAL(预写入日志),也叫HLog。
7、后将数据写入到region的MemoryStore(内容)中。
8、内存写入完成后,由region返回ack应答给hbase客户端,默认写数据完成。

HBase读取数据流程分析:

在这里插入图片描述
1、读取过程前期还是和写入数据一样,hbase的client先访问zookeeper,获取hbase:meta表位于哪个regionServer。
2、获取meta表所在位置后,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个RegionServer中的哪个region里。并将该table的region信息以及meta表的位置信息缓存在客户端的meta cache中,方便下次访问。
3、与目标 RegionServer进行通讯,发送get请求。
4、分别在Block Cache(读缓存),MemStore 和 StoreFile(Hfile)中查询目标数据 ,并将查询到的数据进行Merge合并操作,此时所有数据是指同一条数据不同版本(timestamp时间戳不同)的数据,取其中时间最大,即最近的一条数据返回。
5、将从文件中查询到的数据块(Block,Hfile中数据)缓存至block cache中。方便下次查询。
6、将数据合并后的结果返回给客户端,读取流程结束。

总结:

由于在读取数据过程中,涉及到数据会进行内存与磁盘中的hfile数据合并的操作,所以读取数据必不可免的会去读取磁盘,而后将磁盘数据和内存数据合并返回结果,而对数据写入操作而言,只需要先写入预写日志,再将数据写入内存即可。远没有读取流程那么繁琐,所以一般而言,habse读取数据会慢于写入操作。

HBase客户端优化

1、scan方式的缓存大小设置是否合理?
先解释下什么是scan缓存,通常情况下一次scan会返回大量数据,因此客户端发起一次scan请求,实际上并不会一次将所有数据加载至本地,而是分成多次RPC请求进行加载,这样设计一方面因为大量数据请求可能造成网络带宽严重消耗,进而影响RegionServer进程的服务,另一方面也有可能因为数据量太大导致本地客户端发生OOM,在这样的设计体系下用户会首先加载一部分数据到本地缓存,然后遍历处理,再加载一部分数据到本地,如此往复,直到所有数据加载完成,数据加载的批量大小(Scan缓存)默认为100条数据。对于数据请求量较大的业务场景而言,若想提升scan性能,在本地内存足够满足的情况下,可以考虑将scan缓存设置增大。比如500-1000,可以减少RPC通信次数,降低scan请求的总体延迟。
2、离线批量读取请求是否设置禁止缓存?
scan全表扫描过程中,一方面数据量很大,另一方面请求只会执行一次,scan.setCacheBlocks默认设置为true,就会从hdfs加载出来的数据放到缓存,大量数据进入缓存必将导致其他热点数据被迫挤出,会出现数据热点问题,所以一般scan场景下设置禁用缓存,scan.setCacheBlocks设置为false。
3、get、put请求是否使用批量处理?
使用批量get、put的API(getList,putList)接口,可以减少客户端到RegionServer之间的RPC通信的连接数,可提高读写性能。值得一提的是,批量get、put请求需要控制大小,过大会出现RegionServer超负载,getList大小建议不超过200,putList大小建议不超过2000。
4、若写入hbase表数据量太大,考虑使用bulkload特性。
依据HBase存储数据按照HFile格式存储在HDFS的原理,使用bulkload特性直接生成HFile格式的数据文件,然后在通过hbase自身的脚本指令将生成的HFile数据文件移动到相应的Region上去。
hbase org.apache.hadoop.hbase.mapreduce.LoadIncrementalHFiles 【hfile文件地址】 【目标表】
5、对于给定的批量数据在做put和get操作前,先对rowkey进行排序操作对批量操作按rowkey进行字节排序后,可以最大程度保证同一批get/put请求只对同一个region进行读写操作,从而大幅度提高性能。
6、使用mapreduce统计hbase全表数据总量时,指定一个绝对不会为空的字段,可提升性能。
hbase是典型的列式存储数据库,意味着同一列族的数据存储在一起,不同的列族数据分开存储在不同的目录下,如果一个表有多个列族,全表检索必定会同时加载多个列族,而在统计全表数据量的业务场景下,本不必全部加载所有列族的数据,只需要显示指定一个非空的列即可。
hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘tableName’ ‘info:id’

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值