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中有内存缓存机制,如果数据在内存中,速度会更跨
标签:列簇,存储,百亿,读写,regionserver,HBase,数据,HFile
From: https://www.cnblogs.com/peculiar/p/18185907