作者:江南白衣,原文出處: http://blog.csdn.net/calvinxiu/archive/2007/01/31/1498597.aspx,轉載請保留出處。
如果說Google的搜尋引擎是免費的早餐,Gmail們是免費的午餐的話,
http://labs.google.com/papers/ 就是Google給開發人員們的一份免費的晚餐。
不過,咋看著一桌飯菜可能不知道從哪吃起,在自己不熟悉的領域啃英文也不是一件愉快的事情。
一、一份PPT與四份中文翻譯
幸好,有一位面試google不第的老兄,自我爆發搞了一份Google Interal的PPT:
http://cbcg.net/talks/googleinternals/index.html,大家滑鼠點點就能跟著他匆匆過一遍google的內部架構。
然後又有崮崮山路上走9遍(http://sharp838.mblogger.cn)與美人他爹(http://my.donews.com/eraera/),翻譯了其中最重要的四份論文:
- 《MapRedue:在超大叢集上的簡易資料處理》--Simplified Data Processing on Large Clusters
- 《The Google File System》
- 《海量資料分析:Sawzall平行處理》--Interpreting the Data: Parallel Analysis with Sawzall
- 《Bigtable:結構化資料的分布儲存系統》--A Distributed Storage System for Structured Data
二、Google帝國的技術基石
Google帝國,便建立在大約45萬台的Server上,其中大部分都是"cheap x86 boxes"。而這45萬台Server,則建立於下面的key infrastructure:
1.GFS(Google File System):
GFS是適用於大規模分布式資料處理應用的Distributed File System,是Google一切的基礎,它基於普通的硬體裝置,實現了容錯的設計與極高的效能。
李開複說:Google最厲害的技術是它的storage。我認為學電腦的學生都應該看看這篇文章(再次感謝翻譯的兄弟)。
它以64M為一個Chunk(Block),每個Chunk至少存在於三台機器上,互動的簡單過程見:
2.MapReduce
MapReduce是一個分散式處理海量資料集的編程模式,讓程式自動分布到一個由普通機器組成的超大叢集上並發執行。像Grep-style job,日誌分析等都可以考慮採用它。
MapReduce的run-time系統會解決輸入資料的分布細節,跨越機器叢集的程式執行調度,處理機器的失效,並且管理機器之間的通訊請求。這樣的模式允許程式員可以不需要有什麼並發處理或者分布式系統的經驗,就可以處理超大的分布式系統得資源。
我自己接觸MapReduce是Lucene->Nutch->Hadoop的路線。
Hadoop是Lucene之父Doug Cutting的又一力作,是Java版本的Distributed File System與Map/Reduce實現。
Hadoop的文檔並不詳細,再看一遍Google這篇中文版的論文,一切清晰很多(又一次感謝翻譯的兄弟)。
孟岩也有一篇很清晰的部落格:Map Reduce - the Free Lunch is not over?
3.BigTable
BigTable 是Google Style的資料庫,使用結構化的檔案來儲存資料。
雖然不支援關係型資料查詢,但卻是建立GFS/MapReduce基礎上的,分布式儲存大規模結構化資料的方案。
BigTable是一個稀疏的,多維的,排序的Map,每個Cell由行關鍵字,列關鍵字和時間戳記三維定位.Cell的內容是一個不解釋的字串。
比如下表格儲存體每個網站的內容與被其他網站的反向串連的文本。
反向的URL com.cnn.www(www.cnn.com)是行的關鍵字;contents列儲存網頁內容,每個內容有一個時間戳記;因為有兩個反向串連,所以archor列族有兩列:anchor:cnnsi.com和anchhor:my.look.ca,列族的概念,使得表可以橫向擴充,archor的列數並不固定。
為了並發讀寫,熱區,HA等考慮,BigTable當然不會存在逗號分割的文字檔中,,是儲存在一種叫SSTable的資料庫結構上,並有BMDiff和Zippy兩種不同側重點的壓縮演算法。
4.Sawzall
Sawzall是一種建立在MapReduce基礎上的領域語言,可以被認為是分布式的awk。它的程式控制結構(if,while)與C語言無異,但它的領域語言語義使它完成相同功能的代碼與MapReduce的C++代碼相比簡化了10倍不止。
1 proto "cvsstat.proto"
2 submits: table sum[hour: int] of count: int;
3 log: ChangelistLog = input;
4 hour: int = hourof(log.time)
5 emit submits[hour] <- 1;
天書嗎?慢慢看吧。
我們這次是統計在每天24小時裡CVS提交的次數。
首先它的變數定義類似Pascal (i:int=0; 即定義變數i,類型為int,初始值為0)
1:引入cvsstat.proto協議描述,作用見後。
2:定義int數組submits 存放統計結果,用hour作下標。
3.迴圈的將檔案輸入轉換為ChangelistLog 類型,儲存在log變數裡,類型及轉換方法在前面的cvsstat.proto描述。
4.取出changlog中的提交時間log.time的hour值。
5.emit彙總,在sumits結果數組裡,為該hour的提交數加1,然後自動迴圈下一個輸入。
居然讀懂了,其中1、2步是準備與定義,3、4步是Map,第5步是Reduce。
三. 小結:
本文只是簡單的介紹Google的技術概貌,大家知道以後除了可作談資外沒有任何作用,我們真正要學習的骨血,是論文裡如何解決高並發,高可靠性等的設計思路和細節.....