- 浏览: 1779957 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
http://my.donews.com/eraera/2006/09/26/swogzstwtqdnwlfrzgsljctkjsbrtuiumxzj/
摘要
bigtable是设计来分布存储大规模结构化数据的,从设计上它可以扩展到上2^50字节,分布存储在几千个普通服务器上.Google的很多项目使用BT来存储数据,包括网页查询,google earth和google金融.这些应用程序对BT的要求各不相同:数据大小(从URL到网页到卫星图象)不同,反应速度不同(从后端的大批处理到实时数据服务).对于不同的要求,BT都成功的提供了灵活高效的服务.在本文中,我们将描述BT的数据模型.这个数据模型让用户动态的控制数据的分布和结构.我们还将描述BT的设计和实现.
1.介绍
在过去两年半里,我们设计,实现并部署了BT.BT是用来分布存储和管理结构化数据的.BT的设计使它能够管理2^50 bytes(petabytes)数据,并可以部署到上千台机器上.BT完成了以下目标:应用广泛,可扩展,高性能和高可用性(high availability). 包括google analytics, google finance, orkut, personalized search, writely和google earth在内的60多个项目都使用BT.这些应用对BT的要求各不相同,有的需要高吞吐量的批处理,有的需要快速反应给用户数据.它们使用的BT集群也各不相同,有的只有几台机器,有的有上千台,能够存储2^40字节(terabytes)数据.
BT在很多地方和数据库很类似:它使用了很多数据库的实现策略.并行数据库[14]和内存数据库[13]有可扩展性和高性能,但是BT的界面不同.BT不支持完全的关系数据模型;而是为客户提供了简单的数据模型,让客户来动态控制数据的分布和格式{就是只存储字串,格式由客户来解释},并允许客户推断底层存储数据的局部性{以提高访问速度}.数据下标是行和列的名字,数据本身可以是任何字串.BT的数据是字串,没有解释{类型等}.客户会在把各种结构或者半结构化的数据串行化{比如说日期串}到数据中.通过仔细选择数据表示,客户可以控制数据的局部化.最后,可以使用BT模式来控制数据是放在内存里还是在硬盘上.{就是说用模式,你可以把数据放在离应用最近的地方.毕竟程序在一个时间只用到一块数据.在体系结构里,就是:locality, locality, locality}
第二节描述数据模型细节.第三节关于客户API概述.第四节简介BT依赖的google框架.第五节描述BT的实现关键部分.第6节叙述提高BT性能的一些调整.第7节提供BT性能的数据.在第8节,我们提供BT的几个使用例子,第9节是经验教训.在第10节,我们列出相关研究.最后是我们的结论.
2.数据模型
BT是一个稀疏的,长期存储的{存在硬盘上},多维度的,排序的映射表.这张表的索引是行关键字,列关键字和时间戳.每个值是一个不解释的字符数组.{数据都是字符串,没类型,客户要解释就自力更生吧}.
(row:string, column:string,time:int64)->string {能编程序的都能读懂,不翻译了}
//彼岸翻译的第二节
我们仔细查看过好些类似bigtable的系统之后定下了这个数据模型。举一个具体例子(它促使我们做出某些设计决定), 比如我们想要存储大量网页及相关信息,以用于很多不同的项目;我们姑且叫它Webtable。在Webtable里,我们将用URL作为行关键字,用网页的某些属性作为列名,把网页内容存在contents:列中并用获取该网页的时间戳作为标识,如图一所示。
图一:一个存储Web网页的范例列表片断。行名是一个反向URL{即com.cnn.www}。contents列族{原文用 family,译为族,详见列族}存放网页内容,anchor列族存放引用该网页的锚链接文本。CNN的主页被Sports Illustrater{即所谓SI,CNN的王牌体育节目}和MY-look的主页引用,因此该行包含了名叫“anchor:cnnsi.com”和 “anchhor:my.look.ca”的列。每个锚链接只有一个版本{由时间戳标识,如t9,t8};而contents列则有三个版本,分别由时间 戳t3,t5,和t6标识。
行
表中的行关键字可以是任意字符串(目前支持最多64KB,多数情况下10-100字节足够了)。在一个行关键字下的每一个读写操作都是原子操作(不管读写这一行里多少个不同列),这是一个设计决定,这样在对同一行进行并发操作时,用户对于系统行为更容易理解和掌控。
Bigtable通过行关键字的字典序来维护数据。一张表可以动态划分成多个连续行。连续行在这里叫做“子表”{tablet},是数据分布和负载均衡的单位。这样一来,读较少的连续行就比较有效率,通常只需要较少机器之间的通信即可。用户可以利用这个属性来选择行关键字,从而达到较好数据访问地域性{locality}。举例来说,在Webtable里,通过反转URL中主机名的方式,可以把同一个域名下的网页组织成连续行。具体来说,可以把maps.google.com/index.html中的数据存放在关键字com.google.maps/index.html下。按照相同或属性相近的域名来存放网页可以让基于主机和基于域名的分析更加有效。
列族
一组列关键字组成了“列族”,这是访问控制的基本单位。同一列族下存放的所有数据通常都是同一类型(同一列族下的数据可压缩在一起)。列族必须先创建,然后在能在其中的列关键字下存放数据;列族创建后,族中任何一个列关键字均可使用。我们希望,一张表中的不同列族不能太多(最多几百个),并且列族在运作中绝少改变。作为对比,一张表可以有无限列。
列关键字用如下语法命名:列族:限定词。 列族名必须是看得懂{printable}的字串,而限定词可以是任意字符串。比如,Webtable可以有个列族叫language,存放撰写网页的语言。我们在language列族中只用一个列关键字,用来存放每个网页的语言标识符。该表的另一个有用的列族是anchor;给列族的每一个列关键字代表一个锚链接,如图一所示。而这里的限定词则是引用该网页的站点名;表中一个表项存放的是链接文本。
访问控制,磁盘使用统计,内存使用统计,均可在列族这个层面进行。在Webtable举例中,我们可以用这些控制来管理不同应用:有的应用添加新的基本数据,有的读取基本数据并创建引申的列族,有的则只能浏览数据(甚至可能因为隐私权原因不能浏览所有数据)。
时间戳
Bigtable表中每一个表项都可以包含同一数据的多个版本,由时间戳来索引。Bigtable的时间戳是64位整型。可以由Bigtable来赋值,表示准确到毫秒的“实时”;或者由用户应用程序来赋值。需要避免冲突的应用程序必须自己产生具有唯一性的时间戳。不同版本的表项内容按时间戳倒序排列,即最新的排在前面。
为了简化对于不同数据版本的数据的管理,我们对每一个列族支持两个设定,以便于Bigtable对表项的版本自动进行垃圾清除。用户可以指明只保留表项的最后n个版本,或者只保留足够新的版本(比如,只保留最近7天的内容)。
在Webtable举例中,我们在contents:列中存放确切爬行一个网页的时间戳。如上所述的垃圾清除机制可以让我们只保留每个网页的最近三个版本。
//我开始翻译3,4节
3.API
BT的API提供了建立和删除表和列族的函数.还提供了函数来修改集群,表和列族的元数据,比如说访问权限.
// Open the table
Table *T = OpenOrDie(”/bigtable/web/webtable”);
// Write a new anchor and delete an old anchor
RowMutation r1(T, “com.cnn.www”);
r1.Set(”anchor:www.c-span.org”, “CNN”);
r1.Delete(”anchor:www.abc.com”);
Operation op;
Apply(&op, &r1);
图 2: 写入Bigtable.
在BT中,客户应用可以写或者删除值,从每个行中找值,或者遍历一个表中的数据子集.图2的C++代码是使用RowMutation抽象表示来进行一系列的更新(为保证代码精简,没有包括无关的细节).调用Apply函数,就对Webtable进行了一个原子修改:它为http://www.cnn.com/增加了一个锚点,并删除了另外一个锚点.
Scanner scanner(T);
ScanStream *stream;
stream = scanner.FetchColumnFamily(”anchor”);
stream->SetReturnAllVersions();
scanner.Lookup(”com.cnn.www”);
for (; !stream->Done(); stream->Next()) {
printf(”%s %s %lld %s\n”,
scanner.RowName(),
stream->ColumnName(),
stream->MicroTimestamp(),
stream->Value());
}
图3: 从Bigtable读数据.
图3的C++代码是使用Scanner抽象来遍历一个行内的所有锚点.客户可以遍历多个列族.有很多方法可以限制一次扫描中产生的行,列和时间戳.例如,我们可以限制上面的扫描,让它只找到那些匹配正则表达式*.cnn.com的锚点,或者那些时间戳在当前时间前10天的锚点.
BT还支持其他一些更复杂的处理数据的功能.首先,BT支持单行处理.这个功能可以用来对存储在一个行关键字下的数据进行原子的读-修改-写操作.BT目前不支持跨行关键字的处理,但是它有一个界面,可以用来让客户进行批量的跨行关键字处理操作.其次,BT允许把每个表项用做整数记数器.最后,BT支持在服务器的地址空间内执行客户端提供的脚本程序.脚本程序的语言是google开发的Sawzall[28]数据处理语言.目前,我们基于的Sawzall的API还不允许客户脚本程序向BT内写数据,但是它允许多种形式的数据变换,基于任何表达式的过滤和通过多种操作符的摘要.
BT可以和MapReduce[12]一起使用.MapReduce是google开发的大规模并行计算框架.我们为编写了一套外层程序,使BT可以作为MapReduce处理的数据源头和输出结果.
4.建立BT的基本单元
BT是建立在其他数个google框架单元上的.BT使用google分布式文件系统(GFS)[17]来存储日志和数据文件{yeah, right, what else can it use, FAT32?}.一个BT集群通常在一个共享的机器池中工作,池中的机器还运行其他的分布式应用{虽然机器便宜的跟白菜似的,可是一样要运行多个程序,命苦的象小白菜},BT和其他程序共享机器{BT的瓶颈是IO/内存,可以和CPU要求高的程序并存}.BT依赖集群管理系统来安排工作,在共享的机器上管理资源,处理失效机器并监视机器状态{典型的server farm结构,BT是上面的应用之一}.
BT内部存储数据的格式是google SSTable格式.一个SSTable提供一个从关键字到值的映射,关键字和值都可以是任意字符串.映射是排序的,存储的{不会因为掉电而丢失},不可改写的.可以进行以下操作:查询和一个关键字相关的值;或者根据给出的关键字范围遍历所有的关键字和值.在内部,每个SSTable包含一列数据块(通常每个块的大小是64KB,但是大小是可以配置的{索引大小是16 bits,应该是比较好的一个数}).块索引(存储在SSTable的最后)用来定位数据块;当打开SSTable的时候,索引被读入内存{性能}.每次查找都可以用一个硬盘搜索完成{根据索引算出数据在哪个道上,一个块应该不会跨两个道,没必要省那么点空间}:首先在内存中的索引里进行二分查找找到数据块的位置,然后再从硬盘读去数据块.最佳情况是:整个SSTable可以被放在内存里,这样一来就不必访问硬盘了.{想的美,前面是谁口口声声说要跟别人共享机器来着?你把内存占满了别人上哪睡去?}
BT还依赖一个高度可用的,存储的分布式数据锁服务Chubby[8]{看你怎么把这个high performance给说圆喽}.一个Chubby服务由5个活的备份{机器}构成,其中一个被这些备份选成主备份,并且处理请求.这个服务只有在大多数备份都活着并且互相通信的时候才是活的{绕口令?去看原文吧,是在有出错的前提下的冗余算法}.当有机器失效的时候,Chubby使用Paxos算法[9,23]来保证备份的一致性{这个问题还是比较复杂的,建议去看引文了解一下问题本身}.Chubby提供了一个名字空间,里面包括了目录和小文件{万变不离其宗}.每个目录或者文件可以当成一个锁来用,读写文件操作都是原子化的.Chubby客户端的程序库提供了对Chubby文件的一致性缓存{究竟是提高性能还是降低性能?如果访问是分布的,就是提高性能}.每个Chubby客户维护一个和Chubby服务的会话.如果一个客户不能在一定时间内更新它的会话,这个会话就过期失效了{还是针对大server farm里机器失效的频率设计的}.当一个会话失效时,其拥有的锁和打开的文件句柄都失效{根本设计原则:失效时回到安全状态}.Chubby客户可以在文件和目录上登记回调函数,以获得改变或者会话过期的通知.{翻到这里,有没有人闻到java的味道了?}
BT使用Chubby来做以下几个任务:保证任何时间最多只有一个活跃的主备份;来存储BT数据的启动位置(参考5.1节);发现小表(tablet)服务器,并完成tablet服务器消亡的善后(5.2节);存储BT数据的模式信息(每张表的列信息);以及存储访问权限列表.如果有相当长的时间Chubby不能访问,BT就也不能访问了{任何系统都有其弱点}.最近我们在使用11个Chubby服务实例的14个BT集群中度量了这个效果,由于Chubby不能访问而导致BT中部分数据不能访问的平均百分比是0.0047%,这里Chubby不能访问的原因是Chubby本身失效或者网络问题.单个集群里,受影响最大的百分比是0.0326%{基于文件系统的Chubby还是很稳定的}.
发表评论
-
RESTful API 编写指南
2016-06-14 11:12 5182基于一些不错的RESTful ... -
谈冷热数据
2015-07-20 11:13 6156http://jishu.zol.com.cn/11379. ... -
贺岁文:部门正副经理之争
2015-01-29 11:57 1181http://blog.csdn.net/shenyisyn ... -
只能通过chrome网上应用商店安装该程序”的解决方法
2014-10-09 13:09 6148自 Chrome 21.x 开始默认只允许从 Chrome ... -
nginx同一iP多域名配置方法
2014-06-03 13:48 2692nginx绑定多个域名可又把多个域名规则写一个配置文件里,也 ... -
风车网陈晓峰回忆录:我的两个月倒闭史
2014-05-27 16:09 1341http://tech2ipo.com/54719 ... -
Debugging and Profiling PHP with Xdebug
2014-04-15 12:10 1739http://www.sitepoint.com/debug ... -
XHProf 中文文档
2014-04-15 11:26 1460XHProf文件(草稿) 翻译:徐 ... -
让普通用户登录phpmyadmin不显示information_schema
2014-02-13 16:54 1914http://www.cnblogs.com/faily20 ... -
apache2.2+svn1.6+TortoiseSVN在windows环境搭建
2013-12-21 21:58 4467今天空闲时间对SVN服务器端和客户端环境做了搭建,并且成功了 ... -
MiniCMS - 吐槽
2013-10-22 10:58 1448看到的深有感触, ... -
MySQL 数据库通过日志恢复
2013-08-14 17:09 1091http://blog.csdn.net/hanxin198 ... -
使用文件函数操作Memcache
2013-08-12 18:21 1525写道 最近一周,SAE又悄悄的上线了一个新功能.那就是开始 ... -
转 总结过去10年
2013-08-10 11:17 1122下面的好文 担心原作者删帖 转到此处吧 http:/ ... -
SAET SQL_CALC_FOUND_ROWS 问题
2013-07-20 14:22 2308上午遇到 应用数据查不到的问题,但是 数据库中明明 ... -
问一下使用struts的同学们,你们这些年,是怎么过来的?
2013-07-20 12:04 1371by 空虚浪子心 http://www.inbreak.ne ... -
杂谈产品灰度上线的研发模式
2013-05-13 13:45 1762写道 传统的产品研发 ... -
正则表达式口诀
2013-04-12 14:38 1467写道 来源:蓝血正则 ... -
Emacs 快速指南
2013-04-09 17:51 2328您正在阅读 Emacs 快速指南(Emacs tutorial ... -
推荐几个技术博客,持续更新中...
2013-03-18 10:07 3308推荐几个技术博客,我整理了一下googlereader的订 ...
相关推荐
这些技术包括MapReduce、GFS(Google File System)和Bigtable,它们对现代大数据处理和云计算的发展产生了深远影响。以下是这三项技术的详细介绍: 1. MapReduce: MapReduce是一种编程模型,用于大规模数据集的...
Bigtable是谷歌开发的一款分布式、大规模数据存储系统,其主要设计目的是处理PB级别的数据,即能够在数千台普通的服务器上进行高效的数据管理。该系统已被广泛应用在谷歌的多个产品和服务中,例如Web索引、Google ...
Google的BigTable是一款强大的分布式数据存储系统,旨在处理大规模的半结构化数据。它的设计理念和实现技术对于现代云服务和大数据处理有着深远的影响。BigTable的设计灵感来源于NoSQL数据库运动,它允许快速、灵活...
- **搜索索引**:BigTable可用于存储大规模的搜索索引数据,支持快速检索和更新操作。 - **地图服务**:Google Earth等地图应用利用BigTable存储海量地理信息,提供高精度的地图服务。 - **金融数据处理**:Google ...
在IT行业中,Google是技术创新的巨头,其三大核心技术——MapReduce、GFS(Google File System)和Bigtable,对大数据处理和云计算领域产生了深远影响。这些技术是Google为解决自身大规模数据处理问题而研发的,并...
谷歌三大论文涵盖了分布式文件系统(DFS)、MapReduce编程模型和大规模分布式存储系统Bigtable的核心技术,这些技术共同构成了谷歌内部处理大数据和大规模计算任务的基础架构。下面是这些技术的核心知识点和描述: ...
- **表分区(Table Partitioning)**:Bigtable自动将表划分为多个分区(chunk),每个分区包含连续的行键区间,从而实现负载均衡和数据的水平扩展。 - **数据复制(Data Replication)**:为了提高数据可靠性和系统可用性...
首先,让我们关注《谷歌Bigtable:一个分布式存储系统》。Bigtable是一种分布式的、可扩展的、高性能的结构化数据存储系统,它能够处理PB级别的数据。Bigtable的设计灵感来源于Google的Chubby锁服务和GFS文件系统。...
Google BigTable 是一个稀疏的、分布式的、持久化的、多维度排序的、大数据量存储系统,它能够解决符合上述map数据模型业务的存储问题。下面是对 Google BigTable 的详细解释: 什么是 Google BigTable? Google ...
《Google 三大核心技术:GFS、MapReduce与BigTable》 在信息技术的快速发展中,Google以其独特的创新精神和卓越的技术实力,引领了大数据处理的新纪元。GFS(Google File System)、MapReduce和BigTable是Google的...
### 谷歌三大核心技术之Google BigTable详解 #### 一、BigTable简介与背景 BigTable是由Google设计并开发的一款分布式结构化数据存储系统,旨在处理海量数据,特别是那些分布在数千台普通服务器上的PB级数据。由于...
### 谷歌BigTable论文知识点详解 #### 一、BigTable概述 - **系统定位**:BigTable是一个分布式结构化数据存储系统,专为处理海量数据设计,数据规模可达PB级别,通常运行于数千台普通服务器之上。 - **应用场景**...
BigTable是由Google开发的一种分布式数据存储系统,用于支持大规模、结构化的数据处理。这篇论文详细介绍了BigTable的设计理念、架构以及它如何满足Google内部各种服务的需求。以下是对BigTable核心知识点的详细解析...
Bigtable是谷歌开发的一款用于管理结构化数据的分布式存储系统,它被设计为能够扩展到非常大的规模:可以在数千台商品服务器上存储PB级别的数据。在谷歌内部,许多项目都依赖于Bigtable来存储数据,例如网页索引、...
3. 最后就是谷歌发布于2006年的Bigtable,其启发了无数的NoSQL数据库,比如:Cassandra、HBase等等。Cassandra架构中有一半是模仿Bigtable,包括了数据模型、SSTables以及提前写日志(另一半是模仿Amazon的Dynamo...
Bigtable是谷歌开发的一款分布式存储系统,主要用于处理大规模数据集,其设计目标在于提供一个既可靠又能处理PB级别数据的平台。这种规模的数据处理能力使得Bigtable成为众多谷歌产品和服务的重要组成部分,如Web...