本文是HBase的欧洲传道者LARS GEORAGE的HBase vs. BigTable Comparison(需要翻墙)一文的节选翻译版。
论文中提到的特性
首先,向大家介绍在2006年OSDI大会上发表BigTable论文,也就是《Bigtable: A Distributed Storage System for Structured Data》里面所提到的一些特性:
特性 |
BigTable |
HBase |
注释 |
原子的读写和修改 | 支持,基于Row的 | 支持,基于Row的 | 由于BigTable本身不是关系型数据库,所以它没有事务功能,但是有一个非常相近的机制,就是对一个Row的原子操作。 |
按照字典顺序对Row排序 | 支持 | 支持 |
和传统的关系型数据库的不同的是,其只支持按照字典顺序(lexicographic order)对Row排序。 |
支持Block格式存储 | 支持 | 支持 | 每个存储文件,都由一些小的block组成,这样能快速从大的存储文件中读取数据,默认Block的大小为64K。 |
Block压缩 | 支持, 基于 column family | 支持, 基于 column family | BigTable使用BMDiff和Zippy这两种压缩算法。 |
数据库schema和值的格式 | 任意 | 任意 | 可以是任意字节数组。 |
访问控制 | 支持 | 不支持 | BigTable在column family这个层次实现了访问控制。 |
Cell版本 | 支持 | 支持 | 主要通过Timestamp的形式来实现对Cell版本的控制 |
批处理写 | 支持 | 支持 | 两个系统都支持批处理写。 |
脚本工具 | 支持 | 不支持 | BigTable有Sawzall这个工具来帮助用户快速处理BigTable中的数据。 |
MapReduce | 支持 | 支持 | BigTable和HBase都提供完善的类库和工具来支持MapReduce。 |
存储系统 | GFS | HDFS, S3, S3N, EBS | BigTable主要运行于Google的GFS上, 而且HBase能支持多种存储系统,只要有相关的驱动或者代理。 |
文件格式 | SSTable | HFile | 都是Immutable的,也就是写好之后,很少更改的。 |
内存映射 | Yes | No | BigTable能将存储文件直接映射到内存中。 |
锁服务 | Chubby | ZooKeeper | 虽然两者功能类似,但在实现机制上稍有不同,原因是ZooKeeper主要通过协调任务来实现锁服务的。 |
单一Master | 是 | 不是 | HBase最近添加了对多Master的支持,而且通过ZooKeeper来对那个”standby”的节点进行监控和管理。 |
Tablet的个数 | 10-1000 | 10-1000 | 无论是BigTable,还是HBase,其每个Tablet节点都支持1000个左右的Tablet。 |
Bloom Filter | 支持 | 支持 | 用于让系统快速确定这个Region是否存有所需的值。 |
Write Ahead Log | 支持 | 支持 | 每个Tablet节点会其所承载的所有的Tablet准备一个Write Ahead Log来转载修改信息。 |
表1. 论文中提到的特性
新特性
在2009的LADIS大会上,Google院士jeff dean有一个非常精彩的Talk,称为“Design Lessons and Advice from Building Large Scale Distributed Systems”,在这次Talk中他提到了很多BigTable的新特性:
特性 |
BigTable |
HBase |
注释 |
Client隔离 | 支持 | 不支持 | BigTable内部能服务多个不同的客户,而且能在它们之间保持数据隔离。 |
Coprocessors | 支持 | 不支持 | BigTable能够在Tablet节点上加载代码,这样假设代码依赖的Tablet移动或者被切割,那么代码也会随着那个Tablet而移动。 |
崩溃(Corruption)的安全性 | 支持 | 不支持 | BigTable使用CRC校验码来确认数据是不是已经被安全写入。 |
复制 | 支持 | 不支持 | HBase现在也在实现这个特性。 |
表2. 在LADIS 2009大会上的Talk中提到的特性