YunTable开发日记(3) – BigTable的数据模型和调用接口 (转载)
?
源地址:http://peopleyun.com/?p=665
?
本文將深入分析BigTable的數據模型,并介紹它是如何被調用的。
數據模型
就像向我之前所說的那樣,其實BigTable顧名思義,是一個非常大的表,而且是一個能存儲幾十億行(Row)和幾千列(Column)的非常巨大的表。什么表會怎么大呢?接下來,舉一些簡單的例子,比如:用于中國所有公民的個人信息和Internet上所有網站內容的表,這些表的總體規模可以達到PB以上級別,而且這些表的規模都會與日增長,所以很顯然需要使用分布式的方法,而不是使用一臺機器來承載這個巨大且不斷增長的Table。首先,會介紹一下BigTable最基本的數據模型,也就是table。
Table
圖1.? Table
這就是Table(表格),雖然上面截圖只有三個Row和五個Column,但由于這個表會存儲中國所有公民的個人信息,所以會有十三億多Row和幾百多Column,接下來,將介紹為了提高訪問效率和伸縮性的兩個特性:Colunm Family(列組)和Tablet(片)。
Column Family
圖2. Column Family
由于每個表格都會有成百上千的Column,而大多數查詢只需得到其中少數幾個Column,所以如果每次查詢都將所有的Column取出來的話,這樣會得不償失,所以Google在BigTable的設計中引入了Column Family這個特性,通過這個特性能將多個Column并為一個小組,比如上圖的“家庭地址”和“工作地址”都隸屬于“地址”這個Column Family,這樣做的最大的好處是能將這些Column放在一起存儲,這樣不僅能提高存取效率,而且能避免讀取過多的Column,比如可以選擇只讀取一個Column Family。
Tablet
?圖3 Tablet
這個非常容易理解,就是BigTable系統會自動根據Row Name的范圍,來將數據復制到不同的服務器上。
Timestamp
為了幫助數據的同步和備份,可以為每個Cell(單元格)設置相應的Timestamp,而且系統可以根據Timestamp來做GC(Garbage Collection)。
?
調用接口
Google的BigTable的調用接口主要以API為主,下面是一些示例代碼,主要參考自BigTable的Paper。
//打開Table
Table *T = OpenOrDie(“/peopletable”);
//找到相應的Row,并做相應的更新
RowMutation r1(T,”310101”);
r1.Set(“地址:家庭地址”,”SH88”);
//執行更新
Operation op;
Apply(&op, &r1);
//創建用于查詢的Scanner
Scanner scanner(T);
ScanStream *stream;
//查詢相關的代碼:1. 鎖定“地址”這個Cloumn Family;2.返回所有版本;3. 查找Row Name是”310101”的列。
stream = scanner.FetchColumnFamily(“地址”);
stream->SetReturnAllVersion();
scanner.Lookup(“310101”);
//打印
for(;!stream->Done();stream->Next()){
??? printf(“%s %s %lld %s\n”,Scanner.RowName(), stream->ColumnName,
???????????????????????????????????????? stream->TimeStamp,? stream->Value);
}
?
下篇開發日記將關注BigTable的存儲模型。
總結
以上是生活随笔為你收集整理的YunTable开发日记(3) – BigTable的数据模型和调用接口 (转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何给你的web项目加入log4net支
- 下一篇: [转]Git详解之一 Git起步