Hadoop基礎(一) 基本概念

概念

Hadoop 是 Apache 旗下一個開發和運行處理大數據的軟件平臺,允許使用簡單的編程模型在大量計算機集羣上對大型數據集進行分佈式處理。多運用於互聯網和金融領域。

 

三個核心組件

  1. HDFS(分佈式文件系統):解決海量數據存儲
  2. YARN(作業調度和集羣資源管理框架):解決資源和任務調度
  3. MapReduce(分佈式運算編程框架):解決海量數據計算

YARN:在 Hadoop2.x 中出現,Hadoop1.x 中 YARN 的功能由 MapReduce 實現。YARN 的出現使得 MapReduce 可以更加專注於計算本身,使 Hadoop 除了 MapReduce 之外還可以支持其他的編程框架。

 

四大特性優點

  • 擴容能力:Hadoop 在計算機集羣間分發數據並完成計算任務,集羣可以方便的擴展節點。
  • 成本低:Hadoop 用廉價的機器組成服務器集羣來分發和處理數據,不依賴高端設備,降低成本。
  • 高效率:Hadoop 可以在集羣中並行處理數據,處理速度非常快。(1 小時計算,50 分鐘讀取)
  • 可靠性:數據有多個備份,任務失敗後能夠自動重新部署。

 

HDFS

HDFS 全稱是 Hadoop Distributed File System,即 Hadoop 分佈式文件系統。

傳統存儲模式的缺陷:

  1. 單臺服務器的存儲、性能瓶頸
  2. 大文件上傳下載的耗時巨大

針對上述問題 HDFS 給出的解決方案:

  1. 用橫向擴展(集羣)代替服務器的縱向擴展
  2. 將大文件切割爲小塊,達到並行操作

隨之而來的問題:

  • 大文件切塊存儲後,獲取文件的成本變高
  • 需要有一個文件記錄切割後的文件塊位置,存在單點故障
  • 將塊文件備份存儲,會出現備份數據冗餘

設計目標

  1. 硬件故障是常態,故障檢測和快速自動恢復是 HDFS 的核心架構目標。
  2. 以流式讀取數據,適合批量處理,犧牲用戶交互。相較於數據訪問的反應時間,更注重數據訪問的高吞吐量。
  3. 設計成支持大文件(GB、TB 級別)。
  4. write-one-read-many 訪問模型。一旦創建、寫入之後就不能再修改。
  5. 傳統場景下,代碼不動,數據動;大數據場景下,數據不動,代碼動。將計算移動到數據附近,而非將數據移動到應用所在。

重要特性

  1. master/slave 架構:一般一個 HDFS 集羣由一個 NameNode 和 多個 DataNode 組成。NameNode 是 HDFS 集羣主節點,DataNode 是 HDFS 集羣從節點。
  2. 分塊存儲:HDFS 中的文件在物理上是分塊存儲的,塊(block)的大小可以配置,默認大小是 128 MB。
  3. 命名空間(Namespace):命名空間由 NameNode 維護,支持傳統的層次型文件組織結構(目錄樹)。HDFS 給客戶端提供一個統一的抽象目錄樹,客戶端通過路徑來訪問文件,不需要關心底層如何分塊存儲。
  4. 元數據:目錄樹 + 塊位置信息(塊 ID 以及塊所在的 DataNode 服務器)稱之爲元數據,元數據由 NameNode 負責管理。
  5. 數據存儲:文件塊的具體存儲管理由各個 DataNode 節點承擔,DataNode 需要定時向 NameNode 彙報持有的塊信息。
  6. 副本機制:由於 Hadoop 集羣採用相對廉價的服務器搭建,硬件故障是常態。因此所有的文件塊都有副本,默認使用三副本,即同一文件塊一共只有 3 份。
  7. 一次寫入、多次讀出:不支持文件修改,適合做大數據分析的底層存儲服務。

NameNode 概述

  • NameNode 是 HDFS 的核心,也是 master/slave 架構中的 master。
  • NameNode 僅存儲HDFS 的元數據,並跟蹤整個集羣中的文件。文件數據本身實際存儲在 DataNodes 中。(類似於 Git 中的 TreeObject 和 BlobObject)
  • NameNode 知道 HDFS 中任意給定文件的塊列表及其位置,使用此信息 NameNode 知道如何用塊構建文件。
  • NameNode 不會持久化存儲每個文件的各個塊所在的 DataNode 位置信息,這些信息在系統啓動時從數據節點重建。
  • NameNode 是 Hadoop 集羣中的單點故障。如果 NameNode 宕機,那麼整個集羣就癱瘓了。
  • NameNode 所在的機器通常會配置有大量的內存。整個 HDFS 可存儲的文件數受限於 NameNode 的內存大小。

NameNode 結構圖:

DataNode 概述

  • DataNode 負責將實際數據存儲在 HDFS 中,也是 master/slave 架構中的 slave。
  • DataNode 需要和 NameNode 保持不斷通信。
  • DataNode 啓動時,需要將自己發佈到 NameNode 並彙報自己持有的塊列表。
  • 當某個 DataNode 關閉時,不會影響數據或集羣的可用性。NameNode 會安排其他 DataNode 管理的塊進行副本複製。
  • DataNode 所在的機器通常會配置有大量的硬盤空間。因爲實際的數據存儲在 DataNode 中。
  • DataNode 會定期向 NameNode 發送心跳(證明自己活着),默認是 3s。如果 NameNode 長時間沒有接收到 DataNode 發送的心跳,就會認爲該 DataNode 失效。
  • DataNode 持有的塊列表也要定時向 NameNode 彙報,默認是 6h。

工作機制

NameNode 負責管理整個文件系統元數據,客戶端請求訪問 HDFS 都是通過向 NameNode 申請來進行。;DataNode 負責管理具體文件數據塊存儲;Secondary NameNode 協助 NameNode 進行元數據的備份。

HDFS 結構圖:

寫數據流程

1、Client 發起文件上傳請求,通過 RPC 與 NameNode 建立通訊,NameNode 檢查目標文件是否己存在,父目錄是否存在,返回是否可以上傳。

2、Client 按 128MB 大小(默認大小,可配置)將文件切塊,請求第一個 block 該傳輸到哪些 DataNode 服務器上。

3、NameNode 根據配置文件中指定的備份數量及機架感知原理進行文件分配,返回可用的 DataNode 地址,如 A,B,C。注: Hadoop 在設計時考慮到數據的安全與高效,數據文件默認在 HDFS 上存放三份,存儲策略爲本地一份,同機架內其他某一節點上一份,不同機架內的某一節點上一份。

4、Client 請求向 3 個 DataNode 中的 A 上傳數據(本質上是一個 RPC 調用,建立 pipeline),A 收到請求會繼續調用 B,然後 B 調用 C,將整個 pipeline 建立完成,後逐級返回 Client。

5、Client 開始向 A 上傳第一個 block(先從磁盤讀取數據放到本地內存中),以 packet 爲單位(默認 64 KB 大小),A 收到一個 packet 就會傳給 B,B 傳給 C;A 每傳入一個 packet 會放入一個應答隊列等待應答。

6、數據被分割成一個個 packet 數據包在 pipeline 上依次傳輸,在 pipeline 反方向上逐個發送 ack(命令正確應答),最終由 pipeline 中第一個 DataNode 節點 A 將 pipeline ack 發送給 Client 。

7、當一個 block 傳輸完成後,Client 再次請求 NameNode 上傳第二個 block 。

流程圖如下:

讀數據流程

1、Client 向 NameNode 發起 RPC 請求,來確定請求文件的 blcok 所在位置。

2、NameNode 會視情況返回文件的部分或者全部 block 列表。對於每個 block,NameNode 都會返回含有該 block 副本的 DataNode 地址。(NamdeNdde 只是返回 Client 請求文件的塊的 DataNode 地址,而不是返回塊的數據。)

3、這些返回的 DataNode 地址,會按照集羣拓撲結構得出 DataNode 與客戶端的距離,然後進行排序(排序兩個規則:網絡拓撲結果中距離 Client 近的 DataNode 排靠前;心跳機制中超時彙報的 DataNode 排靠後)。

4、Client 選取排序依靠前的 DataNode 來讀取 block,如果客戶端本身就是 DataNode,那麼將從本地直接獲取數據。

5、讀取完一個 block 會進行 checksum 驗證,如果讀取 DataNode 時出現錯誤,客戶端會通知 NameNdoe,然後再從下一個擁有該 block 副本的 DataNode 繼續讀取。(Client 是並行讀取 block 信息,而非一塊一塊的讀取。)

6、當讀完列表的 block 後,若文件讀取還沒有結束,客戶端會繼續向 NameNode 獲取下一批 block 列表。

7、最終讀取的所有 block 會合併成一個完整的文件。

 

MapReduce

MapReduce 的思想核心是“分而治之”,它主要做了兩件事情:“分”與“合”。

Map 負責“分”,即將複雜的任務分解成爲若干個“簡單的任務”來並行處理。這裏進行拆分的前提是小任務可以並行計算,彼此之間沒有依賴關係。Reduce 負責“合”,即對 Map 階段的結果進行彙總。

舉個例子,全國人口普查需要對全國的人口進行統計,那麼就可以將全國人口統計分解爲每個省/市/區的人口統計。省/市/區的人口統計之間沒有依賴關係,可以並行處理。將各省/市/區的人口統計的結果彙總就可以得到全國的人口統計。

設計構思

MapReduce 是一個分佈式運算程序的編程框架,核心功能是將用戶編寫的業務邏輯代碼和自帶默認組件整合成一個完整的分佈式運算程序,併發運行在 Hadoop 集羣上。

簡單來說,MapReduce 框架幫我們完成了大部分的通用功能,例如如何讀取數據、數據如何傳輸等等。開發者只需要專注於業務邏輯本身,大大降低了開發並行應用的門檻。

其設計構思體現在三個方面:

一、分而治之

對相互之間不具有計算依賴關係的大數據,實現並行最自然的辦法就是採取分而治之的策略。需要的注意是,不可拆分的計算任務或相互間有依賴關係的數據無法進行並行計算。

二、構建抽象模型:Map 和 Reduce

MapReduce 定義了 Map 和 Reduce 兩個抽象接口由用戶去編程實現(處理的數據類型是 <key,value> 鍵值對)。

Map:對一組數據元素進行某種重複式的處理,(k1,v1) -> (k2,v2)。

Reduce:對 Map 的中間結果進行某種進一步的結果整理,(k2,v2) -> (k3,v3)。

三、統一架構,隱藏系統層細節

如果沒有統一封裝底層細節,那麼開發者需要考慮諸如數據存儲、劃分、分發、結果收集、錯誤恢復等諸多細節。爲此,MapReduce 隱藏了絕大多數系統層面的處理細節。通過抽象模型和計算框架把需要做什麼(what)和具體怎麼做(how)分開了,開發者只需要關心應用層的具體計算問題。

 

參考:

Hadoop的概念、版本、發展史

Hadoop生態圈:19個讓大象飛起來的工具!

大數據|Hadoop簡介及兩大功能三大核心組件(二)

NAS SAN DAS都是些什麼鬼【存儲基本概念】

什麼是RPC?

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