第二章 文獻探討
第二節 Apache Hadoop
國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
第二節 Apache Hadoop
Hadoop 是 Apache 軟體基金會的一個開放原始碼專案,它是由 Apache Lucene 的創立者 Doug Cutting 所建立的,由 Java 寫成,主要用途為建構大量資料的分 散式儲存與運算環境。Hadoop 專案包含了兩個最主要的元素,Hadoop Distributed File System(HDFS)與 MapReduce。
Hadoop 最初是 Apache Lucene 這個專案中的搜尋引擎—Nutch 的一部分。起 初的 Nutch 實現了一套可以抓取網頁並搜尋資料的系統,但是開發人員很快地發 現它能處理的網頁數量是有極限的,在當時的架構之下,無法擴充到處理數十億 以上的網頁。之後,Google 發表了有關於 Google File System 的論文,這篇論文 中所提出的架構可以解決抓取大量網頁和建立索引時所產生的大量檔案,這對 Nutch 的開發團隊來說很有幫助。於是,Nutch 的開發團隊就開始將這個觀念在 Nutch 專案中實作,並將其稱為 Nutch Distributed File System(NDFS),也就是 Hadoop HDFS 的前身。
2004 年,Google 又發表了一篇介紹 MapReduce 概念的論文。MapReduce 是 一種用於處理資料的分散式程式框架,用平行運算的方式,將大量需要運算的資 料,切割成許多區塊,並將這些區塊分給叢集中的每個運算節點再同時對這些區 塊分別作運算,最後再將運算的結果結合起來,產生出最終的運算結果。Nutch 的開發團隊同樣地將這個概念在 Nutch 專案中實作出了開放原始碼的版本。
在 Nutch 計畫中的 NDFS 與 MapReduce 原本是設計來處理搜尋領域的相關 運算,但人們發現分散式儲存與運算的架構在別的領域上也有優異的表現,它們 的應用慢慢地超出了原本計畫使用的搜尋領域,於是開發人員於 2006 年將 NDFS 與 MapReduce 從 Nutch 計畫中抽出,成為一個獨立的 Lucene 子計畫,並將其命 名為 Hadoop。在 2008 年 1 月,Hadoop 又從 Lucene 計畫中獨立出來,成為 Apache 最頂級的計畫(top level project)之一。以下將會依序介紹 MapReduce 與 HDFS 的
‧
一、MapReduce:
MapReduce 將運算程序分為兩個階段 Map 和 Reduce 階段。每個階段的輸入 及輸出都採用<key, value>pair 的方式。在 Hadoop 中,一個工作(job)是客戶端要 執行的一個工作單位,它包含了輸入資料、MapReduce 程式與組態資訊。而一個 工作又會被分為數個任務(task)。
在 Hadoop 叢集中,節點分為兩種不同身分,一種是 jobtracker,另一種是 tasktracker。Jobtracker 在一個叢集中只有一個,它對所有的 tasktracker 進行任務 的分配與排程,tasktracker 會執行任務並且將執行情況報告給 jobtracker,如果任 務執行失敗,jobtracker 會將失敗的任務分派給其他的 tasktracker 執行。
圖 1、Jobtracker 與 tasktracker 示意圖 (資料來源:本研究整理)
任務的類型分為兩種,map 任務與 reduce 任務。Hadoop 會將輸入資料分割 成固定大小後再開始做 MapReduce,map 任務就是每個分割後的輸入資料區塊都 會執行的運算過程,交給 mapper 執行。Mapper 運算完之後的輸出一樣會用<key, value>pair 的形式送給處理 reduce 任務的 Reducer 作為輸入。最後 reducer 再依照 開發人員撰寫的程式將資料結合化簡,產生最後的輸出。
Client
Jobtracker
Tasktracker
Mapper
Mapper
Tasktracker
Reducer Input
Split Input Split
Mapper Output Mapper
Output
Result
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University
二、HDFS:
一個 HDFS 叢集裡面會有兩種類型的節點,一個 namenode 與一群 datanode。
Namenode 管理著整個檔案系統的命名空間,他會維護檔案系統的結構和所有檔 案與目錄的 metadata。而 datanode 則是實際儲存檔案的地方,一個檔案在 HDFS 中可能會被分為一個或多個資料區塊,這些區塊會儲存在一組 datanode 上。為 了提升容錯能力而達到高可用性(availability),資料區塊通常會有多個複本儲存 在不同的 datanode 上,namenode 也負責進行資料區塊的建立、刪除與複製。
當客戶端應用程式要讀寫資料時,會先向 namenode 進行 metadata 操作,在 namenode 的安排下,客戶端應用程式會知道該直接向哪一個 datanode 存取資料。
實際在進行資料讀寫時,資料流並不會經過 namenode,而是由 datanode 直接處 理客戶端應用程式的讀寫請求。
圖 2、HDFS 架構圖 (資料來源:apache.org)
‧ 國
立 政 治 大 學
‧
Na tiona
l Ch engchi University