泰州做直銷會員結(jié)算管理網(wǎng)站公司網(wǎng)站如何推廣
一、引入:詞頻統(tǒng)計問題
假如我們有一億份文檔,需要統(tǒng)計這一億份文檔的詞頻。我們會怎么做,有以下思路
- 使用單臺PC執(zhí)行:能不能存的下不說,串行計算,一份一份文檔讀,然后進行詞頻統(tǒng)計,需要運行很長時間
- 多臺PC:把文檔分布到多臺PC上處理,每個PC處理一部分文件,最后合并?!犉饋砗芎唵?#xff0c;但是實際實現(xiàn)的話還是有很多問題的。
對于第二種方法,有以下幾種方法,我們來分別分析一下:
可以看到,我們把數(shù)據(jù)分布到多臺主機上,然后讓每臺主機并行掃描文檔,將讀取到的單詞發(fā)送給一臺中央主機,由中央主機統(tǒng)一進行詞頻統(tǒng)計。
這樣有哪些問題:
- 小粒度通信->網(wǎng)絡(luò)通信瓶頸:所有子PC分別將一個個單詞(超級無敵多)通過網(wǎng)絡(luò)同時發(fā)送 給一臺中央主機, 必定造成網(wǎng)絡(luò)IO通信堵塞
- 中央主機的負載過重: 雖然數(shù)據(jù)分布到了多臺子PC上進行掃描讀取處理,的確和之前的單臺PC相比(一個一個文檔依次往后讀)能節(jié)約時間,但是處理時間其實還是差不多的。
- 缺乏容錯機制: 在這種單中央主機的設(shè)計思想下,一旦子PC中有一臺出錯,必定導(dǎo)致整個結(jié)果錯誤。
- 數(shù)據(jù)一致性和同步問題: 你想一想,像上圖,多個子PC同時對比如
dog
這個單詞進行寫入,這是一個并發(fā)操作,必須要加鎖保證數(shù)據(jù)一致性。 - 擴展性問題: 隨著數(shù)據(jù)量的增加,中央主機處理的數(shù)據(jù)量和計算負載也會線性增長,最終可能超過中央主機的處理能力。擴展系統(tǒng)可能需要更換更強大的中央主機,這不僅成本高昂,而且存在物理限制。
OK,我們先別一下子跳到MapReduce,看看基于上面這個方法我們還能怎么改進:
其實說實話這個基本上沒啥改善,就是改了一下單臺PC自己在發(fā)送詞頻之前先做了個預(yù)處理統(tǒng)計,這樣能夠稍微漸緩一下網(wǎng)絡(luò)IO,但是其實還是沒啥用。
那么還有什么其他可以改善的地方的嗎?
沒錯,上面不是說主機壓力太大了嗎?那么我們現(xiàn)在一個主機就處理一個單詞,這樣OK了把?其實還是有問題的,或者說帶來了新的問題:
- 網(wǎng)絡(luò)通信問題:這樣一個個單詞發(fā),或者統(tǒng)計好了(也就是先做計算嘛)(其實很多時候不能先做計算,比如算整體學(xué)生的最大成績差)再發(fā),還是通信粒度太小了
- 負載不均衡:一些常見的單詞(如“the”、“is”等)可能會導(dǎo)致某些主機負載過重,而其他主機負載輕松。
- 擴展性問題: 你看,我現(xiàn)在統(tǒng)計單詞,那我統(tǒng)計漢字呢?計算主機的數(shù)量是不是需要改變??可擴展性還是很差的
其實在實現(xiàn)上還有很多細節(jié)問題:
- 數(shù)據(jù)怎么分呢?人工?手動分割數(shù)據(jù)并分配給多臺機器處理,這個過程不僅繁瑣而且難以管理和擴展。
- 開發(fā)者需要手動管理數(shù)據(jù)的分發(fā)、任務(wù)的執(zhí)行、結(jié)果的匯總以及故障的處理等,這不僅增加了編程的復(fù)雜性,也增加了出錯的幾率。
- 處理分布式數(shù)據(jù)需要開發(fā)者對分布式系統(tǒng)的底層細節(jié)有深入的了解,如數(shù)據(jù)分布、通信機制、容錯機制等
下面我們來看看MapReduce的思想,看看它是如何解決了這些問題,在這之中也可以看到:數(shù)據(jù)結(jié)構(gòu)、算法、數(shù)學(xué)等知識的融合。
二、MapReduce介紹
2.1:設(shè)計思想
MapReduce的算法核心思想是: 分治
學(xué)過算法的同學(xué)應(yīng)該會學(xué)到分治算法,所謂分治,就是把原問題分解為規(guī)模更小的問題,進行處理,最后將這些子問題的結(jié)果合并,就可以得到原問題的解。MapReduce這種分布式計算框架的核心就是:分治。
上圖是MapReduce的處理流程圖,可以看到,MapReduce的整個過程主要分為:
-
Map:
- 輸入:來自存儲在hdfs上的文件block進行分塊(split)后,并且進行讀取數(shù)據(jù)處理的分塊數(shù)據(jù)的鍵值對(key-value)形式?!?輸入數(shù)據(jù)被分成一系列的數(shù)據(jù)塊,被稱為“input splits”。MapReduce框架盡量保持每個split的大小相同,這樣每個Map任務(wù)處理的數(shù)據(jù)量就大致相等。這是負載均衡的第一步。
- 輸出:進行掃描后的(單詞,詞頻)的鍵值對形式
- 分析:Map任務(wù)通常在存儲相應(yīng)數(shù)據(jù)分片的節(jié)點上執(zhí)行,這樣可以減少網(wǎng)絡(luò)傳輸。如果某些節(jié)點因為硬件性能好或者當前負載輕而完成任務(wù)更快,MapReduce可以把新的Map任務(wù)分配給這些節(jié)點,從而提高資源的利用率。MapReduce框架會自動管理數(shù)據(jù)的分片和分發(fā),無需用戶手動干預(yù),從而提高數(shù)據(jù)分發(fā)效率。
-
Shuffle與Sort階段
- 處理完數(shù)據(jù)后,Map任務(wù)的輸出會進入Shuffle階段。在這個階段,框架負責將所有Map任務(wù)輸出的鍵值對根據(jù)鍵進行排序和分組(還有combine,根據(jù)項目需要可選,減少網(wǎng)絡(luò)io)。只有排序和分組后的數(shù)據(jù)會被發(fā)送到Reduce任務(wù),這減少了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,從而緩解網(wǎng)絡(luò)通信瓶頸,同時,由于
shuffle
階段對所有的Map任務(wù)進行了排序和分組,也就是說,一組數(shù)據(jù)只分發(fā)給一個reduce,這樣也不會來自多個map對同一個reduce同時寫入的并發(fā),即消除了并發(fā)風(fēng)險,保證了數(shù)據(jù)一致性。
- 處理完數(shù)據(jù)后,Map任務(wù)的輸出會進入Shuffle階段。在這個階段,框架負責將所有Map任務(wù)輸出的鍵值對根據(jù)鍵進行排序和分組(還有combine,根據(jù)項目需要可選,減少網(wǎng)絡(luò)io)。只有排序和分組后的數(shù)據(jù)會被發(fā)送到Reduce任務(wù),這減少了網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù)量,從而緩解網(wǎng)絡(luò)通信瓶頸,同時,由于
-
Reduce任務(wù)的智能分配
- Reduce任務(wù)是根據(jù)Map階段的輸出鍵值對自動分配(默認是哈希,可以手寫更優(yōu)的分配算法)的。MapReduce嘗試均勻地分配負載,確保每個Reduce任務(wù)處理相似數(shù)量的鍵值對。如果某個Reduce任務(wù)處理得更快,它可以接受更多的數(shù)據(jù),從而實現(xiàn)動態(tài)的負載均衡。
從上面這個處理流程可以看出,MapReduce還有很多其他優(yōu)點:
- 容錯機制(解決容錯和恢復(fù)機制問題)
MapReduce具備強大的容錯機制。如果一個Map或Reduce任務(wù)失敗,框架會自動在另一個節(jié)點上重新調(diào)度這個任務(wù)。此外,中間數(shù)據(jù)會被寫入磁盤,這允許在節(jié)點故障后從最后一個檢查點恢復(fù),而不是從頭開始。 - 水平擴展(解決擴展性問題)
MapReduce支持水平擴展。當數(shù)據(jù)量增加時,可以簡單地增加更多的節(jié)點到集群中。MapReduce框架會自動利用這些新節(jié)點,無需對現(xiàn)有的應(yīng)用程序做任何修改,這使得擴展性得到了極大的提高。
2.2:設(shè)計理念:移動計算而非移動數(shù)據(jù)
其實在開篇講到的三種分布式計算統(tǒng)計詞頻的方法中,它們的想法核心都是移動數(shù)據(jù),把數(shù)據(jù)移動到中央主機進行計算,這樣帶來很明顯的問題:網(wǎng)絡(luò)IO,帶寬。
而MapReduce, 它將計算任務(wù)(Map和Reduce操作)分布到存儲實際數(shù)據(jù)的節(jié)點上,這樣就可以在數(shù)據(jù)存儲的地方直接進行計算。這種方法減少了大量數(shù)據(jù)在網(wǎng)絡(luò)中的移動,因為只有中間結(jié)果和最終結(jié)果需要在節(jié)點之間傳輸,這些比原始數(shù)據(jù)小得多。
這種做法不僅提高了網(wǎng)絡(luò)傳輸?shù)男?/strong>,也增強了系統(tǒng)的容錯性。因為MapReduce框架會將Map任務(wù)的輸出寫入磁盤(中間結(jié)果),在發(fā)生故障時,可以從這些已經(jīng)寫入磁盤的中間結(jié)果恢復(fù),而不需要從頭開始處理數(shù)據(jù)。這意味著即使在節(jié)點失敗的情況下,作業(yè)的執(zhí)行仍然可以繼續(xù),從而保證了計算的連續(xù)性和完整性。
總結(jié)來說,MapReduce通過**“移動計算而非移動數(shù)據(jù)”**的設(shè)計理念,有效地解決了傳統(tǒng)分布式計算方法中的網(wǎng)絡(luò)效率和容錯性問題。