在云中使用 MapReduce 和负载平衡
云計算旨在通過 Internet 提供隨需應(yīng)變的資源或服務(wù),通常視數(shù)據(jù)中心的規(guī)模和可靠性水平而定。MapReduce 是一個為并行處理大量數(shù)據(jù)而設(shè)計的編程模型,它將工作劃分為一個獨(dú)立任務(wù)組成的集合。它是一種并行編程,由某種功能隨需應(yīng)變的云(如 Google 的 BigTable、Hadoop 和Sector)提供支持。
在本文中,將使用遵從 Randomized Hydrodynamic Load Balancing 技術(shù)(下文將詳細(xì)介紹)的負(fù)載平衡算法。利用虛擬化來降低成本和物理服務(wù)器的實(shí)際數(shù)目;更重要的是,將使用虛擬化用來實(shí)現(xiàn)高效的物理計算機(jī) CPU 利用。
要從本文獲取最多的知識,您應(yīng)該大致了解云計算的概念、Randomized Hydrodynamic Load Balancing 技術(shù)和 Hadoop MapReduce 編程模型。最好對并行程序設(shè)計有一個基本的了解,了解 Java? 或其他面向?qū)ο蟮恼Z言的編程知識將很有幫助。
在本文中,要實(shí)現(xiàn) MapReduce 算法,系統(tǒng)應(yīng)裝有以下軟件:
??? 1. Hadoop 0.20.1.
??? 2. Eclipse IDE 3.0 以上(或 Rational Application Developer 7.1)。
??? 3. Ubuntu 8.2 以上。
深入 MapReduce 算法之前,我們將建立基本的云架構(gòu)、負(fù)載平衡、MapReduce 和并行編程 — 至少對本文這是足夠了。
云架構(gòu):基本內(nèi)容
圖 1 顯示了完整的系統(tǒng)詳圖,包括平臺、軟件,以及如何使用它們來實(shí)現(xiàn)本文的目標(biāo)設(shè)置。
圖 1. 云架構(gòu)
您可以看到,我們使用 Ubuntu 9.04 和 8.2 作為操作系統(tǒng);平臺是 Hadoop 0.20.1、Eclipse 3.3.1 和 Sun Java 6;編程語言使用 Java;腳本語言使用 HTML、JSP 和 XML。
該云架構(gòu)有一個主節(jié)點(diǎn)和一些從屬節(jié)點(diǎn)。在該實(shí)現(xiàn)中,維護(hù)主服務(wù)器,獲取客戶端請求并根據(jù)請求的類型進(jìn)行處理。
從圖 2 中可以看到,搜索請求轉(zhuǎn)發(fā)到 Hadoop NameNode。然后,Hadoop NameNode 負(fù)責(zé)搜索和索引操作,它將啟動大量 Map 和 Reduce 進(jìn)程。完成特定的搜索關(guān)鍵字 MapReduce 操作之后,NameNode 將輸出值返回到服務(wù)器并交付客戶端。
圖 2. Map 和 Reduce 函數(shù)執(zhí)行搜索和索引
如果請求的是特定的軟件,則將基于客戶租戶 ID、支付會費(fèi)、使用該特定軟件的資格以及軟件的租賃期完成驗證步驟。然后,服務(wù)器為該請求提供服務(wù),并允許用戶使用特定的軟件組合。
在這里提供 SaaS 的多租戶功能,單個軟件實(shí)例可以服務(wù)于多個租戶。這樣,相同的軟件映像集合會基于租戶 ID 生成不同的實(shí)例生成。
這些服務(wù)意味著,客戶端將使用 Hadoop、Eclipse 等平臺以及在搜索文件或使用某些軟件時使用的操作系統(tǒng)。此外,為了存儲其數(shù)據(jù)(數(shù)據(jù)庫或文件),在云中,客戶端將不得不占用一些數(shù)據(jù)中心(IaaS)的內(nèi)存空間。所有這些對終端用戶都是透明的。
Randomized Hydrodynamic Load Balancing:基本內(nèi)容
負(fù)載平衡用來確保在使用其他資源時您現(xiàn)有的資源都不是空閑的。若要平衡負(fù)載分布,可以將負(fù)載從源節(jié)點(diǎn)(有多余工作負(fù)載)的遷移到相對較輕的負(fù)載目標(biāo)節(jié)點(diǎn)。
在運(yùn)行時應(yīng)用負(fù)載平衡時,它被稱之為動態(tài)負(fù)載平衡 — 這可以根據(jù)執(zhí)行節(jié)點(diǎn)選擇直接實(shí)現(xiàn)或以迭代的方式實(shí)現(xiàn):
??? 1.迭代的方法通過幾個迭代步驟確定最終目標(biāo)節(jié)點(diǎn)。
??? 2.直接方法在一個步驟中選擇最終目標(biāo)節(jié)點(diǎn)。
本文使用 Randomized Hydrodynamic Load Balancing 方法,這是一種同時利用了直接和迭代方法的混合方法。
MapReduce:基本內(nèi)容
MapReduce 程序用于以并行方式計算大量數(shù)據(jù)。這就需要在很多計算機(jī)之間分配工作負(fù)荷。Hadoop 提供了一種系統(tǒng)的方法來實(shí)現(xiàn)這種程序設(shè)計范式。
計算需要輸入一組鍵/值對,生成一組輸出鍵/值對。計算涉及的兩個基本操作:Map 和 Reduce。
用戶編寫的 Map 操作需要輸入并生成一組中間鍵/值對。MapReduce 庫將所有與同一中間鍵 #1 相關(guān)聯(lián)的中間值組合到一起,并且將它們傳遞給 Reduce 功能。
同樣是用戶編寫的 Reduce 函數(shù)接受一個中間鍵 #1 和該鍵的一組值。它將這些值合并形成可能較小的一組值。通常每次 Reduce 調(diào)用只生成一個輸出值 0 或 1。中間值通過迭代器(一種可以讓程序員遍歷所有集合元素的對象,忽略其具體的實(shí)現(xiàn))提供給用戶的 Reduce 函數(shù)。這樣,您就可以處理太大而無法放入內(nèi)存的值列表。
以 WordCount 問題為例。即計算大文件集中的每個單詞的匹配次數(shù)。Mapper 和 Reducer 函數(shù)如代碼清單 1 所示。
清單 1. 解決 WordCount 問題的 Map 和 Reduce
| ? mapper (filename, file-contents): ? for each word in file-contents: ??? emit (word, 1) reducer (word, values): ? sum = 0 ? for each value in values: ??? sum = sum + value ? emit (word, sum) |
Map 函數(shù)發(fā)出每個單詞附有一個相關(guān)的出現(xiàn)次數(shù)計數(shù)。Reduce 函數(shù)對發(fā)出的特定單詞計數(shù)求和。這個基本的功能如果構(gòu)建在集群之上,就可以很容易轉(zhuǎn)變?yōu)楦咚俨⑿刑幚硐到y(tǒng)。
對之前完成的大量數(shù)據(jù)執(zhí)行計算,這些數(shù)據(jù)通常在分布式環(huán)境中。Hadoop 的獨(dú)特之處在于它簡單的編程模式 — 使用戶可以快速編寫和測試分布式系統(tǒng) — 以及它的高效、自動分配數(shù)據(jù)和跨計算機(jī)處理,進(jìn)而能夠利用 CPU 內(nèi)核的底層并行度。
讓我們理清思路。前文已經(jīng)討論過,Hadoop 集群中有以下節(jié)點(diǎn):
??? 1.NameNode(云主節(jié)點(diǎn))。
??? 2.DataNodes(從屬節(jié)點(diǎn))。
集群中的節(jié)點(diǎn)已經(jīng)預(yù)先加載了本地輸入文件。啟動 MapReduce 進(jìn)程時,NameNode 將使用 JobTracker 進(jìn)程分配任務(wù),它必須由 DataNodes 通過 TaskTracker 進(jìn)程完成。每個 DataNode 中將運(yùn)行幾個 Map 進(jìn)程,中間結(jié)果會提供給合器進(jìn)程,生成一臺計算機(jī)上文件的單詞計數(shù)(在 WordCount 的問題中)。值被打亂發(fā)送到 Reduce 進(jìn)程,然后生成目標(biāo)問題的最終輸出。
如何使用負(fù)載平衡
負(fù)載平衡有助于在某個節(jié)點(diǎn)的負(fù)載超出閾值水平時,將負(fù)載平均地分散到空閑的節(jié)點(diǎn)。雖然在執(zhí)行 MapReduce 算法時負(fù)載平衡不夠明顯,但在進(jìn)行大文件處理以及硬件資源利用至關(guān)重要的時候它是非常必要的。一個顯著的作用是可以在資源緊張的情況下增加硬件利用率,提高性能。
在某些數(shù)據(jù)節(jié)點(diǎn)已滿或者新的空節(jié)點(diǎn)加入集群時,實(shí)現(xiàn)一個模塊來平衡 Hadoop 分布式文件系統(tǒng)集群上的磁盤空間使用情況。達(dá)到閾值時將啟動平衡器(Class Balancer 工具);此參數(shù)是一個從 0 至 100% 的分?jǐn)?shù),默認(rèn)值為 10%。此選項為是否平衡集群設(shè)置目標(biāo);閾值越小,集群越平衡,同樣,平衡器運(yùn)行的時間也越長。(注:閾值可以很小到您不能平衡集群的狀態(tài),因為應(yīng)用程序可能同時寫入和刪除文件)
如果對于每個數(shù)據(jù)節(jié)點(diǎn),節(jié)點(diǎn)占用空間與總?cè)萘康谋嚷?#xff08;稱為節(jié)點(diǎn)利用率)不同于集群已用空間與總空間的比率(集群利用率),且不超過閾值,則認(rèn)為該集群是平衡的。
該模塊將把利用率高的數(shù)據(jù)節(jié)點(diǎn)的數(shù)據(jù)塊以迭代方式移動到利用率低的節(jié)點(diǎn)上;在每個迭代中,節(jié)點(diǎn)移動或接收不超過容量的閾值比例,每次迭代運(yùn)行不超過 20 分鐘。
在此實(shí)現(xiàn)中,節(jié)點(diǎn)被分類為高利用、平均利用 和未充分利用。根據(jù)每個節(jié)點(diǎn)的利用額,將負(fù)載在節(jié)點(diǎn)之間轉(zhuǎn)移以平衡集群。模塊工作方式如下:
??? 1. 首選,它獲取鄰近節(jié)點(diǎn)詳細(xì)信息:
???????? 1. 當(dāng) DataNode 的負(fù)載增加到閾值級別時,它將向該 NameNode 發(fā)送一個請求。
???????? 2. NameNode 獲得特定 DataNode 最鄰近節(jié)點(diǎn)的負(fù)載級別信息。
???????? 3. NameNode 比較負(fù)載,然后將有關(guān)最空閑相鄰節(jié)點(diǎn)的詳細(xì)信息發(fā)送到特定的 DataNode。
??? 2. 接下來,DataNodes 開始工作:
???????? 1. 每個 DataNode 將自己負(fù)載量與其最近節(jié)點(diǎn)的負(fù)載量之和進(jìn)行比較。
???????? 2. 如果 DataNode 的負(fù)載級別大于其鄰近節(jié)點(diǎn),將隨機(jī)選擇那么負(fù)載目標(biāo)節(jié)點(diǎn)(直接相鄰的節(jié)點(diǎn)及其他節(jié)點(diǎn)) 。
???????? 3. 然后將節(jié)點(diǎn)請求發(fā)送到目標(biāo)節(jié)點(diǎn)。
??? 3. 最后,接收請求:
???????? 1. 每個節(jié)點(diǎn)將維護(hù)一個緩沖區(qū)接收負(fù)載請求。
???????? 2. 消息傳遞接口(MPI)管理此緩沖區(qū)。
???????? 3. 主線程會偵聽緩沖隊列,并服務(wù)其接收的請求。
???????? 4. 節(jié)點(diǎn)進(jìn)入負(fù)載平衡執(zhí)行階段。
評估性能
提供了不同的輸入文件集,每個文件集的大小不同,并在單節(jié)點(diǎn)和雙節(jié)點(diǎn)集群中執(zhí)行 MapReduce 任務(wù)。測量相應(yīng)的執(zhí)行時間,我們可以得出結(jié)論,到目前為止,在集群中運(yùn)行 MapReduce 是處理大量輸入文件更有效的方式。
圖 3 中的關(guān)系圖說明了我們在各個節(jié)點(diǎn)上運(yùn)行的性能結(jié)果。
圖 3. MapReduce 負(fù)載平衡在集群中更加有效
結(jié)束語
我們的 Hadoop MapReduce 和負(fù)載平衡的實(shí)驗可以得到兩個必然結(jié)論:
??? 1.在云環(huán)境中,MapReduce 結(jié)構(gòu)提高了大型數(shù)據(jù)集的吞吐效率。相反,您在非云系統(tǒng)中不一定能看到如此的吞吐量增加。
??? 2.數(shù)據(jù)集較小時,MapReduce 和負(fù)載平衡不會對云系統(tǒng)吞吐量的增加產(chǎn)生明顯影響。
因此,在計劃在云系統(tǒng)上處理大量數(shù)據(jù)時,考慮 MapReduce 樣式并行處理和負(fù)載平衡的組合。
總結(jié)
以上是生活随笔為你收集整理的在云中使用 MapReduce 和负载平衡的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: request.getRealPath不
- 下一篇: 协议分析---笔记