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,包括以下三個組件:
-
HealthMonitor:監控 NameNode 是否處於 unavailable 或 unhealthy 狀態。當前通過RPC 調用 NN 相應的方法完成。
-
ActiveStandbyElector:管理和監控自己在 ZK 中的狀態。
-
ZKFailoverController:它訂閱 HealthMonitor 和 ActiveStandbyElector 的事件,並管理NameNode 的狀態。
主要職責:
-
健康監測:周期性的向它監控的 NN 發送健康探測命令,從而來確定某個NameNode 是否處於健康狀態,如果機器宕機,心跳失敗,那么 zkfc 就會標記它處於一個不健康的狀態
-
會話管理:如果 NN 是健康的,zkfc 就會在 zookeeper 中保持一個打開的會話,如果 NameNode 同時還是 Active 狀態的,那么 zkfc 還會在 Zookeeper 中占有一個類型為短暫類型的 znode,當這個 NN 掛掉時,這個 znode 將會被刪除,然后備用的NN,將會得到這把鎖,升級為主 NN,同時標記狀態為 Active,當宕機的NN 新啟動時,它會再次注冊 zookeper,發現已經有 znode 鎖了,便會自動變為 Standby狀態,如此往復循環,保證高可靠,需要注意,目前僅僅支持最多配置 2 個NN.
-
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 寫流程
-
客戶端創建 DistributedFileSystem 對象.
-
DistributedFileSystem 對象調用元數據節點,在文件系統的命名空間中創建一個新的文件,元數據節點首先確定文件原來不存在,並且客戶端有創建文件的權限,然后創建新文件,並標識為“上傳中”狀態,即可以看見,但不能使用。
-
DistributedFileSystem 返回 DFSOutputStream,客戶端用於寫數據。
-
客戶端開始寫入數據,DFSOutputStream 將數據分成塊,寫入 data queue(Data
-
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 的副本不足,將來會再創建第三份備份。
-
ack queue 返回成功。
-
客戶端結束寫入數據,則調用 stream 的 close 函數,最后通知元數據節點寫入完畢
總結:
客戶端切分文件 Block,按 Block 線性地和 NN 獲取 DN 列表(副本數),驗證 DN 列表后以更小的單位流式傳輸數據,各節點兩兩通信確定可用,Block 傳輸結束后,DN 向 NN匯報Block 信息,DN 向 Client 匯報完成,Client 向 NN 匯報完成,獲取下一個 Block 存放的DN 列表,最終 Client 匯報完成,NN 會在寫流程更新文件狀態。
2.4 HDFS 讀流程
-
客戶端(client)用 FileSystem 的 open()函數打開文件。
-
DistributedFileSystem 調用元數據節點,得到文件的數據塊信息。對於每一個數據塊,元數據節點返回保存數據塊的數據節點的地址。
-
DistributedFileSystem 返回 FSDataInputStream 給客戶端,用來讀取數據。
-
客戶端調用 stream 的 read()函數開始讀取數據(也會讀取 block 的元數據)。
DFSInputStream 連接保存此文件第一個數據塊的最近的數據節點(優先讀取同機架的 block)。
-
Data 從數據節點讀到客戶端。當此數據塊讀取完畢時,DFSInputStream 關閉和此數據節點的連接,然后連接此文件下一個數據塊的最近的數據節點。
-
當客戶端讀取完畢數據的時候,調用 FSDataInputStream 的 close 函數。
-
在讀取數據的過程中,如果客戶端在與數據節點通信出現錯誤,則嘗試連接包含此數據塊的下一個數據節點。失敗的數據節點將被記錄,以后不再連接。
總結:
客戶端和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的核心思想。
3.2、 邏輯
MapReduce只有兩個邏輯,map和reduce
-
map
-
讀取數據
-
將數據映射成kv格式
-
並行分布式
-
計算向數據移動
-
-
reduce
-
數據全量/分量加工
-
reduce中可以包括不同的key
-
相同的key匯聚到一個reduce中
-
相同的key調用一次reduce方法
-
排序實現key的匯聚
-
3.3、MR執行流程
-
先根據hdfs中的數據的block來進行切片操作,默認切片大小等於block塊大小---決定了maptask的個數
-
執行map的處理邏輯,最終的數據結果是kv格式
-
kv格式的數據首先會寫入一個100M的buffer緩沖區,當達到80%開始進行溢寫成文件,溢寫的時候會進行sort,相同key的數據匯聚到一起
-
最終map執行完成之后會有N多個溢寫的小文件
-
將小文件進行一個merge操作,將N個小文件中相同的key的數據匯聚到一起
-
reduce端處理數據之前會從不同的map節點中拉取數據
-
拉取完數據之后,會對這些文件進行合並操作,將相同key的數據匯聚
-
reduce讀取到的是相同key的iterator
-
對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交互