大數據那些事(10):李逵麻子,李鬼坑人--BigTable的數據模型
今天我們回歸技術路線,講講Google三駕馬車裡的BigTable。以前有個說法叫做麻子不叫麻子,叫坑人。取其原意是滿臉是坑的人,諧音表示人被坑了。我們知道水滸裡面有李鬼裝李逵然後遇到真李逵的段子。BigTable這篇論文非常的難懂,很大程度上是因為它選擇了一些名為李逵實為李鬼的名字來裝飾自己,從而使得通俗易懂的數據模型變得奇葩起來。
Google三架馬車裡面,唯獨BigTable寫得高深難懂,很多時候其實是你首先要理解BigTable裡面的一些名字的基本概念。因為BigTable借用了很多的關係資料庫的術語來表示並非是關係資料庫的東西,所以我們的理解就似是而非了。這篇文章我們先聊一聊BigTable的數據模型。下一篇文章我們再仔細談BigTable的實現。
關於這個數據模型我一直很困惑,一知半解,直到某天讀了一篇文章:Understanding HBase and BigTable,頓時有豁然開朗的感覺。本文的數據模型部分很大程度上是我理解了這篇文章以後自己的一個小結,強烈建議大家再把這篇文章翻出來讀一讀。
BigTable的論文是這樣解釋BigTable的:
A BigTable is a sparse, distributed, persistent multidimensional sorted map.
大家注意一下,BigTable是一個Map不是一個Table。所以一開始就給帶到溝里去了,你想像一個有行有列的table的時候,對方告訴你其實就是Map。 Map是什麼,學過數據結構的都知道。C++有 map和unordered_map, Java有TreeMap HashMap。說白了map就是有key有value的KV store。這就是為什麼BigTable被叫做key-value store的原因。其實我覺得乾脆改名叫BigMap大家估計就沒那麼糊塗了。Map叫Table,就和李鬼叫李逵區別不大,只有坑人的份。所以下面開始我就用BigMap來稱呼。
我們繼續看看這個map是什麼樣的,map的value很簡單,是個string。Key就比較複雜了,它是一個複合key<key1, key2, key3>.其中這幾個key的名字分別如下:
key1: row
key2: column
key3:timestamp
所以我們知道為什麼又一次坑爹了,因為在一個正常的Table裡面的row和column到這裡變成了key的一部分。在BigTable里,key3是個64bit的number,key1和key2分別是string。key1是很單純的string,而key2則複雜一點,key2的組成如下
key2prefix:postfix
key2prefix叫做column family,和postfix一起組成完整的key,column family在每個BigMap裡面有有限個,但是那個postfix其實可以有無數多個。我這裡用key1,key2,key3是希望大家不要再去聯想那個有行有列的對我們非常熟悉的關係資料庫裡面的表。說白了,就是key和value的一個很簡單的數據模型。
我們再看看這個定義:
Sorted:這個好理解了,BigMap是個sortedMap,不是個HashMap。這一點不同於Amazon的Dynamo,另外一個非常著名的Key-Value store。具體來講是sort在key1和key2的順序,而key3的timestamp則從大排到小。要注意的是,雖然說key3被稱為timestamp,實際上按照論文的說法,你可以自己隨便指定值,而不是非得要當前的timestamp。
Persistent:這個也好理解。這個Map不會因為斷了電,機器掛了之類的數據就丟失了。
Sparse:說白了這個Map非常的sparse,不像我們理解的關係資料庫裡面的表那樣,每個行列組成的格子裡面都有值。
對BigTable進行查找主要有幾種方式:
給key1,key2,key3,返回的是小於或者等於key3的那個最大的數據。
給了key1和key2,返回是key3值最高的那個數據。
key2可以只給prefix,返回所有prefix符合的值。
從上述查詢來看,其實key3叫timestamp還算合理,但是key1和key2分別叫row和column則有些坑爹,加上整個Map又被叫成了Table,所以我讀的時候總是會聯想到那個關係資料庫裡面行列組成的Table,於是在理解數據模型的時候就被帶到溝里了。等我終於理解以後,我真有一種特別想罵人的感覺。所以取名很重要,不會因為黃小明改名成黃曉明就變成帥哥的。
推薦閱讀:
※5-Hbase Rowkey設計
※HBaseCon&灣區見聞及感想
※hbase分散式集群搭建
※大數據查詢——HBase讀寫設計與實踐