使用 Linux 和 Hadoop 進行分散式運算

來源:互聯網
上載者:User

人 們每天都依賴搜尋引擎以從 Internet 的海量資料中找到特定的內容,但您曾經想過這些搜尋是如何執行的嗎?一種方法是 Apache 的 Hadoop,它是一個能夠對海量資料進行分散式處理的軟體架構。Hadoop 的一個應用是並行索引 Internet Web 頁面。Hadoop 是一個受到 Yahoo!、Google 和 IBM 等公司支援的 Apache 項目。 本文將介紹 Hadoop 架構,並展示它為什麼是最重要的基於 Linux 的分散式運算架構之一。

Hadoop 由 Apache Software Foundation 公司於 2005 年秋天作為 Lucene 的子項目 Nutch 的一部分正式引入。它受到最先由 Google Lab 開發的 MapReduce 和 Google File System 的啟發。2006 年 3 月份,MapReduce 和 Nutch Distributed File System (NDFS) 分別被納入稱為 Hadoop 的項目中。

Hadoop 是最受歡迎的在 Internet 上對搜尋索引鍵進行內容分類的工具,但它也可以解決許多要求極大伸縮性的問題。例如,如果您要 grep 一個 10TB 的巨型檔案,會出現什麼情況?在傳統的系統上,這將需要很長的時間。但是 Hadoop 在設計時就考慮到這些問題,因此能大大提高效率。

先決條件

Hadoop 是一個能夠對大量資料進行分散式處理的軟體架構。但是 Hadoop 是以一種可靠、高效、可伸縮的方式進行處理的。Hadoop 是可靠的,因為它假設計算元素和儲存會失敗,因此它維護多個工作資料副本,確保能夠針對失敗的節點重新分配處理。Hadoop 是高效的,因為它以並行的方式工作,通過平行處理加快處理速度。Hadoop 還是可伸縮的,能夠處理 PB 級資料。此外,Hadoop 依賴於社區伺服器,因此它的成本比較低,任何人都可以使用。

您可能已經想到,Hadoop 運行在 Linux 生產平台上是非常理想的,因為它帶有用 Java 語言編寫的架構。Hadoop 上的應用程式也可以使用其他語言編寫,比如 C++。


Hadoop 架構

Hadoop 有許多元素構成。最底部是 Hadoop Distributed File System(HDFS),它儲存 Hadoop 叢集中所有儲存節點上的檔案。HDFS(對於本文)的上一層是 MapReduce 引擎,該引擎由 JobTrackers 和 TaskTrackers 組成。



HDFS

對外部客戶機而言,HDFS 就像一個傳統的分級檔案系統。可以建立、刪除、移動或重新命名檔案,等等。但是 HDFS 的架構是基於一組特定的節點構建的(參見圖 1),這是由它自身的特點決定的。這些節點包括 NameNode(僅一個),它在 HDFS 內部提供中繼資料服務;DataNode,它為 HDFS 提供儲存塊。由於僅存在一個 NameNode,因此這是 HDFS 的一個缺點(單點失敗)。

圖 1. Hadoop 叢集的簡化視圖
 

存 儲在 HDFS 中的檔案被分成塊,然後將這些塊複製到多個電腦中(DataNode)。這與傳統的 RAID 架構大不相同。塊的大小(通常為 64MB)和複製的塊數量在建立檔案時由客戶機決定。NameNode 可以控制所有檔案操作。HDFS 內部的所有通訊都基於標準的 TCP/IP 協議。

NameNode

NameNode 是一個通常在 HDFS 執行個體中的單獨機器上啟動並執行軟體。它負責管理檔案系統名稱空間和控制外部客戶機的訪問。NameNode 決定是否將檔案對應到 DataNode 上的複製塊上。對於最常見的 3 個複製塊,第一個複製Block Storage在同一機架的不同節點上,最後一個複製Block Storage在不同機架的某個節點上。注意,這裡需要您瞭解叢集架構。

實 際的 I/O 事務並沒有經過 NameNode,只有表示 DataNode 和塊的檔案對應的中繼資料經過 NameNode。當外部客戶機發送請求要求建立檔案時,NameNode 會以塊標識和該塊的第一個副本的 DataNode IP 地址作為響應。這個 NameNode 還會通知其他將要接收該塊的副本的 DataNode。

NameNode 在一個稱為 FsImage 的檔案中儲存所有關於檔案系統名稱空間的資訊。這個檔案和一個包含所有事務的記錄檔案(這裡是 EditLog)將儲存在 NameNode 的本地檔案系統上。FsImage 和 EditLog 檔案也需要複製副本,以防檔案損壞或 NameNode 系統丟失。

DataNode

NameNode 也是一個通常在 HDFS 執行個體中的單獨機器上啟動並執行軟體。Hadoop 叢集包含一個 NameNode 和大量 DataNode。DataNode 通常以機架的形式組織,機架通過一個交換器將所有系統串連起來。Hadoop 的一個假設是:機架內部節點之間的傳輸速度快於機架間節點的傳輸速度。

DataNode 響應來自 HDFS 客戶機的讀寫請求。它們還響應建立、刪除和複製來自 NameNode 的塊的命令。NameNode 依賴來自每個 DataNode 的定期心跳(heartbeat)訊息。每條訊息都包含一個塊報告,NameNode 可以根據這個報告驗證區塊對應和其他檔案系統中繼資料。如果 DataNode 不能發送心跳訊息,NameNode 將採取修複措施,重新複製在該節點上丟失的塊。

檔案操作

可 見,HDFS 並不是一個萬能的檔案系統。它的主要目的是支援以流的形式訪問寫入的大型檔案。如果客戶機想將檔案寫到 HDFS 上,首先需要將該檔案快取到本地的臨時儲存。如果緩衝的資料大於所需的 HDFS 塊大小,建立檔案的請求將發送給 NameNode。NameNode 將以 DataNode 標識和目標塊響應客戶機。同時也通知將要儲存檔案塊副本的 DataNode。當客戶機開始將臨時檔案發送給第一個 DataNode 時,將立即通過管道方式將塊內容轉寄給副本 DataNode。客戶機也負責建立儲存在相同 HDFS 名稱空間中的校正和(checksum)檔案。在最後的檔案塊發送之後,NameNode 將檔案建立提交到它的持久化中繼資料存放區(在 EditLog 和 FsImage 檔案)。

Linux 叢集

Hadoop 架構可在單一的 Linux 平台上使用(開發和調試時),但是使用存放在機架上的商務服務器才能發揮它的力量。這些機架組成一個 Hadoop 叢集。它通過叢集拓撲知識決定如何在整個叢集中分配作業和檔案。Hadoop 假定節點可能失敗,因此採用本機方法處理單個電腦甚至所有機架的失敗。



Hadoop 應用程式

Hadoop 的最常見用法之一是 Web 搜尋。雖然它不是惟一的軟體架構應用程式,但作為一個並行資料處理引擎,它的表現非常突出。Hadoop 最有趣的方面之一是 Map and Reduce 流程,它受到 Google 開發的啟發。這個流程稱為建立索引,它將 Web 爬行器檢索到的文本 Web 頁面作為輸入,並且將這些頁面上的單詞的頻率報告作為結果。然後可以在整個 Web 搜尋過程中使用這個結果從已定義的搜尋參數中識別內容。

MapReduce

最 簡單的 MapReduce 應用程式至少包含 3 個部分:一個 Map 函數、一個 Reduce 函數和一個 main 函數。main 函數將作業控制和檔案輸入/輸出結合起來。在這點上,Hadoop 提供了大量的介面和抽象類別,從而為 Hadoop 應用程式開發人員提供許多工具,可用於調試和效能度量等。

MapReduce 本身就是用於平行處理大資料集的軟體架構。MapReduce 的根源是函數性編程中的 map 和 reduce 函 數。它由兩個可能包含有許多執行個體(許多 Map 和 Reduce)的操作組成。Map 函數接受一組資料並將其轉換為一個鍵/值對列表,輸入欄位中的每個元素對應一個鍵/值對。Reduce 函數接受 Map 函數產生的列表,然後根據它們的鍵(為每個鍵產生一個鍵/值對)縮小鍵/值對列表。

這裡提供一個樣本,協助您理解它。假設輸入欄位是 one small step for man, one giant leap for mankind。在這個域上運行 Map 函數將得出以下的鍵/值對列表:

(one, 1)  (small, 1)  (step, 1)  (for, 1)  (man, 1)
(one, 1) (giant, 1) (leap, 1) (for, 1) (mankind, 1)

如果對這個鍵/值對列表應用 Reduce 函數,將得到以下一組鍵/值對:

(one, 2)    (small, 1)  (step, 1)     (for, 2)  (man, 1)
(giant, 1) (leap, 1) (mankind, 1)

結果是對輸入欄位中的單詞進行計數,這無疑對處理索引十分有用。但是,現在假設有兩個輸入欄位,第一個是 one small step for man,第二個是 one giant leap for mankind。 您可以在每個域上執行 Map 函數和 Reduce 函數,然後將這兩個鍵/值對列表應用到另一個 Reduce 函數,這時得到與前面一樣的結果。換句話說,可以在輸入欄位並行使用相同的操作,得到的結果是一樣的,但速度更快。這便是 MapReduce 的威力;它的並行功能可在任意數量的系統上使用。圖 2 以區段和迭代的形式示範這種思想。

圖 2. MapReduce 流程的概念流 
 

現 在回到 Hadoop 上,它是如何?這個功能的?一個代表客戶機在單個主系統上啟動的 MapReduce 應用程式稱為 JobTracker。類似於 NameNode,它是 Hadoop 叢集中惟一負責控制 MapReduce 應用程式的系統。在應用程式提交之後,將提供包含在 HDFS 中的輸入和輸出目錄。JobTracker 使用檔案塊資訊(物理量和位置)確定如何建立其他 TaskTracker 從屬任務。MapReduce 應用程式被複製到每個出現輸入檔案塊的節點。將為特定節點上的每個檔案塊建立一個惟一的從屬任務。每個 TaskTracker 將狀態和完成資訊報告給 JobTracker。圖 3 顯示一個樣本叢集中的工作分布。

圖 3. 顯示處理和儲存的物理分布的 Hadoop 叢集 
 

Hadoop 的這個特點非常重要,因為它並沒有將儲存移動到某個位置以供處理,而是將處理移動到儲存。這通過根據叢集中的節點數調節處理,因此支援高效的資料處理。



Hadoop 的其他應用程式

Hadoop 是一個用於開發分布式應用程式的多功能架構;從不同的角度看待問題是充分利用 Hadoop 的好方法。回顧一下 圖 2,那個流程以階梯函數的形式出現,其中一個組件使用另一個組件的結果。當然,它不是萬能的開發工具,但如果碰到的問題屬於這種情況,那麼可以選擇使用 Hadoop。

Hadoop 一直協助解決各種問題,包括超大型資料集的排序和大檔案的搜尋。它還是各種搜尋引擎的核心,比如 Amazon 的 A9 和用於尋找酒資訊的 Able Grape 垂直搜尋引擎。Hadoop Wiki 提供了一個包含大量應用程式和公司的列表,這些應用程式和公司通過各種方式使用 Hadoop(參見 參考資料)。

當 前,Yahoo! 擁有最大的 Hadoop Linux 生產架構,共由 10,000 多個核心組成,有超過 5PB 位元組的儲存分布到各個 DataNode。在它們的 Web 索引內部差不多有一萬億個連結。不過您可能不需要那麼大型的系統,如果是這樣的話,您可以使用 Amazon Elastic Compute Cloud (EC2) 構建一個包含 20 個節點的虛擬叢集。事實上,紐約時報 使用 Hadoop 和 EC2 在 36 個小時內將 4TB 的 TIFF 映像 — 包括 405K 大 TIFF 映像,3.3M SGML 文章和 405K XML 檔案 — 轉換為 800K 適合在 Web 上使用的 PNG 映像。這種處理稱為雲端運算,它是一種展示 Hadoop 的威力的獨特方式。




結束語

毫無疑問,Hadoop 正在變得越來越強大。從使用它的應用程式看,它的前途是光明的。您可以從 參考資料 小節更多地瞭解 Hadoop 及其應用程式,包括設定您自己的 Hadoop 叢集的建議。

參考資料

學習

  • 您可以參閱本文在 developerWorks 全球網站上的 英文原文。

  • Hadoop core Web 網站是學習 Hadoop 的最好資源。在這裡可以找到最新的文檔、快速入門手冊、教程和設定叢集配置的詳細資料等。您還可以找到關於在 Hadoop 架構上進行開發的詳細API(API)文檔。 
  • Hadoop DFS User Guide 介紹了 HDFS 及其相關組件。 
  • Yahoo! 在 2008 年年初為其搜尋引擎啟動了公認的 最大 Hadoop 叢集。這個 Hadoop 叢集由 10,000 多個核心組成,提供超過 5PB(相當於 5000,000 千MB)的原始磁碟儲存。 
  • “Hadoop: Funny Name, Powerful Software”(LinuxInsider,2008 年 11 月)是一篇關於 Hadoop 的優秀文章,其中包含採訪 Doug Cutting 的內容,他是 Hadoop 的創始人。本文還討論了紐約時報 結合使用 Hadoop 和 Amazon 的 EC2 進行大量映像轉換。 
  • Hadoop 非常適合在雲端運算環境中使用。要瞭解關於雲端運算的更多資訊,請查看 “Linux 上的雲端運算”(developerWorks,2008 年 9 月)。 
  • 通過 Hadoop Wiki PoweredBy 頁面可以看到 使用 Hadoop 的應用程式 的完整列表。除了搜尋引擎之外,Hadoop 還能解決許多其他問題。 
  • “Running Hadoop on Ubuntu Linux (Multi-Node Cluster)” 是一份由 Michael Noll 撰寫的教程,它教您設定 Hadoop 叢集。本教程還提到了另一本更早的關於如何設定單個節點的教程。 
  • In the developerWorks Linux 專區 中可以找到為 Linux 開發人員準備的更多參考資料(包括為 Linux 新手準備的 Linux 新手入門),還可以查閱 最受歡迎的文章和教程。
  • 在 developerWorks 上查閱所有 Linux 技巧 和 Linux 教程。 
  • 隨時關注 developerWorks 技術活動和網路廣播。 
來源:http://www.ibm.com/developerworks/cn/linux/l-hadoop/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.