Hbase初探,
淘宝的搜索团队的HBase笔记,图文并茂;原来一淘的存储系统就是基于HBase的。
http://www.searchtb.com/2011/01/understanding-hbase.html
数据平台团队的HBase介绍,也很详细
http://www.tbdata.org/archives/1509
现在几乎大部分的互联网公司都在用hadoop系列啊,很值得研究
HBase是基于Bigtable论文的面向列的分布式存储系统,其存储设计是基于Memtable/SSTable的。整个存储分为两部分,一部分为内存中的MemStore(Memtable),另外一部分为磁盘(这里是HDFS)上的HFile(SSTable)。
HFile是HBase实际的文件存储格式,它是基于的文件格式,替换了早期的MapFile,改进了性能。
然后HBase会进行控制,当MemStore写满了以后进行刷磁盘操作。
而HLog是HBase的日志格式实现,主要是在写入的时候进行write-ahead-log,主要为recovery而做。
http://forchenyun.iteye.com/blog/828549
http://hi.baidu.com/wewe_39/blog/item/64453f175f68044bf2de3269.html
很不错的hbase ppt,详细描述了hbase数据读写的核心过程
http://blog.bluedavy.com/?p=233
http://nlslzf.iteye.com/blog/799258
http://hbase.iteye.com/blog/1002252
以下就是hbase架构的核心,LSM数据结构
本质上,在MapReduce的工作方式中,数据流式地读出和写入硬盘,MapReduce是以硬盘的传输速率不断地对这些数据进行排序和合并。 与之相比,访问关系数据库中的数据,其速率则是硬盘的寻道速率(寻道指移动磁头到盘面上的指定位置读取或写入数据的过程)。为什么要强调这一点?请看看寻道时间和磁盘传输率的发展曲线。寻道时间每年大约提高5%,而数据传输率每年大约提高20%。寻道时间的进步比数据传输率慢——因此采用由数据传输率决定性能的模型是有利的。MapReduce正是如此。
源码学习,hbase使用了跳跃列表来存储keyvalue,org.apache.hadoop.hbase.regionserver.KeyValueSkipListSet底层使用了ConcurrentSkipListMap实现,是一个有序的列表(MemStore位于内存中,也就是LSM中对应的C0),并且有log(n)的操作效率。这里的跳跃列表就是LSM中的有序树。
在org.apache.hadoop.hbase.regionserver.Store.internalFlushCache(SortedSet<KeyValue>, long, TimeRangeTracker)中把内存中的有序集合迭代取出keyvalue刷到磁盘中(StoreFile位于磁盘中,对应LSM中的C1,C2,......Cn,都是有序集合),也就形成了HBase存储的行天然有序的特点。在org.apache.hadoop.hbase.regionserver.Store.compact(List<StoreFile>, boolean, long)进行Cn的合并,小文件合成大文件,提高读数据吞吐量。
参考LSM算法http://hi.baidu.com/hill007299/blog/item/d32a862bc3ac1e84033bf6a5.html