bigtable翻譯系列2

Data Model  

 

一個Bigtaable是一個稀疏的,分佈式的,持久而有序的多維映射圖。每一個映射由行關鍵字、列關鍵字、時間戳三個關鍵字來定位,它們三個對應的值是不具特定類型的字節數組。格式如下:(row:string, column:string, time:int64) → string



上圖是一個表的某一片段,該表用來存儲網頁信息,可以看到行的名字是一個反轉的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 上的頁面編輯不人性
)









 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章