青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

統計

  • 隨筆 - 50
  • 文章 - 42
  • 評論 - 147
  • 引用 - 0

留言簿(6)

隨筆分類

文章分類

Link

搜索

  •  

積分與排名

  • 積分 - 166924
  • 排名 - 159

最新評論

閱讀排行榜

評論排行榜

Map Reduce - the Free Lunch is not over?

Map Reduce - the Free Lunch is not over?

by Meng Yan on Nov.15, 2006, under Other

微軟著名的C++大師Herb Sutter在2005年初的時候曾經寫過一篇重量級的文章:”The Free Lunch Is Over: A Fundamental Turn Toward Concurrency in Software“,預言OO之后軟件開發將要面臨的又一次重大變革-并行計算。

摩爾定律統制下的軟件開發時代有一個非常有意思的現象:”Andy giveth, and Bill taketh away.”。不管CPU的主頻有多快,我們始終有辦法來利用它,而我們也陶醉在機器升級帶來的程序性能提高中。

我記著我大二的時候曾經做過一個五子棋的程序,當時的算法就是預先設計一些棋型(有優先級),然后掃描棋盤,對形勢進行分析,看看當前走哪部對自己最重要。當然下棋還要堵別人,這就需要互換雙方的棋型再計算。如果只算一步,很可能被狡猾的對手欺騙,所以為了多想幾步,還需要遞歸和回朔。在當時的機器上,算3步就基本上需要3秒左右的時間了。后來大學畢業收拾東西的時候找到這個程序,試了一下,發現算10步需要的時間也基本上感覺不出來了。

不知道你是否有同樣的經歷,我們不知不覺的一直在享受著這樣的免費午餐??墒?,隨著摩爾定律的提前終結,免費的午餐終究要還回去。雖然硬件設計師還在努力:Hyper Threading CPU(多出一套寄存器,相當于一個邏輯CPU)使得Pipeline盡可能滿負荷,使多個Thread的操作有可能并行,使得多線程程序的性能有5%-15%的提升;增加Cache容量也使得包括Single-Thread和Multi-Thread程序都能受益。也許這些還能幫助你一段時間,但問題是,我們必須做出改變,面對這個即將到來的變革,你準備好了么?

Concurrency Programming != Multi-Thread Programming。很多人都會說MultiThreading誰不會,問題是,你是為什么使用/如何使用多線程的?我從前做過一個類似AcdSee一樣的圖像查看/處理程序,我通常用它來處理我的數碼照片。我在里面用了大量的多線程,不過主要目的是在圖像處理的時候不要Block住UI,所以將CPU Intensive的計算部分用后臺線程進行處理。而并沒有把對圖像矩陣的運算并行分開。

我覺得Concurrency Programming真正的挑戰在于Programming Model的改變,在程序員的腦子里面要對自己的程序怎樣并行化有很清楚的認識,更重要的是,如何去實現(包括架構、容錯、實時監控等等)這種并行化,如何去調試,如何去測試。

在Google,每天有海量的數據需要在有限的時間內進行處理(其實每個互聯網公司都會碰到這樣的問題),每個程序員都需要進行分布式的程序開發,這其中包括如何分布、調度、監控以及容錯等等。Google的MapReduce正是把分布式的業務邏輯從這些復雜的細節中抽象出來,使得沒有或者很少并行開發經驗的程序員也能進行并行應用程序的開發。

MapReduce中最重要的兩個詞就是Map(映射)和Reduce(規約)。初看Map/Reduce這兩個詞,熟悉Function Language的人一定感覺很熟悉。FP把這樣的函數稱為”higher order function”(”High order function”被成為Function Programming的利器之一哦),也就是說,這些函數是編寫來被與其它函數相結合(或者說被其它函數調用的)。如果說硬要比的化,可以把它想象成C里面的CallBack函數,或者STL里面的Functor。比如你要對一個STL的容器進行查找,需要制定每兩個元素相比較的Functor(Comparator),這個Comparator在遍歷容器的時候就會被調用。

拿前面說過圖像處理程序來舉例,其實大多數的圖像處理操作都是對圖像矩陣進行某種運算。這里的運算通常有兩種,一種是映射,一種是規約。拿兩種效果來說,”老照片”效果通常是強化照片的G/B值,然后對每個象素加一些隨機的偏移,這些操作在二維矩陣上的每一個元素都是獨立的,是Map操作。而”雕刻”效果需要提取圖像邊緣,就需要元素之間的運算了,是一種Reduce操作。再舉個簡單的例子,一個一維矩陣(數組)[0,1,2,3,4]可以映射為[0,2,3,6,8](乘2),也可以映射為[1,2,3,4,5](加1)。它可以規約為0(元素求積)也可以規約為10(元素求和)。

面對復雜問題,古人教導我們要“之”,英文中對應的詞是”Divide and Conquer“。Map/Reduce其實就是Divide/Conquer的過程,通過把問題Divide,使這些Divide后的Map運算高度并行,再將Map后的結果Reduce(根據某一個Key),得到最終的結果。

Googler發現這是問題的核心,其它都是共性問題。因此,他們把MapReduce抽象分離出來。這樣,Google的程序員可以只關心應用邏輯,關心根據哪些Key把問題進行分解,哪些操作是Map操作,哪些操作是Reduce操作。其它并行計算中的復雜問題諸如分布、工作調度、容錯、機器間通信都交給Map/Reduce Framework去做,很大程度上簡化了整個編程模型。

MapReduce的另一個特點是,Map和Reduce的輸入和輸出都是中間臨時文件(MapReduce利用Google文件系統來管理和訪問這些文件),而不是不同進程間或者不同機器間的其它通信方式。我覺得,這是Google一貫的風格,化繁為簡,返璞歸真。

接下來就放下其它,研究一下Map/Reduce操作。(其它比如容錯、備份任務也有很經典的經驗和實現,論文里面都有詳述)

Map的定義:

Map, written by the user, takes an input pair and produces a set of intermediate key/value pairs. The MapReduce library groups together all intermediate values associated with the same intermediate key I and passes them to the Reduce function.

Reduce的定義:

The Reduce function, also written by the user, accepts an intermediate key I and a set of values for that key. It merges together these values to form a possibly smaller set of values. Typically just zero or one output value is produced per Reduce invocation. The intermediate values are supplied to the user’s reduce function via an iterator. This allows us to handle lists of values that are too large to fit in memory.

MapReduce論文中給出了這樣一個例子:在一個文檔集合中統計每個單詞出現的次數。

Map操作的輸入是每一篇文檔,將輸入文檔中每一個單詞的出現輸出到中間文件中去。

map(String key, String value):
    // key: document name
    // value: document contents
    for each word w in value:
        EmitIntermediate(w, “1″);

比如我們有兩篇文檔,內容分別是

A - “I love programming”

B - “I am a blogger, you are also a blogger”。

B文檔經過Map運算后輸出的中間文件將會是:

	I,1
am,1
a,1
blogger,1
you,1
are,1
a,1
blogger,1

Reduce操作的輸入是單詞和出現次數的序列。用上面的例子來說,就是 (”I”, [1, 1]), (”love”, [1]), (”programming”, [1]), (”am”, [1]), (”a”, [1,1]) 等。然后根據每個單詞,算出總的出現次數。

reduce(String key, Iterator values):
    // key: a word
    // values: a list of counts
    int result = 0;
    for each v in values:
        result += ParseInt(v);
    Emit(AsString(result));

最后輸出的最終結果就會是:(”I”, 2″), (”a”, 2″)……

實際的執行順序是:

  1. MapReduce Library將Input分成M份。這里的Input Splitter也可以是多臺機器并行Split
  2. Master將M份Job分給Idle狀態的M個worker來處理;
  3. 對于輸入中的每一個<key, value> pair 進行Map操作,將中間結果Buffer在Memory里;
  4. 定期的(或者根據內存狀態),將Buffer中的中間信息Dump到本地磁盤上,并且把文件信息傳回給Master(Master需要把這些信息發送給Reduce worker)。這里最重要的一點是,在寫磁盤的時候,需要將中間文件做Partition(比如R個)。拿上面的例子來舉例,如果把所有的信息存到一個文件,Reduce worker又會變成瓶頸。我們只需要保證相同Key能出現在同一個Partition里面就可以把這個問題分解。
  5. R個Reduce worker開始工作,從不同的Map worker的Partition那里拿到數據(read the buffered data from the local disks of the map workers),用key進行排序(如果內存中放不下需要用到外部排序 - external sort)。很顯然,排序(或者說Group)是Reduce函數之前必須做的一步。 這里面很關鍵的是,每個Reduce worker會去從很多Map worker那里拿到X(0<X<R) Partition的中間結果,這樣,所有屬于這個Key的信息已經都在這個worker上了。
  6. Reduce worker遍歷中間數據,對每一個唯一Key,執行Reduce函數(參數是這個key以及相對應的一系列Value)。
  7. 執行完畢后,喚醒用戶程序,返回結果(最后應該有R份Output,每個Reduce Worker一個)。

可見,這里的分(Divide)體現在兩步,分別是將輸入分成M份,以及將Map的中間結果分成R份。將輸入分開通常很簡單,Map的中間結果通常用”hash(key) mod R”這個結果作為標準,保證相同的Key出現在同一個Partition里面。當然,使用者也可以指定自己的Partition Function,比如,對于Url Key,如果希望同一個Host的URL出現在同一個Partition,可以用”hash(Hostname(urlkey)) mod R”作為Partition Function。

對于上面的例子來說,每個文檔中都可能會出現成千上萬的 (”the”, 1)這樣的中間結果,瑣碎的中間文件必然導致傳輸上的損失。因此,MapReduce還支持用戶提供Combiner Function。這個函數通常與Reduce Function有相同的實現,不同點在于Reduce函數的輸出是最終結果,而Combiner函數的輸出是Reduce函數的某一個輸入的中間文件。

Tom White給出了Nutch[2]中另一個很直觀的例子,分布式Grep。我一直覺得,Pipe中的很多操作,比如More、Grep、Cat都類似于一種Map操作,而Sort、Uniq、wc等都相當于某種Reduce操作。

加上前兩天Google剛剛發布的BigTable論文,現在Google有了自己的集群 - Googel Cluster,分布式文件系統 - GFS,分布式計算環境 - MapReduce,分布式結構化存儲 - BigTable,再加上Lock Service。我真的能感覺的到Google著名的免費晚餐之外的對于程序員的另一種免費的晚餐,那個由大量的commodity PC組成的large clusters。我覺得這些才真正是Google的核心價值所在。

呵呵,就像微軟老兵Joel Spolsky(你應該看過他的”Joel on Software”吧?)曾經說過,對于微軟來說最可怕的是[1],微軟還在苦苦追趕Google來完善Search功能的時候,Google已經在部署下一代的超級計算機了。

The very fact that Google invented MapReduce, and Microsoft didn’t, says something about why Microsoft is still playing catch up trying to get basic search features to work, while Google has moved on to the next problem: building Skynet^H^H^H^H^H^H the world’s largest massively parallel supercomputer. I don’t think Microsoft completely understands just how far behind they are on that wave.

注1:其實,微軟也有自己的方案 - DryAd。問題是,大公司里,要想重新部署這樣一個底層的InfraStructure,無論是技術的原因,還是政治的原因,將是如何的難。

注2:Lucene之父Doug Cutting的又一力作,Project Hadoop - 由Hadoop分布式文件系統和一個Map/Reduce的實現組成,Lucene/Nutch的成產線也夠齊全的了。

posted on 2009-09-03 10:43 pear_li 閱讀(307) 評論(0)  編輯 收藏 引用 所屬分類: Algorithm

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            免费成人黄色| 久久影院午夜片一区| 亚洲一区日韩在线| 欧美一区二区三区精品| 欧美一区二区在线播放| 女主播福利一区| 在线视频精品| 久久久999成人| 欧美日韩hd| 国产亚洲制服色| 99国产精品国产精品久久| 亚洲一级二级在线| 美女999久久久精品视频| 最近中文字幕mv在线一区二区三区四区 | 在线中文字幕日韩| 欧美在线视频免费观看| 欧美日韩大片| 亚洲国产日韩一区| 久久精品一区二区国产| 亚洲免费av网站| 久久久青草青青国产亚洲免观| 欧美激情一区二区三区不卡| 国产日产亚洲精品| 一本一本久久a久久精品综合妖精| 久久青青草原一区二区| 久久综合网络一区二区| 欧美成人a视频| 国产亚洲精品久久久久动| 夜夜嗨av一区二区三区网页| 美女国产精品| 久久精品1区| 国产精品久线观看视频| 99视频热这里只有精品免费| 国产精品高潮呻吟久久av无限| 好男人免费精品视频| 久久精彩视频| 亚洲欧美伊人| 国产精品第13页| 在线性视频日韩欧美| 欧美成人午夜视频| 久久精品中文字幕免费mv| 亚洲欧美一区二区三区在线| 欧美日韩不卡| 一本一道久久综合狠狠老精东影业| 美女精品一区| 久久尤物电影视频在线观看| 狠狠干狠狠久久| 久久全国免费视频| 久久国产精品99久久久久久老狼| 国产欧美日韩综合| 欧美一区二区三区日韩| 午夜精品亚洲一区二区三区嫩草| 国产日韩精品视频一区| 久久爱www.| 西西人体一区二区| 国内免费精品永久在线视频| 久久综合九色综合欧美狠狠| 久久男人资源视频| 亚洲精品网站在线播放gif| 最新亚洲视频| 国产精品激情av在线播放| 香蕉成人久久| 久久精品人人做人人爽| 亚洲国产精品尤物yw在线观看 | 欧美一区亚洲| 久久国产精品电影| 亚洲精品在线看| 国产精品99久久久久久久vr| 国产精品久久久久aaaa樱花 | 日韩一级大片| 国产精品99久久久久久白浆小说| 国产精品一区二区三区免费观看| 久久aⅴ国产紧身牛仔裤| 久久aⅴ乱码一区二区三区| 亚洲成在线观看| 99综合在线| 国产一区二区中文字幕免费看| 嫩草国产精品入口| 国产精品99一区二区| 欧美一区二区三区视频| 免费不卡在线观看av| 亚洲午夜视频| 久久精品伊人| 亚洲一区二区视频在线| 久久视频在线视频| 亚洲综合另类| 欧美电影免费观看网站| 欧美黑人多人双交| 欧美一区日本一区韩国一区| 美女精品在线| 欧美在线免费看| 欧美日韩福利视频| 卡通动漫国产精品| 国产精品日日做人人爱| 欧美国产精品一区| 国产婷婷一区二区| 亚洲精品欧美激情| 亚洲风情在线资源站| 亚洲欧美久久久| 一本色道久久综合亚洲91| 久久精品噜噜噜成人av农村| 欧美视频在线视频| 亚洲国产日韩美| 韩日欧美一区二区| 亚洲欧美综合国产精品一区| 亚洲毛片av在线| 久久嫩草精品久久久精品| 欧美一级日韩一级| 欧美色播在线播放| 亚洲激情欧美| 亚洲国产一区二区视频| 久久国产黑丝| 久久久久成人精品| 国产视频一区三区| 午夜精品久久久久久| 亚洲曰本av电影| 欧美午夜电影一区| 一本色道久久精品| 亚洲伊人伊色伊影伊综合网 | 欧美中在线观看| 性欧美1819性猛交| 国产精品亚洲а∨天堂免在线| 日韩视频中文| 在线综合欧美| 国产精品v欧美精品v日韩精品| 91久久国产综合久久91精品网站| 亚洲成人影音| 欧美激情国产日韩| 亚洲乱码视频| 亚洲在线黄色| 国产精品一页| 久久成人18免费观看| 久久中文欧美| 亚洲国产一区二区三区在线播| 免费亚洲电影在线| 亚洲区第一页| 亚洲女爱视频在线| 国产农村妇女精品一区二区| 午夜久久资源| 老妇喷水一区二区三区| 在线播放日韩欧美| 免费久久精品视频| 亚洲精品在线看| 亚洲欧美国产日韩天堂区| 国产伦精品一区| 欧美在线精品免播放器视频| 国产亚洲视频在线| 久久免费视频在线| 亚洲精品国精品久久99热| 亚洲专区在线视频| 精品成人乱色一区二区| 欧美激情亚洲自拍| 香蕉久久一区二区不卡无毒影院| 久久免费国产精品| 日韩一级大片在线| 国产色产综合产在线视频| 蜜桃av综合| 亚洲综合日韩| 亚洲国产成人精品久久| 午夜精品美女自拍福到在线| 激情国产一区| 国产精品啊啊啊| 久久综合九色综合久99| 亚洲午夜精品一区二区| 欧美电影在线观看| 欧美在线亚洲在线| 99国产成+人+综合+亚洲欧美| 国产乱码精品一区二区三区五月婷 | 夜夜嗨av一区二区三区中文字幕| 欧美日韩高清区| 久久精品免费播放| 亚洲一区在线直播| 亚洲精品欧美极品| 欧美电影资源| 久久久久久一区二区三区| 亚洲一二三区精品| 99国产精品视频免费观看| 国产日韩一区二区三区在线播放 | 欧美精品尤物在线| 久久美女性网| 欧美亚洲免费| 中文有码久久| 亚洲免费成人av| 91久久精品国产91久久性色| 久久在线91| 久久免费视频在线观看| 性色av一区二区三区| 亚洲欧美999| 亚洲调教视频在线观看| 亚洲人成高清| 亚洲区免费影片| 亚洲福利视频二区| 亚洲国产高清自拍| 在线欧美视频| 亚洲国产精品悠悠久久琪琪 | 国产美女精品视频免费观看| 欧美日韩美女在线观看| 欧美日韩国产一区二区三区地区| 久久久在线视频| 久久亚洲欧美|