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

統計

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

留言簿(6)

隨筆分類

文章分類

Link

搜索

  •  

積分與排名

  • 積分 - 167186
  • 排名 - 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


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久久一区| 久久久久久一区二区| 欧美视频在线观看一区二区| 猫咪成人在线观看| 免费成人高清视频| 男女精品网站| 欧美r片在线| 欧美成人情趣视频| 国产精品国产三级国产普通话三级 | 国产精品av久久久久久麻豆网| 欧美日韩国产精品自在自线| 欧美日韩在线精品| 国产精品久久亚洲7777| 国产有码在线一区二区视频| 国产在线精品二区| 最新亚洲一区| 亚洲一级二级在线| 久热这里只精品99re8久| 欧美成人精品在线视频| 亚洲日本免费电影| 亚洲激情不卡| 亚洲免费综合| 免费观看不卡av| 国产精品久久久久9999| 国内精品久久久久久久果冻传媒| 亚洲人成人77777线观看| 一本色道久久综合亚洲精品不| 欧美一区高清| 亚洲老司机av| 久久爱www| 欧美日本中文| 国产主播一区二区三区四区| 99国产精品99久久久久久粉嫩| 欧美中文在线观看国产| 欧美不卡一区| 亚洲欧美日韩国产成人精品影院| 嫩草影视亚洲| 国内精品伊人久久久久av影院| 亚洲美女黄网| 免费久久99精品国产自| 亚洲一区二区三区在线看| 免费看亚洲片| 国内自拍亚洲| 欧美中文字幕在线视频| 亚洲精品日韩综合观看成人91| 亚洲精品视频在线观看免费| 亚洲美女网站| 久久综合九色99| 在线一区观看| 免费永久网站黄欧美| 国产欧美一区二区精品婷婷 | 裸体一区二区| 亚洲天堂久久| 欧美日韩视频一区二区| 91久久久久久| 久久躁日日躁aaaaxxxx| 亚洲一区二区三区在线看| 欧美另类视频| 亚洲人成在线播放| 亚洲第一精品夜夜躁人人躁| 欧美一区二区在线看| 国产日韩欧美在线播放不卡| 欧美一区二区三区精品电影| 亚洲一区二区精品| 欧美视频日韩视频| 中日韩美女免费视频网址在线观看 | 午夜欧美精品久久久久久久| 欧美色道久久88综合亚洲精品| av成人福利| aa级大片欧美三级| 欧美日韩免费观看一区三区| 一区二区三区精品视频在线观看 | 亚洲一区二区影院| 一本大道久久a久久精二百| 欧美日韩亚洲视频一区| 亚洲一区二区3| 亚洲一区欧美一区| 国产精品久久久久久av下载红粉 | 亚洲国产成人av在线| 欧美成人第一页| 农夫在线精品视频免费观看| 亚洲伦理在线观看| 亚洲美女电影在线| 国产精品午夜在线| 久久婷婷国产综合国色天香| 久久精品国产96久久久香蕉| 亚洲激情成人网| 日韩性生活视频| 欧美日韩一区二区三区在线视频| 香港久久久电影| 老牛影视一区二区三区| 亚洲精品中文字| 99视频热这里只有精品免费| 国产精品久久久久av免费| 亚洲天堂av在线免费| 久久青草福利网站| 亚洲最新视频在线| 午夜精品久久久久影视| 国内成人精品2018免费看| 亚洲春色另类小说| 国产精品久久久久99| 久久久久成人网| 欧美片在线观看| 久久电影一区| 欧美另类女人| 久久精品青青大伊人av| 欧美大片专区| 久久久99精品免费观看不卡| 欧美精品18+| 老色鬼精品视频在线观看播放| 欧美日韩国产成人在线免费| 欧美专区中文字幕| 欧美日韩国产在线| 欧美成人免费全部观看天天性色| 欧美日韩三级| 欧美www视频| 国产精自产拍久久久久久| 欧美激情1区2区| 国产一区二区精品久久91| 日韩一本二本av| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲午夜伦理| 亚洲午夜精品国产| 麻豆av一区二区三区| 久久九九热免费视频| 国产精品久久久久国产精品日日| 亚洲日本国产| 99热免费精品| 欧美国产亚洲视频| 欧美mv日韩mv亚洲| 国模私拍一区二区三区| 亚洲一区欧美一区| 午夜国产精品视频| 欧美日韩在线免费观看| 欧美激情 亚洲a∨综合| 亚洲成人在线观看视频| 久久看片网站| 老司机精品视频网站| 极品尤物久久久av免费看| 欧美一级夜夜爽| 久久视频在线免费观看| 国产美女诱惑一区二区| 亚洲综合成人婷婷小说| 亚洲综合色婷婷| 国产精品日产欧美久久久久| 亚洲视频香蕉人妖| 午夜伦欧美伦电影理论片| 欧美性片在线观看| 亚洲一级一区| 久久www成人_看片免费不卡| 国产精品中文在线| 久久精品国产99| 欧美α欧美αv大片| 亚洲日本成人网| 欧美日韩精品欧美日韩精品 | 亚洲一区二区毛片| 欧美一级视频免费在线观看| 国产精品一页| 久久精品在线观看| 欧美国产日韩亚洲一区| 久热精品视频| 亚洲乱码视频| 欧美午夜电影在线| 午夜精品免费在线| 美女日韩在线中文字幕| 亚洲国产欧美日韩| 欧美日韩精品一区二区三区四区| 中文一区二区| 美脚丝袜一区二区三区在线观看| 亚洲激情电影中文字幕| 欧美紧缚bdsm在线视频| 午夜精品网站| 亚洲区在线播放| 欧美一级视频| 9i看片成人免费高清| 国产精品一区二区在线观看| 久久久久久**毛片大全| 日韩特黄影片| 久久九九热免费视频| 亚洲免费观看在线观看| 国产视频综合在线| 欧美承认网站| 欧美在线播放一区二区| 亚洲精品国产日韩| 久久久99精品免费观看不卡| 日韩亚洲综合在线| 国内精品久久久| 欧美视频免费在线观看| 久久午夜精品一区二区| 日韩午夜在线| 欧美激情中文字幕在线| 欧美综合国产精品久久丁香| 亚洲国产精品女人久久久| 国产精品一区二区三区成人| 欧美aaa级| 久久精品人人做人人爽| 亚洲一区二区三区精品动漫| 亚洲黄色一区| 欧美黄色大片网站| 免费观看在线综合色|