云計算旨在通過 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)裝有以下軟件:
深入 MapReduce 算法之前,我們將建立基本的云架構(gòu)、負(fù)載平衡、MapReduce 和并行編程 — 至少對本文這是足夠了。 圖 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)、使用該特定軟件的資格以及軟件的租賃期完成驗(yàn)證步驟。然后,服務(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):
本文使用 Randomized Hydrodynamic Load Balancing 方法,這是一種同時利用了直接和迭代方法的混合方法。 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 所示。
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):
集群中的節(jié)點(diǎn)已經(jīng)預(yù)先加載了本地輸入文件。啟動 MapReduce 進(jìn)程時,NameNode 將使用 負(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àn)閼?yīng)用程序 可能同時寫入和刪除文件) 如果對于每個數(shù)據(jù)節(jié)點(diǎn),節(jié)點(diǎn)占用空間與總?cè)萘康谋嚷剩ǚQ為節(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)移以平衡集群。模塊工作方式如下:
提供了不同的輸入文件集,每個文件集的大小不同,并在單節(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ù)載平衡在集群中更加有效 ![]() 我們的 Hadoop MapReduce 和負(fù)載平衡的實(shí)驗(yàn)可以得到兩個必然結(jié)論:
因此,在計劃在云系統(tǒng)上處理大量數(shù)據(jù)時,考慮 MapReduce 樣式并行處理和負(fù)載平衡的組合。 學(xué)習(xí)
轉(zhuǎn): http://www.ibm.com/developerworks/cn/cloud/library/cl-mapreduce/index.html |