赞
踩
最近硬着头皮读完了Google的三大论文,现在简单来聊一下自己关于BigTable的了解。
Bigtable是一个分布式的结构化数据存储系统,它被设计用来处理海量数据:通常是分布在数千台普通服 务器上的PB级的数据。Google的很多项目使用Bigtable存储数据,包括Web索引、Google Earth、 Google Finance。这些应用对Bigtable提出的要求差异非常大,无论是在数据量上(从URL到网页到卫 星图像)还是在响应速度上(从后端的批量处理到实时数据服务)。尽管应用需求差异很大,但是,针对 Google的这些产品,Bigtable还是成功的提供了一个灵活的、高性能的解决方案。
在很多方面,Bigtable很像一个数据库:它实现了很多数据库的策略。并行数据库和内存数据库已经实现了可扩展和高性能,但是Bigtable与这些系统相比提供了不同的接口。Bigtable不支持全关系型的数据模型,BigTable为客户端提供了一种简单的数据模型,客户端可以动态地控制数据的布局和格式,并且利用底层数据存储的局部性特征。Bigtable将数据统统看成无意义的字节串,客户端需要将结构化和非结构化数据串行化再存入Bigtable。
论文中对BigTable是这样描述的:Bigtable是一个稀疏的、分布式的、持久化存储的多维度排序Map 。接下来对其关键字进行解释:
这个东东想必大家都会了解,无非就是一个key-value对,Bigtable的键有三维,分别是行键(row key)、列键(column key)和时间戳(timestamp),行键和列键都是字节串,时间戳是64位整型;而值是一个字节串。可以用 (row:string, column:string, time:int64)→string 来表示一条键值对记录。
Persistence(持久性)只是表示当你的程序结束或数据入口关闭后,你保存在map中的数据会被持久化,这个和其他的持久化存储方式没区别。
BigTable构建在分布式文件系统上,以便底层文件存储可以在独立机器阵列之间传播。BigTable可以运行在Google File System上。数据以类似的方式在多个参与节点中复制,以便数据在基于独立冗余磁盘阵列的系统中的光盘之间进行条带化。
与大多数Map实现不同,在BigTable中,键值对以严格的字母顺序保存。 也就是说,键“aaaaa”的存储行应该在键“aaaab”的旁边,并且距离具有键“zzzzz”的存储行非常远。回到我们的map示例,排序后的版本如下:
- {
- "1" : "x",
- "aaaaa" : "y",
- "aaaab" : "world",
- "xyz" : "hello",
- "zzzzz" : "woot"
- }
因为这些系统往往是特别庞大的,并且数据是分布式存储,所以这种排序功能其实非常重要。具有类似键的行的空间优势确保了当一个操作必须扫描表格时,查询最感兴趣的内容将彼此靠近。需要注意的是,在HBase和BigTable中的value是不被排序的,只有key被排序。除了这个,其他的和普通的map实现是一样的。
Bigtable不是关系型数据库,但是却沿用了很多关系型数据库的术语,像table(表)、row(行)、column(列)等。这容易让读者误入歧途,将其与关系型数据库的概念对应起来,从而难以理解论文。但如果跳脱出关系型数据库的思想,而把BigTable只是想成一个简单的三维表,那么就可以解释得通了。读到一篇介绍BigTable的文章,里面对数据模型的理解个人感觉非常到位,这里引用他的解释来进行介绍(原文地址https://blog.csdn.net/opennaive/article/details/7532589#):
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。