HBase读写流程以及为什么面对百亿数据依旧可以很快

HBase是什么:

HBase是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统,用于存储海量的结构化、非结构化、半结构化的数据(底层存储的只有字节数组类型的数据)

HBase写流程

客户端向zookeeper建立连接并发送请求获取meta表的元数据的位置信息,和被哪个regionserver所管理,连接这个meta表的regionserver(get方式只返回一个regionserver,scan方式返回所有的regionserver),然后读取regionserver上的数据

HBase读流程

客户端向zookeeper建立连接并发送请求获取meta表的元数据的位置信息,和被哪个regionserver所管理

连接这个meta表的regionserver(get方式只返回一个regionserver,scan方式返回所有的regionserver),然后开始写操作

首先将数据写入到HLog(WAL)中,然后将数据写入到对应store中的memstore中

随着客户端写入的数据越来越多,memstore中的数据会越来越多,当内存中的数据达到128M或者时间达到1h的时候会放入blockcache中,然后生成新的memstore继续接收用户过来的数据

当blockcache的大小达到阈值(85%)的时候会触发flush机制,将数据刷新到HDFS中形成HFile小文件

随着刷新的次数变多,HDFS上的HFile文件会越来越多,当HFile文件的数量达到三个及以上的时候会触发合并机制,将所有小的HFile合并成一个大的HFile

当合并的次数越来越多,合并的文件也会越来越大,达到一定阈值的时候(2.0之后为10G),会触发分裂机制,会将大的HFile文件一分为二,同时管理整个HFile的region也会被一分为二

所以会形成两个新的region和两个新的HFile文件,每个storefile和每个HFile相对应,合并之前的文件会慢慢被删除

面对百亿数据,HBase为什么查询速度依然非常快(面试题)

查询过程:

举个例子,当有一个表的数据有100亿业务数据,全在HBase集群上,这些数据大小为10T,假设被切分为5000个region,那么每个region大小就是2G,

由于HBase存储数据是按照列簇进行存储的,假设一条记录有400个字段,每100个字段为一个列簇,这四个列簇是分开存储的,每个列簇的大小就是500M,

如果要查询的数据在其中一个列簇上,一个列簇包含一个或者多个HFile,这500M的数据是排序好了的,查询的时候会使用二分查找,这样需要查找的大小又减半了,只要250M

每个HFile文件中,都是以键值对方式进行存储的,只要遍历键key的位置和判断条件即可,而key的长度有限,假设key/value比例是1:24,250M的数据只需要遍历10M左右的数据

按照硬盘的类型,速度也不同,如果扫描的时候加入Boolean过滤器,能更快定位到数据,HBase中有内存缓存机制,如果数据在内存中,速度会更跨
posted @ 2024-05-11 10:14  peculiar-  阅读(1)  评论(0编辑  收藏  举报