bigtable翻译系列2

Data Model  

 

一个Bigtaable是一个稀疏的,分布式的,持久而有序的多维映射图。每一个映射由行关键字、列关键字、时间戳三个关键字来定位,它们三个对应的值是不具特定类型的字节数组。格式如下:(row:string, column:string, time:int64) → string

bigtable翻译系列2_第1张图片

上图是一个表的某一片段,该表用来存储网页信息,可以看到行的名字是一个反转的URL(#CNN首页)。列族叫 contents的列存储的内容是网页内容,列族名为 anchor的包含了任何引用该网页的内容。这儿就可以明显的看到,CNN站点的主页面被www.cnnsi.com和www.my.look.ca这两个网站引用,链接的文字分别是CNN和CNN.com(#也即在这如上两个网站点击上面对应的文字网页就会跳转到CNN首页,做过网页开发的人应该在熟悉不过),每个anchor单元只有一个版本;contents列却有三个版本,三个版本对应的时间为t3,t5,t6.

在使用过各种类Bigtable系统之后,我们得出了这种数据模型。上图作为一个具体的实例会对我们的很多决策带来影响,假设我们现在要保存大量网页的备份及其关联的信息用以在很多不同的项目中使用,这儿我们不妨先称上图的表为Webtable,在Webtable中,我们用URL作为行关键字,能代表网页某些属性的标志作为列关键字,并且把网页的内容保存在contents列中:列要结合时间戳才有意义,这个时间戳代表获取网页内容的时间点。

【行】
在表中的行关键字可以是任意字符串(目前最大支持64kb,尽管大多数用户一般只需要10-100个字节就满足了)。每次读写数据的时候都是以行为基本原子单位(不管你是操作这一行的一列数据还是多列数据),因为客户端总会存在对同一行的并发修改,所以这种以行为单位的设计将使系统的行为更简单易控。

Bigtable通过行关键字维护数据字典顺序,在某一表中行区间是动态划分的。每一个行区间被叫做tablet,tablet也是分布式和负载均衡时操作的单位。因此读取一个短行区间是非常高效的,因为这样只需要和更少的机器交互。客户端也可以利用这个特性来得到更好的数据访问,比如在Webtable中,在同一个域名下的多个网页通过URL反转会被分在同一区间的连续的位置。比如我们存储maps.google.com/index.html页面的内容时会被放在行关键字为com.google.maps/index下(#这样maps.google.com下其他的页面通过URL反转排序后都会在同一个区间的连续位置),把同一个域名下的网页存在连续的地方会减使主机和域名分析更加迅速。

【列族】
顾名思义,具有相同标志的列的集合叫做列族,列族也是最基本的访问控制单位。一个列族中存储的数据一般具有相同的类型(数据压缩时会将同一个列族压在一起),列族必须在存储数据之前就要创建好,当一个列族建好后,我们可以使用任何属于该列族的列。我们设想的是,在同一个表中列族的总数会比较小(通常一个表有100个列族),在后面的操作期间这些列族很少改变,与此相反,一个表里的列总数可以非常大(#每一个列族可能含有大量的列)。

(#说到这里列族和列的关系到底是什么)如下
列名可以用这种语法来定义  列族名:限定名  ,列族名必须是可打印字符,限定名可以是任意字符串。如在Webtable中列族可以是language,它记录页面是由什么种语言书写,我们只需要使用一个列关键字(#限定名)就可以来存储每个网页使用的语言标志(#列名可能像这样  language:page),在Webtable中另一个有用的列族是anchor;在该列族下的每个列代表了不同的anchor,如图所示,限定名是相关的网站地址;单元格内的内容是链接文字。

访问控制和磁盘及内存的统计可以表现在列族上,针对Webtable这张例表,我们可以有几种不同的应用管理:对它添加一些基本数据;读取基本数据和新建派生列族,但有些表只能允许我们对数据进行查看(因为涉及隐私我们可能只会看到部分列族)。


【时间戳】
在Bigtable中每个单元格的相同数据可以有好几个版本;这些版本有时间戳来定义。时间戳是64位整型数字。这个值可以由Bigtable来指定,这样可以用毫秒数来表示“即时性“,或者也可以由客户端应用程序明确指定,但是客户端应用需要自己产生一个独一无二的值避免时间戳重复。单元格内不同的时间戳是按降序排列,以保证首先访问到的是最新的数据。

带版本的数据越来越多,为了减少这种繁重的管理,我们在每个列族上多了两个设置参数的地方,以通知Bigtable自动垃圾回收单元格内的版本。客户端可以特别指出只有最近的多少个版本可以保留,或者只保留最新的版本(例如,只保留最近一周内新写的数据)。

在我们的Webtable例子里,在列族contents中为每一次自动爬取的网页设置了时间戳。上面的垃圾回收机制让我们为每个页面保留最近的三个版本。

(#  此符号内仅代表本人观点   )


(#  java eye 上的页面编辑不人性
)









 

你可能感兴趣的:(table)