在雲中使用 MapReduce 和負載平衡

雲計算旨在通過 Internet 提供隨需應變的資源或服務,通常視數據中心的規模和可靠性水平而定。MapReduce 是一個爲並行處理大量數據而設計的編程模型,它將工作劃分爲一個獨立任務組成的集合。它是一種並行編程,由某種功能隨需應變的雲(如 Google 的 BigTable、Hadoop 和Sector)提供支持。

在本文中,將使用遵從 Randomized Hydrodynamic Load Balancing 技術(下文將詳細介紹)的負載平衡算法。利用虛擬化來降低成本和物理服務器的實際數目;更重要的是,將使用虛擬化用來實現高效的物理計算機 CPU 利用。

要從本文獲取最多的知識,您應該大致瞭解雲計算的概念、Randomized Hydrodynamic Load Balancing 技術和 Hadoop MapReduce 編程模型。最好對並行程序設計有一個基本的瞭解,瞭解 Java™ 或其他面向對象的語言的編程知識將很有幫助。

在本文中,要實現 MapReduce 算法,系統應裝有以下軟件:

  • Hadoop 0.20.1.
  • Eclipse IDE 3.0 以上(或 Rational Application Developer 7.1)。
  • 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 函數執行搜索和索引
Map 和 Reduce 函數執行搜索和索引

如果請求的是特定的軟件,則將基於客戶租戶 ID、支付會費、使用該特定軟件的資格以及軟件的租賃期完成驗證步驟。然後,服務器爲該請求提供服務,並允許用戶使用特定的軟件組合。

在這裏提供 SaaS 的多租戶功能,單個軟件實例可以服務於多個租戶。這樣,相同的軟件映像集合會基於租戶 ID 生成不同的實例生成。

這些服務意味着,客戶端將使用 Hadoop、Eclipse 等平臺以及在搜索文件或使用某些軟件時使用的操作系統。此外,爲了存儲其數據(數據庫或文件),在雲中,客戶端將不得不佔用一些數據中心(IaaS)的內存空間。所有這些對終端用戶都是透明的。

Randomized Hydrodynamic Load Balancing:基本內容

負載平衡用來確保在使用其他資源時您現有的資源都不是空閒的。若要平衡負載分佈,可以將負載從源節點(有多餘工作負載)的遷移到相對較輕的負載目標節點

在運行時應用負載平衡時,它被稱之爲動態負載平衡— 這可以根據執行節點選擇直接實現或以迭代的方式實現:

  • 迭代的方法通過幾個迭代步驟確定最終目標節點。
  • 直接方法在一個步驟中選擇最終目標節點。

本文使用 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 集羣中有以下節點:

  • NameNode(雲主節點)。
  • DataNodes(從屬節點)。

集羣中的節點已經預先加載了本地輸入文件。啓動 MapReduce 進程時,NameNode 將使用 JobTracker 進程分配任務,它必須由 DataNodes 通過 TaskTracker 進程完成。每個 DataNode 中將運行幾個 Map 進程,中間結果會提供給合器進程,生成一臺計算機上文件的單詞計數(在 WordCount 的問題中)。值被打亂髮送到 Reduce 進程,然後生成目標問題的最終輸出。

如何使用負載平衡

負載平衡有助於在某個節點的負載超出閾值水平時,將負載平均地分散到空閒的節點。雖然在執行 MapReduce 算法時負載平衡不夠明顯,但在進行大文件處理以及硬件資源利用至關重要的時候它是非常必要的。一個顯著的作用是可以在資源緊張的情況下增加硬件利用率,提高性能。

在某些數據節點已滿或者新的空節點加入集羣時,實現一個模塊來平衡 Hadoop 分佈式文件系統集羣上的磁盤空間使用情況。達到閾值時將啓動平衡器(Class Balancer 工具);此參數是一個從 0 至 100% 的分數,默認值爲 10%。此選項爲是否平衡集羣設置目標;閾值越小,集羣越平衡,同樣,平衡器運行的時間也越長。(注:閾值可以很小到您不能平衡集羣的狀態,因爲應用程序可能同時寫入和刪除文件)

如果對於每個數據節點,節點佔用空間與總容量的比率(稱爲節點利用率)不同於集羣已用空間與總空間的比率(集羣利用率),且不超過閾值,則認爲該集羣是平衡的。

該模塊將把利用率高的數據節點的數據塊以迭代方式移動到利用率低的節點上;在每個迭代中,節點移動或接收不超過容量的閾值比例,每次迭代運行不超過 20 分鐘。

在此實現中,節點被分類爲高利用平均利用未充分利用。根據每個節點的利用額,將負載在節點之間轉移以平衡集羣。模塊工作方式如下:

  • 首選,它獲取鄰近節點詳細信息:
    1. 當 DataNode 的負載增加到閾值級別時,它將向該 NameNode 發送一個請求。
    2. NameNode 獲得特定 DataNode 最鄰近節點的負載級別信息。
    3. NameNode 比較負載,然後將有關最空閒相鄰節點的詳細信息發送到特定的 DataNode。
  • 接下來,DataNodes 開始工作:
    1. 每個 DataNode 將自己負載量與其最近節點的負載量之和進行比較。
    2. 如果 DataNode 的負載級別大於其鄰近節點,將隨機選擇那麼負載目標節點(直接相鄰的節點及其他節點) 。
    3. 然後將節點請求發送到目標節點。
  • 最後,接收請求:
    1. 每個節點將維護一個緩衝區接收負載請求。
    2. 消息傳遞接口(MPI)管理此緩衝區。
    3. 主線程會偵聽緩衝隊列,並服務其接收的請求。
    4. 節點進入負載平衡執行階段。

評估性能

提供了不同的輸入文件集,每個文件集的大小不同,並在單節點和雙節點集羣中執行 MapReduce 任務。測量相應的執行時間,我們可以得出結論,到目前爲止,在集羣中運行 MapReduce 是處理大量輸入文件更有效的方式。

圖 3 中的關係圖說明了我們在各個節點上運行的性能結果。


圖 3. MapReduce 負載平衡在集羣中更加有效
MapReduce 負載平衡在集羣中更加有效

結束語

我們的 Hadoop MapReduce 和負載平衡的實驗可以得到兩個必然結論:

  • 在雲環境中,MapReduce 結構提高了大型數據集的吞吐效率。相反,您在非雲系統中不一定能看到如此的吞吐量增加。
  • 數據集較小時,MapReduce 和負載平衡不會對雲系統吞吐量的增加產生明顯影響。

因此,在計劃在雲系統上處理大量數據時,考慮 MapReduce 樣式並行處理和負載平衡的組合。


參考資料

學習

獲得產品和技術

討論

  • My developerWorks 上的Developer Cloud 小組 關注智能業務開發和 IBM Test Cloud。

  • 通過專門專業的連接、共享、協作網絡和社區集合工具 My developerWorks 加入 developerWorks 社區(開發人員博客、小組、論壇、播客、個人簡歷、新聞組、wiki 和社區主題)。

發佈了50 篇原創文章 · 獲贊 3 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章