作者的思考,建议结合《HBase权威指南》第8章一起看。。。
1.HBase是如何保证快速读取 以支持实时数据开发的(相比Hive和hadoop的批处理)?
HBase在HDFS上磁盘数据结构为LSM(可以看成B树),按RowKey有序,复杂度为log(n)(当然与树节点元素数量有关):可以理解为对RowKey进行查询比传统数据库还快(如果没有对索引字段where查询)。
关联知识:
数据库原理索引:数据磁盘寻道、B树索引结构
HBase的Region:HBase的一张表可以分成多个Region,每个Region负责一段顺序RowKey(如:row1-row100在region1上,row101-row200在region2上。。。),这样无论数据如何横向扩展,每个region管理的数据都只有那么多,不会因为树深度的增加而增加访问时间。
2.HBase是如何保证数据安全性的?(当然是日志系统)
数据写入内存(memstore)前,先写入日志(HLog),当机器宕机也可以根据日志进行数据恢复。
关联知识:
HLog(一个服务器一个日志):写入的数据顺序存储在HLog文件上(已经在HDFS上保持了)。HRegionServer上可能有很多表,很多region,宕机了日志是如何被利用的呢?日志上还没有存到region磁盘上的数据分发到各自的region上进行恢复(都给到位了,直接存就行了)。
memstore:所有memstore上的数据加起来和HLog上没有保存到region磁盘上的数据相等(相当于一摸一样的数据)。如果memstore上的数据保存到region磁盘上去了,HLog上的数据不就没用了么?数据已经持久化了,当然没用了,就可以根据保存到磁盘上的数据的最大时间戳来判断,日志上小于这个时间戳的数据都已经保存了。
这里引发了我的疑问:1.一个memstore达到flush数据刷写要求了,难道一个HRegionServer上所有的memstore都要同时刷写么,不然HLog还选出这个memstore上的数据标记么?
关于疑问的推论:是否是每个region中的每个store都记录一个最大时间戳,HLog中记录的关于一个region中的一个store的数据,如果时间戳小于记录的最大时间戳,那说明数据已经被处理了,数据恢复时就可以过滤掉。
3.HBase是如何保证数据快速写入的?(直接内存当然很快)
顺序写入到HLog上后直接写入内存,逻辑上数据就已经成功写入了。