學習 -- 基礎知識,初級入門

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的體系結構。

MapReduce是一種編程模型,用於大規模數據集(大於1TB)的並行運算。Map(映射)和Reduce(歸約),和他們的主要思想,都是從函數式編程語言裏來的。它極大地方便了編程人員在不會分佈式並行編程的情況下,將自己的程序運行在分佈式系統上。 當前的軟件實現是指定一個Map(映射)函數,用來把一組鍵值對映射成一組新的鍵值對,經過一定處理後交給Reduce,指定併發的Reduce(歸約)函數,用來保證所有映射的鍵值對中的每一個共享相同的鍵組。


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 個最終結果又可以作爲另一個計算任務的輸入,開始另一個並行計算任務,這也就形成了任務管道



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章