hadoop三大核心組件介紹


1、Hadoop概述

1.1 Hadoop是什么

Hadoop是Apache旗下的一個用java語言實現開源軟件框架,是一個開發和運行處理大規模數據的軟件平台

1.2 核心組件

  • 分布式存儲系統 HDFS(Hadoop Distributed File System),提供了高可靠性、高擴展性和高吞吐率的數據存儲服務;

  • 分布式計算框架 MapReduce,具有易於編程、高容錯性和高擴展性等優點;

  • 分布式資源管理框架 YARN(Yet Another Resource Management),負責集群資源的管理和調度。

    Hadoop 的生態系統中包含多種技術:

    Apache Hadoop: 是Apache開源組織的一個分布式計算開源框架,提供了一個分布式文件系統子項目(HDFS)和支持MapReduce分布式計算的軟件架構。

    Apache Hive: 是基於Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射為一張數據庫表,通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合數據倉庫的統計分析。

    Apache HBase: 是一個高可靠性、高性能、面向列、可伸縮的分布式存儲系統,利用HBase技術可在廉價PC Server上搭建起大規模結構化存儲集群。

    Apache Sqoop: 是一個用來將HDFS和關系型數據庫中的數據相互轉移的工具,可以將一個關系型數據庫(MySQL ,Oracle ,Postgres等)中的數據導進到Hadoop的HDFS中,也可以將HDFS的數據導進到關系型數據庫中。

    Apache Zookeeper: 是一個為分布式應用所設計的分布的、開源的協調服務,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。

    Apache Mahout:是基於Hadoop的機器學習和數據挖掘的一個分布式框架。Mahout用MapReduce實現了部分數據挖掘算法,解決了並行挖掘的問題。

    Apache Avro: 是一個數據序列化系統,設計用於支持數據密集型,大批量數據交換的應用。Avro是新的數據序列化格式與傳輸工具,將逐步取代Hadoop原有的IPC機制。

    Apache Chukwa: 是一個開源的用於監控大型分布式系統的數據收集系統,它可以將各種各樣類型的數據收集成適合 Hadoop 處理的文件保存在 HDFS 中供 Hadoop 進行各種 MapReduce 操作。

    Apache Hama: 是一個基於HDFS的BSP(Bulk Synchronous Parallel)並行計算框架, Hama可用於包括圖、矩陣和網絡算法在內的大規模、大數據計算。

    Apache Flume: 是一個分布的、可靠的、高可用的海量日志聚合的系統,可用於日志數據收集,日志數據處理,日志數據傳輸。

    Apache Oozie: 是一個工作流引擎服務器, 用於管理和協調運行在Hadoop平台上(HDFS、Pig和MapReduce)的任務。

    Cloudera Hue: 是一個基於WEB的監控和管理系統,實現對HDFS,MapReduce/YARN, HBase, Hive, Pig的web化操作和管理。
    還有其他分布式計算框架如:spark、flink,以及其他組件

 

1.3 優點

  • 擴容能力(Scalable):Hadoop是在可用的計算機集群間分配數據並完成計算任務的,這些集群可用方便的擴展到數以千計的節點中。

  • 成本低(Economical):Hadoop通過普通廉價的機器組成服務器集群來分發以及處理數據,以至於成本很低。

  • 高效率(Efficient):通過並發數據,Hadoop可以在節點之間動態並行的移動數據,使得速度非常快。

  • 可靠性(Rellable):能自動維護數據的多份復制,並且在任務失敗后能自動地重新部署(redeploy)計算任務。所以Hadoop的按位存儲和處理數據的能力值得人們信賴。

 

2、HDFS

全稱:分布式存儲系統 HDFS(Hadoop Distributed File System),是一個高度容錯性的系統,適合部署在廉價的機器上。HDFS能提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。

2.1 存儲模型

  • 文件線性切割成塊(Block):大文件切分為小文件

  • 偏移量 offset(byte):每一個塊的起始位置相對於原始文件的字節索引

  • Block 分散存儲在集群節點中,單一文件 Block 大小一致,文件與文件之間 Block 大小可以不一致,Block 可以設置副本數,副本分散在不同節點中,副本數不要超過節點數量,文件上傳可以設置 Block 大小和副本數,已上傳的文件 Block 副本數可以調整,大小不變,塊大小默認是128M,可以調整

  • 只支持一次寫入多次讀取(修改是泛洪操作,集群開銷很大,所有不允許在塊中增刪改操作),同一時刻只有一個寫入者

  • 可以 append 追加數據(加塊,單點操作)

2.2 架構模型

這里介紹的是Hadoop2.x,介紹的是HA,采取主備NN模式的Hadoop集群

數據分為兩部分:文件元數據、文件數據

  • 元數據:理解為文件的屬性,比如權限、修改日期,文件名等

    • NameNode 節點(主)保存文件元數據:單節點

  • 數據本身:理解為文件中的內容

    • DataNode 節點(從)保存文件Block 數據:多節點

    • DataNode 與 NameNode 保持心跳,提交 Block 列表

    • HdfsClient 與 NameNode 交互元數據信息

    • HdfsClient 與 DataNode 交互文件 Block 數據

HA模式架構圖如下

2.2.1 NameNode (NN)

基於內存存儲,不會和磁盤發生交換,只存在內存中,但也有持久化的功能,只是單方向的存儲,防止斷電丟失,不會發生內存和磁盤的交換,NameNode 的 metadate 信息在啟動后會加載到內存,metadata 存儲到磁盤文件名為fsimage,Block 的位置信息不會保存到 fsimage,由 DataNode 匯報,edits記錄對 metadata 的操作日志。

NameNode 主要功能:

接受客戶端的讀寫服務,收集 DataNode 匯報的 Block 列表信息,NameNode 保存。metadata 信息包括:文件owership、permissions、文件大小、時間、Block 列表、Block 偏移量和位置信息(副本位置由 DataNode 匯報,實時改變,不會持久化)等。

  • ANN:ActiveNameNode,對外提供服務,SNN 同步 ANN 元數據,以待切換。

  • SNN:StandbyNameNode,完成了 edits.log 文件的合並產生新的 fsimage,推送回 ANN。

  • 兩個NN 之間的切換:

    • 手動切換:通過命令實現主備之間的切換,可以用 HDFS 升級等場合。

    • 自動切換:基於 Zookeeper 實現。HDFS 2.x 提供了 ZookeeperFailoverController 角色,部署在每個NameNode 的節點上,作為一個 deamon 進程, 簡稱 zkfc。

2.2.2 ZKFC

全稱:ZookeeperFailoverController,包括以下三個組件:

  1. HealthMonitor:監控 NameNode 是否處於 unavailable 或 unhealthy 狀態。當前通過RPC 調用 NN 相應的方法完成。

  2. ActiveStandbyElector:管理和監控自己在 ZK 中的狀態。

  3. ZKFailoverController:它訂閱 HealthMonitor 和 ActiveStandbyElector 的事件,並管理NameNode 的狀態。

    主要職責:

    1. 健康監測:周期性的向它監控的 NN 發送健康探測命令,從而來確定某個NameNode 是否處於健康狀態,如果機器宕機,心跳失敗,那么 zkfc 就會標記它處於一個不健康的狀態

    2. 會話管理:如果 NN 是健康的,zkfc 就會在 zookeeper 中保持一個打開的會話,如果 NameNode 同時還是 Active 狀態的,那么 zkfc 還會在 Zookeeper 中占有一個類型為短暫類型的 znode,當這個 NN 掛掉時,這個 znode 將會被刪除,然后備用的NN,將會得到這把鎖,升級為主 NN,同時標記狀態為 Active,當宕機的NN 新啟動時,它會再次注冊 zookeper,發現已經有 znode 鎖了,便會自動變為 Standby狀態,如此往復循環,保證高可靠,需要注意,目前僅僅支持最多配置 2 個NN.

    3. master 選舉:如上所述,通過在 zookeeper 中維持一個短暫類型的 znode,來實現搶占式的鎖機制,從而判斷那個NameNode 為 Active 狀態。

 

2.2.3 DataNode(DN)

使用本地磁盤目錄以文件形式存儲數據(Block),同時存儲 Block 的元數據信息文件(校驗和,用於檢測數據塊是否損壞),啟動 DN 時會向 兩個NN 匯報 block 信息的位置,通過向NN發送心跳保持與其聯系(3 秒一次),如果NN 10 分鍾沒有收到 DN 的心跳,則認為其已經 lost,並 copy 其上的 block 到其它 DN。

副本放置策略

  • 第一個副本:放置在上傳文件的 DN;如果是集群外提交,則隨機挑選一台磁盤不太滿,CPU 不太忙的節點。

  • 第二個副本:放置在於第一個副本不同的機架的節點上。第三個副本:與第二個副本相同機架的節點。

  • 更多副本:隨機節點。

2.2.4 JournalNode(JNN)

ANN 和 SNN 通過 JNN 集群來共享信息。兩個NameNode 為了數據同步,會通過一組稱作 JournalNodes 的獨立進程進行相互通信。當 ANN 的命名空間有任何修改時,會告知大部分的 JournalNodes 進程。SNN 有能力讀取 JNs 中的變更信息,並且一直監控 edit log 的變化,把變化應用於自己的命名空間。SNN 可以確保在集群出錯時,命名空間狀態已經完全同步了,為了保持 SNN 實時的與 ANN 的元數據保持一致,他們之間交互通過一系列守護的輕量級進程 JournalNode。基本原理就是用 2N+1 台 JN 存儲editlog,每次寫數據操作有超過半數(>=N+1)返回成功時即認為該次寫成功,數據不會丟失了。當然這個算法所能容忍的是最多有 N 台機器掛掉,如果多於 N 台掛掉,這個算法就失效了。任何修改操作在 ANN上執行時,JN 進程同時也會記錄修改 log 到至少半數以上的 JN 中,這時 SNN 監測到 JN 里面的同步 log 發生變化了會讀取 JN 里面的修改 log,然后同步到自己的的目錄鏡像樹里面。當發生故障時,ANN 掛掉后,SNN 會在它成為ANN 前,讀取所有的 JN 里面的修改日志,這樣就能高可靠的保證與掛掉的 NN 的目錄鏡像樹一致,然后無縫的接替它的職責,維護來自客戶端請求,從而達到一個高可用的目的。

2.3 HDFS 寫流程

  1. 客戶端創建 DistributedFileSystem 對象.

  2. DistributedFileSystem 對象調用元數據節點,在文件系統的命名空間中創建一個新的文件,元數據節點首先確定文件原來不存在,並且客戶端有創建文件的權限,然后創建新文件,並標識為“上傳中”狀態,即可以看見,但不能使用。

  3. DistributedFileSystem 返回 DFSOutputStream,客戶端用於寫數據。

  4. 客戶端開始寫入數據,DFSOutputStream 將數據分成塊,寫入 data queue(Data

  5. queue 由 Data Streamer 讀取),並通知元數據節點分配數據節點,用來存儲數據塊(每塊默認復制 3 塊)。分配的數據節點放在一個 pipeline 里。Data Streamer將數據塊寫入 pipeline 中的第一個數據節點。第一個數據節點將數據塊發送給第二個數據節點。第二個數據節點將數據發送給第三個數據節點。注意:並不是第一個數據節點完全接收完 block 后再發送給后面的數據節點,而是接收到一部分就發送,所以三個節點幾乎是同時接收到完整的 block 的。DFSOutputStream 為發出去的數據塊保存了 ack queue,等待 pipeline 中的數據節點告知數據已經寫入成功。如果 block 在某個節點的寫入的過程中失敗:關閉 pipeline,將 ack queue 放至 data queue 的開始。已經寫入節點中的那些 block 部分會被元數據節點賦予新的標示,發生錯誤的節點重啟后能夠察覺其數據塊是過時的,會被刪除。失敗的節點從 pipeline 中移除,block 的其他副本則寫入 pipeline 中的另外兩個數據節點。元數據節點則被通知此 block 的副本不足,將來會再創建第三份備份。

  6. ack queue 返回成功。

  7. 客戶端結束寫入數據,則調用 stream 的 close 函數,最后通知元數據節點寫入完畢

總結:

客戶端切分文件 Block,按 Block 線性地和 NN 獲取 DN 列表(副本數),驗證 DN 列表后以更小的單位流式傳輸數據,各節點兩兩通信確定可用,Block 傳輸結束后,DN 向 NN匯報Block 信息,DN 向 Client 匯報完成,Client 向 NN 匯報完成,獲取下一個 Block 存放的DN 列表,最終 Client 匯報完成,NN 會在寫流程更新文件狀態。

 

2.4 HDFS 讀流程

  1. 客戶端(client)用 FileSystem 的 open()函數打開文件。

  2. DistributedFileSystem 調用元數據節點,得到文件的數據塊信息。對於每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。

  3. DistributedFileSystem 返回 FSDataInputStream 給客戶端,用來讀取數據。

  4. 客戶端調用 stream 的 read()函數開始讀取數據(也會讀取 block 的元數據)。

DFSInputStream 連接保存此文件第一個數據塊的最近的數據節點(優先讀取同機架的 block)。

  1. Data 從數據節點讀到客戶端。當此數據塊讀取完畢時,DFSInputStream 關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。

  2. 當客戶端讀取完畢數據的時候,調用 FSDataInputStream 的 close 函數。

  3. 在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以后不再連接。

總結:

客戶端和NN 獲取一部分 Block(獲取部分 block 信息,而不是整個文件全部的 block 信息,讀完這部分 block 后,再獲取另一個部分 block 的信息)副本位置列表,線性地和 DN獲取Block,最終合並為一個文件,在 Block 副本列表中按距離擇優選取。

2.5 HDFS 優點

  • 高容錯性:數據自動保存多個副本,副本丟失后,自動恢復

  • 適合批處理:移動計算而非數據,數據位置暴露給計算框架(Block 偏移量)

  • 適合大數據處理:GB 、TB 、甚至 PB 級數據,百萬規模以上的文件數量,10K+節點數量

  • 可構建在廉價機器上:通過多副本提高可靠性,提供了容錯和恢復機制

2.6 HDFS 缺點

  • 低延遲數據訪問:HDFS 不太適合於那些要求低延時(數十毫秒)訪問的應用程序,因為 HDFS 是設計用於大吞吐量數據的,這是以一定延時為代價的。HDFS 是單 Master 的,所有對文件的請求都要經過它,當請求多時,肯定會有延時。

  • 小文件存取時占用NameNode 大量內存,尋道時間超過讀取時間

  • 一個文件只能有一個寫者,且僅支持 append

 

3、MapReduce

3.1、概念

MapReduce是分布式計算框架,由於計算過程需要反復操作磁盤,適用於離線計算,批計算,大規模的數據量計算。

原語:“相同”的key為一組,調用一次reduce方法,方法內迭代這一組數據進行計算。這也是MapReduce的核心思想。

具體:輸入的數據是單條,通過map將每條記錄映射成為k-v格式的數據。經過中間的shuffle過程將相同的key的數據匯聚在一起,在reduce端完成相同key的統計計算

3.2、 邏輯

MapReduce只有兩個邏輯,map和reduce

  • map

    • 讀取數據

    • 將數據映射成kv格式

    • 並行分布式

    • 計算向數據移動

  • reduce

    • 數據全量/分量加工

    • reduce中可以包括不同的key

    • 相同的key匯聚到一個reduce中

    • 相同的key調用一次reduce方法

    • 排序實現key的匯聚

3.3、MR執行流程

  1. 先根據hdfs中的數據的block來進行切片操作,默認切片大小等於block塊大小---決定了maptask的個數

  2. 執行map的處理邏輯,最終的數據結果是kv格式

  3. kv格式的數據首先會寫入一個100M的buffer緩沖區,當達到80%開始進行溢寫成文件,溢寫的時候會進行sort,相同key的數據匯聚到一起

  4. 最終map執行完成之后會有N多個溢寫的小文件

  5. 將小文件進行一個merge操作,將N個小文件中相同的key的數據匯聚到一起

  6. reduce端處理數據之前會從不同的map節點中拉取數據

  7. 拉取完數據之后,會對這些文件進行合並操作,將相同key的數據匯聚

  8. reduce讀取到的是相同key的iterator

  9. 對iterator中的數據進行合並操作

圖解:

Shuffler<洗牌>:框架內部實現機制

分布式計算節點數據流轉:連接MapTask與ReduceTask

 

 

 

 

 

 

4、Yarn

yarn是Hadoop2.x 出現的概念,資源調度框架,它負責整個集群計算時的資源管理分配。

架構圖:

 

YARN:解耦資源與計算

ResourceManager:主,核心,集群節點資源管理

NodeManager:與 RM 匯報資源,管理 Container 生命周期,計算框架中的角色都以

Container 表示其中信息包括節點 NM,CPU,MEM,I/O 大小,啟動命令等,默認

NodeManager 啟動線程監控 Container 大小,超出申請資源額度,則 kill,支持 Linux 內核的 Cgroup

MR :MR-ApplicationMaster-Container,作業為單位,避免單點故障,負載到不同的節點,創建 Task 需要和RM 申請資源(Container),

Task:也是運行在 Container 中

Client:RM-client:請求資源創建AM AM-Client 與AM交互

 

 

以上是Hadoop三大核心組件的介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM