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