天天看點

<Hadoop實戰>學習 -- 基礎知識,初級入門

Hadoop實作了一個分布式檔案系統(Hadoop Distributed File System)HDFS,其具有高容錯性、高伸縮性等特點,設計用來部署在低廉的常用商業硬體上;它提供高吞吐率(high throughput)來通路應用程式的資料,适合那些有着超大資料集(large data set)的應用程式。HDFS放寬了對可移植作業系統接口(POSIX,Portable Operating System Interface)的要求,實作以流的形式(streaming access)通路檔案系統中的資料。

由于具備低成本和前所未有的高擴充性,Hadoop已被公認為是新一代的大資料處理平台。就像30年前SQL(Structured Query Language)出現一樣,Hadoop正帶來了新一輪的資料革命。如今Hadoop已從初出茅廬的小象變成了行業的巨人,但Hadoop仍需繼續完善。

基于Java語言建構的Hadoop架構實際上一種分布式處理大資料平台,其包括軟體和衆多子項目。在近十年中Hadoop已成為大資料革命的中心。MapReduce作為Hadoop的核心是一種處理大型及超大型資料集(TB級别的資料。包括網絡點選産生的流資料、日志檔案、社交網絡等所帶來的資料)并生成相關的執行的程式設計模型。其主要思想是從函數式程式設計語言借鑒而來的,同時也包含了從矢量程式設計語言借鑒的特性。

Hadoop是一個能夠讓使用者輕松架構和使用的 分布式計算平台。使用者可以輕松地在Hadoop上開發和運作處理海量資料的 應用程式。它主要有以下幾個優點:

  1. 高可靠性。Hadoop按位存儲和處理資料的能力值得人們信賴。
  2. 高擴充性。Hadoop是在可用的計算機集簇間配置設定資料并完成計算任務的,這些集簇可以友善地擴充到數以千計的節點中。
  3. 高效性。Hadoop能夠在節點之間動态地移動資料,并保證各個節點的 動态平衡,是以處理速度非常快。
  4. 高容錯性。Hadoop能夠自動儲存資料的多個副本,能夠自動将失敗的任務重新配置設定。存儲備援資料來確定資料的安全性。
  5. 低成本。普通的商業通用機器就可以運作Hadoop,Hadoop是開源的,項目的軟體成本是以會大大降低。

HDFS的體系結構,HDFS采用了主從(Master/Slave)結構模型,一個HDFS叢集是由一個NameNode和若幹個DataNode組成的。其中NameNode作為主伺服器,管理檔案系統的命名空間和用戶端對檔案的通路操作;叢集中的DataNode管理存儲的資料。HDFS允許使用者以檔案的形式存儲資料。從内部來看,檔案被分成若幹個資料塊,而且這若幹個資料塊存放在一組DataNode上。NameNode執行檔案系統的命名空間操作,比如打開、關閉、重命名檔案或目錄等,它也負責資料塊到具體DataNode的映射。DataNode負責處理檔案系統用戶端的檔案讀寫請求,并在NameNode的統一排程下進行資料塊的建立、删除和複制工作。圖1-3給出了HDFS的體系結構。

<Hadoop實戰>學習 -- 基礎知識,初級入門

MapReduce是一種程式設計模型,用于大規模資料集(大于1TB)的并行運算。Map(映射)和Reduce(歸約),和他們的主要思想,都是從函數式程式設計語言裡來的。它極大地友善了程式設計人員在不會分布式并行程式設計的情況下,将自己的程式運作在分布式系統上。 目前的軟體實作是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,經過一定處理後交給Reduce,指定并發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。

<Hadoop實戰>學習 -- 基礎知識,初級入門

Hadoop上的并行應用程式開發是基于MapReduce程式設計架構的。MapReduce程式設計模型的原理是:利用一個輸入的key/value 對集合來産生一個輸出的key/value 對集合。MapReduce庫的使用者用兩個函數來表達這個計算:Map和Reduce。

使用者自定義的map函數接收一個輸入的key/value 對,然後産生一個中間key/value 對的集合。MapReduce把所有具有相同key值的value集合在一起,然後傳遞給reduce函數。使用者自定義的reduce函數接收key和相關的value集合。reduce函數合并這些value值,形成一個較小的value集合。一般來說,每次reduce函數調用隻産生0或1個輸出的value值。通常我們通過一個疊代器把中間的value值提供給reduce 函數,這樣就可以處理無法全部放入記憶體中的大量的value值集合了。

1. 資料分布存儲

Hadoop分布式檔案系統(HDFS)由一個名稱節點(NameNode )和N個資料節點 (DataNode)組成,每個節點均是一台普通的計算機。在使用方式上HDFS與我們熟悉的單機檔案系統非常類似,它可以建立目錄,建立、複制和删除檔案,以及檢視檔案的内容等。但HDFS底層把檔案切割成了Block,然後這些 Block 分散地存儲于不同的 DataNode 上,每個 Block 還可以複制數份資料存儲于不同的 DataNode 上,達到容錯容災的目的。NameNode 則是整個 HDFS 的核心,它通過維護一些資料結構來記錄每一個檔案被切割成了多少個 Block、這些 Block 可以從哪些 DataNode 中獲得,以及各個 DataNode 的狀态等重要資訊。

2. 分布式并行計算

Hadoop 中有一個作為主要的 JobTracker,用于排程和管理其他的 TaskTracker,JobTracker 可以運作于叢集中的任意一台計算機上。TaskTracker則負責執行任務,它必須運作于 DataNode 上,也就是說DataNode 既是資料存儲節點,也是計算節點。 JobTracker 将 map 任務和 reduce 任務分發給空閑的 TaskTracker,讓這些任務并行運作,并負責監控任務的運作情況。如果某一個 TaskTracker 出了故障,JobTracker 會将其負責的任務轉交給另一個空閑的 TaskTracker 重新運作。

3. 本地計算

資料存儲在哪一台計算機上,就由哪台計算機進行這部分資料的計算,這樣可以減少資料在網絡上的傳輸,降低對網絡帶寬的需求。在 Hadoop 這類基于叢集的分布式并行系統中,計算節點可以很友善地擴充,它所能夠提供的計算能力近乎無限,但是由于資料需要在不同的計算機之間流動,故網絡帶寬變成了瓶頸,“本地計算”是一種最有效的節約網絡帶寬的手段,業界把這形容為“移動計算比移動資料更經濟”。

4. 任務粒度

把原始大資料集切割成小資料集時,通常讓小資料集小于或等于 HDFS 中一個 Block 的大小(預設是64MB),這樣能夠保證一個小資料集是位于一台計算機上的,便于本地計算。有 M 個小資料集待處理,就啟動 M 個 map 任務,注意這 M 個map 任務分布于 N 台計算機上,它們會并行運作,reduce 任務的數量 R 則可由使用者指定。

5. 資料分割(Partition)

把 map 任務輸出的中間結果按 key 的範圍劃分成R份(R是預先定義的reduce 任務的個數),劃分時通常使用 hash 函數(如:hash(key) mod R),這樣可以保證某一範圍内的 key一定是由一個 reduce 任務來處理的,可以簡化 Reduce 的過程。

6. 資料合并(Combine)

在資料分割之前,還可以先對中間結果進行資料合并(Combine),即将中間結果中有相同 key的 <key, value> 對合并成一對。Combine 的過程與reduce 的過程類似,很多情況下可以直接使用reduce 函數,但 Combine 是作為map 任務的一部分,在執行完map函數後緊接着執行的。Combine 能夠減少中間結果中 <key, value> 對的數目,進而降低網絡流量。

7. Reduce

Map 任務的中間結果在做完 Combine 和 Partition 之後,以檔案形式存于本地磁盤上。中間結果檔案的位置會通知主要 JobTracker,JobTracker 再通知 reduce 任務到哪一個 DataNode 上去取中間結果。注意,所有的map 任務産生的中間結果均按其key 值用同一個 hash 函數劃分成了R份,R個reduce 任務各自負責一段key 區間。每個reduce 需要向許多個map 任務節點取得落在其負責的key 區間内的中間結果,然後執行reduce函數,形成一個最終的結果檔案。

8. 任務管道

有 R 個 reduce 任務,就會有 R 個最終結果,很多情況下這 R 個最終結果并不需要合并成一個最終結果,因為這 R 個最終結果又可以作為另一個計算任務的輸入,開始另一個并行計算任務,這也就形成了任務管道。

繼續閱讀