免費的晚餐--google技術學習(轉)

     做者:江南白衣,原文出處: http://www.blogjava.net/calvin/archive/2007/01/31/96844.html ,轉載請保留出處。html


    若是說Google的搜索引擎是免費的早餐,Gmail們是免費的午飯的話,java

    http://labs.google.com/papers/ 就是Google給開發人員們的一份免費的晚餐。程序員

    不過,咋看着一桌飯菜可能不知道從哪吃起,在本身不熟悉的領域啃英文也不是一件愉快的事情。面試

1、一份PPT與四份中文翻譯 

    幸虧,有一位面試google不第的老兄,自我爆發搞了一份Google Interal的PPT:算法

    http://cbcg.net/talks/googleinternals/index.html,你們鼠標點點就能跟着他匆匆過一遍google的內部架構。數據庫

   而後又有崮崮山路上走9遍(http://sharp838.mblogger.cn)與美人他爹(http://my.donews.com/eraera/),翻譯了其中最重要的四份論文:apache

2、Google帝國的技術基石

     Google帝國,便創建在大約45萬臺的Server上,其中大部分都是"cheap x86 boxes"。而這45萬臺Server,則創建於下面的key infrastructure:編程

     1.GFS(Google File System):

     GFS是適用於大規模分佈式數據處理應用的分佈式文件系統,是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版本的分佈式文件系統與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,而後自動循環下一個輸入。

     竟然讀懂了,其中一、2步是準備與定義,三、4步是Map,第5步是Reduce。

三. 小結:

  本文只是簡單的介紹Google的技術概貌,你們知道之後除了可做談資外沒有任何做用,咱們真正要學習的骨血,是論文裏如何解決高併發,高可靠性等的設計思路和細節.....

相關文章
相關標籤/搜索