两周没有写东西了,因为不知道传递什么东西好,今天才知道这里大部分人对大数据基础组件都是很了解,所以这周开始大白话基础组件。
大话hbase:
功能1:基于某一条索引快速定位该条数据。
其他功能:其他功能都是基于功能1之上。为了功能而功能。比如统计所有的条数counter。比如查询某一段时间断范围的值等等。都是基于上面的功能之上做的增强。
我们谈谈设计:定位也就是查找。怎么才能快速定位。
1、排序和查找
功能1简化一下就是快速查找。如果让你实现一个快速查找你会怎么办。
1)排序
2)二分查找
所有hbase
1) 排序
2)查找(hbase不是使用二分查找)
问题1)怎么实现排序
->>> 不管怎么样,不是算法中的冒泡排序和交换排序。
->>> 采用跳表(B+数)来实现,每次写入的数据自动插入内存,形成有序。即写入即有序
问题2)为什么不用二分查找
-->>>> 二分查找的前提是需要知道中点位置。只适合数组。数据库的查找一般采用B+数:hbase也是,如图。如果数据在25-50之间就可以将第二块读入内存中。然后遍历。(hbase中每个区间64K)
解决插入查找后,你可以设计个简单的kv内存数据库了。数据不可能一直在内存中,必然会写到文件系统中。
2、时间戳
为什么只是内存数据库? 如果数据在文件系统中,你怎么实现更新,怎么插入,怎么删除。
》》》 读入内存,修改,写回文件系统???? 不要天真了, 磁盘IO吃不消的,
文件系统最要命的是只支持尾加,不支持修改和随机插入,也不支持随机删除。也不可能每次都将数据从文件系统中读入内存。然后执行动作后写回文件系统。
主要解决一下几个问题
1)查找
2)更新
3)删除
为了解决这个问题,引入性能定义。
memstore:内存中存储数据
Storefile:文件系统中的文件,命名为hfile。
时间戳:每条数据写入时间。
写入流程:
1、数据首先写入内存memstore,形成有序。
2、达到一定大小后(128M)持久化到磁盘。该过程叫做flush流程。
3、每条数据都有时间戳。
更新:
按照写入流程,写入一条数据。
删除流程
按写入流程,写入一条数据,并标记为delete
查找:
每个hfile构建一个scanner。一个内存构建一个scannner。内存scanner和文件scanner没有任何区别。
分别从每个scanner拿到你要查找的数据。然后汇总。按最新时间戳返回。
如果最新时间戳数据有delete标记。表示已经删除。删除功能实现
每次都返回最新时间戳的数据,更新功能实现
恭喜你能完成基于文件系统的kv数据了。
3、WAL
上面的系统还没有可靠性,先写入内存部分数据,存在数据丢失风险。因此需要引入WAL。即先写日志系统。也就是写入内存的同时先写入文件系统里。
问题1)都已经写入到文件系统了,还写内存是做啥事?
如果不懂欢迎给我留言。
解决后丢数据风险后,一台单机的hbase你可以实现了。
4、region
上面都是基于单机的实现。怎么实现集群。首先需要将数据分块。
分块要求
-> 块之间没有重叠
-> 能够通过key快速找到所在块。
问题1)怎么分块
1) hash redis采用的方法
2)按顺序分段。 hbase采用的方法。
hash对于库容有个严重缺点。所以hbase采用顺序分段。
hbase的数据采用字典排序。所以只需要将前面字段进行切分即可。
如数据1-99 ,如果划分3个区间,那么可以是1-3,3-7,7-99.
问题2)数据40落在那个区间。
region:即区间,也就是表的某一段数据。
5、regionserver
有了region之后,就必然需要机器管理这些region,命名为RegionServer
6、HMaster
RegionServer也需要被管理。其管理者就是HMaster。HMaster存在单点问题,所以需要主备hmaster。
7、集群的几个问题
如果自己构建系统,需要完成
1)hmaster主备之间的选主。
2)hmaster接受RegionServer的注册,心跳。当RegionServer失败之后,让其他RegionServer接管其上Region等。
如果以上都完成,,是不是一个Hbase就ok了呢?其实不然。
回到最开始的问题,hbase是提供查找的工具。请问现在怎么查找?????? 你会发现无从下手。
8、meta表,zookeeper。
首先你需要知道数据在哪台机器,同时你需要自动数据在哪个Region。然后才能有该Region接管你的请求。返回结果给你。
因此引入了系统表meta
meta表存储的是Region的位置信息。
meta表的位置记录在zk里面。
所以查询流程问题
1)访问zk,找到meta表所在的机器
2)更加具体table和请求,从meta表里找到对应的region,和RegionServer信息
3)和RegionServer请求,有该RegionServer上的region进行查询。
4)查询时分别从memstore和hfile找到对应的数据,然后返回最新结果。
通过简单的介绍,你基本已经了解的hbase的大致过程。细节上无法在短时间介绍清除。需要自行研究。
可以参考我早期的博客。那时候刚研究内核,比较水。
https://blog.csdn.net/chenfenggang/article/category/6242829