分佈式大數據系統概覽(HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph)

分佈式大數據處理系統概覽(一)

  本博文主要對現如今分佈式大數據處理系統進行概括整理,相關課程爲華東師範大學數據科學與工程學院《大數據處理系統》,參考大夏學堂,下面主要整理HDFS/MapReduce/Spark/Yarn/Zookeeper/Storm/SparkStreaming/Lambda/DataFlow/Flink/Giraph有關的內容。


分佈式大數據處理系統大綱


  第一節部分主要總結分佈式系統的目標、性質;簡要介紹幾種分佈式計算的編程模型;介紹計算機進程與線程關係及遠程調用方式;介紹文件系統DFS、介紹Hadoop的文件系統HDFS;介紹分佈式計算批處理系統MapReduce和Spark。

0.緒論

0.1分佈式系統的目標

在這裏插入圖片描述

0.2 大數據的五個特性(5V)

(1)數量Volume
(2)種類Variety
(3)價值Value
(4)真實性Veracity
(5)速度Velocity

0.3 分佈式計算生態圈在這裏插入圖片描述
0.4分佈式計算底層系統

(1)協調服務系統:Zookeeper;
(2)資源管理系統:Yarn;
(3)分佈式文件系統:HDFS;

0.5數據處理分佈式計算系統:

(1)批處理:MapReduce、Spark;
(2)流處理:Storm、Spark Streaming;
(3)批流融合系統:Google Dataflow、Flink;

0.6專門應用領域分佈式計算系統:

(1)圖處理:GraphX、Giraph
(2)機器學習系統:SystemML、Tensorflow;

0.7編程模型:

在這裏插入圖片描述

0.8進程

(1)進程與線程之間的關係
在這裏插入圖片描述
(2)進程之間的通訊
# 信號、信號量、消息隊列、匿名管道、有名管道、共享內存、套接字
# 遠程調用RPC:進程通過參數傳遞的方式調用另一個進程中的一個方法並得到返回的結果
在這裏插入圖片描述

0.9序列化與壓縮

(1)序列化定義:
# 序列化:將對象狀態按照一定的格式轉換成有序字節流;
# 反序列化:從文件中或網絡上獲得的序列化的對象字節流後,根據字節流中保存的對象狀態和描述信息重建對象;
(2)壓縮定義:
# 壓縮:通過一些有別於原始編碼的特殊編碼方式保存數據,使得佔用空間減少;
# 解壓縮:還原原有數據格式;

1.文件系統

1.1文件系統的概念:

(1)文件系統是操作系統中負責管理和存取信息的模塊;
(2)文件是由文件名字標識的一組信息的集合;
(3)文件目錄:建立和維護的關於系統的所有文件的清單;文件目錄主要以樹形目錄爲主
(4)文件控制塊:每個目錄項對應一個文件的信息描述;主要包括:
# 文件存取控制信息;
# 文件的結構信息;
# 文件使用信息;
# 文件管理信息;
(5)目錄文件:目錄信息以文件的形式存放;

1.2文件系統的功能:

(1)基本功能:按名存取
(2)文件目錄的建立與維護
(3)實現邏輯文件到物理文件的轉換;
(4)文件存儲空間的分配和管理
(5)數據保密
(6)提供一組用戶使用的操作

1.3按名存取步驟

(1)系統超找目錄文件,獲得對用的文件目錄;
(2)根據文件名尋找到對應文件的文件控制塊;
(3)根據文件控制塊內的信息對文件進行存取;

2.分佈式文件系統(DFS)

2.1 DFS的體系架構

(1)實現思路:保證每臺機器均可以透明訪問其他機器上的文件;將每臺機器的文件系統關聯起來,形成一個對外同義的整體;
(2)C/S架構的文件系統的掛載:通過RPC調用訪問其他機器上的文件;將不同文件系統掛載到主系統的某一個目錄下,當訪問這個目錄時相當於訪問對應的文件系統;
(3)集羣分佈式文件系統:主節點進行管理,從節點存儲數據:文件切分爲塊,分散存儲在從節點中。

3.Hadoop分佈式文件系統(HDFS)

3.1 DFS設計假設與目標:

在這裏插入圖片描述

3.2 HDFS體系架構

在這裏插入圖片描述
(1)NameNode:每個集羣只有一個NameNode,負責文件系統元數據的操作、數據塊的副本機器定位。
# NameNode包含兩個總要重要文件:fsimage:元數據鏡像文件(保存文件系統的目錄樹);edits:元數據操作日誌(針對目錄樹的修改操作)
(2)SecondaryNameNode:並非是NameNode的熱備,其輔助分擔NameNode工作量,定期合併fsimage和edits文件並推送給NameNode,在緊急情況下可輔助恢復NameNode。
(3)DataNode:集羣中每個結點表示一個DataNode,其負責數據塊的存儲、爲客戶端提供實際文件數據。

3.3 HDFS的工作原理

在這裏插入圖片描述
第一階段NameNode工作
(1)第一次啓動NameNode格式化後,創建fsimage和edits文件。如果不是第一次啓動,直接加載編輯日誌edits和鏡像文件fsimage到內存。
(2)客戶端對元數據進行增刪改的請求。
(3)NameNode記錄操作日誌,更新滾動日誌。
(4)NameNode在內存中對數據進行增刪改查。
第二階段SecondaryNameNode工作
(1)Secondary NameNode詢問NameNode是否需要checkpoint。
直接帶回NameNode是否檢查結果。
(2)Secondary NameNode請求執行checkpoint。
(3)NameNode滾動正在寫的edits日誌。
(4)將滾動前的編輯日誌和鏡像文件拷貝到Secondary NameNode。
(5)Secondary NameNode加載編輯日誌和鏡像文件到內存,併合並。
(6)生成新的鏡像文件fsimage.chkpoint。
(7)拷貝fsimage.chkpoint到NameNode。
(8)NameNode將fsimage.chkpoint重新命名成fsimage。

3.4 數據讀寫策略:

在這裏插入圖片描述

3.5 文件讀寫一致性:

(1)一個文件經過創建、寫入和關閉後不得改變文件內容;
(2)已經寫入到HDFS文件、僅容許在文件末尾追加數據;
(3)當文件在寫入操作時,NameNode拒接針對該文件的讀寫操作;
(4)當文件在讀操作時,NameNode允許其他讀操作。

3.6 HDFS容錯性

(1)心跳機制,在Namenode和Datanode之間維持心跳檢測,當由於網絡故障之類的原因,導致Datanode發出的心跳包沒有被Namenode正常收到的時候,Namenode就不會將任何新的IO操作派發給那個Datanode,該Datanode上的數據被認爲是無效的,因此Namenode會檢測是否有文件block的副本數目小於設置值,如果小於就自動開始複製新的副本並分發到其他Datanode節點。
(2)檢測文件block的完整性,HDFS會記錄每個新創建的文件的所有block的校驗和。當以後檢索這些文件的時候,從某個節點獲取block,會首先確認校驗和是否一致,如果不一致,會從其他Datanode節點上獲取該block的副本。
(3)集羣的負載均衡,由於節點的失效或者增加,可能導致數據分佈的不均勻,當某個Datanode節點的空閒空間大於一個臨界值的時候,HDFS會自動從其他Datanode遷移數據過來。
(4)Namenode上的fsimage和edits日誌文件是HDFS的核心數據結構,如果這些文件損壞了,HDFS將失效。因而,Namenode可以配置成支持維護多個FsImage和Editlog的拷貝。任何對FsImage或者Editlog的修改,都將同步到它們的副本上。它總是選取最近的一致的FsImage和Editlog使用。Namenode在HDFS是單點存在,如果Namenode所在的機器錯誤,手工的干預是必須的。
(5)文件的刪除,刪除並不是馬上從Namenode移出namespace,而是放在/trash目錄隨時可恢復,直到超過設置時間才被正式移除。

  • Hadoop的核心是分佈式文件系統HDFS和MapReduce。

4 MapReduce

4.1 MapReduce

(1)MapReduce是對並行計算的封裝,是用戶通過一些簡單的邏輯即可完成複雜的並行運算。將一個大的運算任務分解到集羣的每個結點上,充分運用集羣資源,縮短運行時間。
(2)MapReduce的數據模型:將數據抽象爲一系列鍵值對,在處理過程中對鍵值對進行轉換。
在這裏插入圖片描述
(3)MapReduce的計算模型:
# 邏輯計算模型:將複雜的、運行於大規模集羣上的並行計算過程高度地抽象爲Map和Reduce兩個過程。
# 物理計算模型:MapReduce採用“分而治之”策略,將一個分佈式文件系統中的大規模數據集,分成許多獨立的分片。這些分片可以被多個Map任務並行處理。
# MapReduce框架採用了Master/Slave架構,包括一個Master和若干個Slave。Master上運行JobTracker,Slave運行TaskTracker
(4)MapReduce的架構:
# JodTracker:集羣資源管理(負責集羣資源的分配、監控TaskTracker狀況、資源使用量等信息);集羣作業管理(將Job作業拆分爲Task,跟蹤Job和Task的執行進度等信息)
# TaskTracker:結點任務管理(與JobTracker心跳機制通信,接受JobTracker命令並執行Map或Reduce任務,資源劃分,定時向JobTracker彙報資源使用情況)
# 客戶端(Client):提交作業(用戶提交的程序通過Client提交到JobTracker);作業查看(用戶通過Client接口查看作業運行狀態)

4.2 MapReduce運行過程

(1)客戶端提交作業信息到HDFS;
(2)客戶端提交作業給JobTracker;
(3)JobTracker讀取作業信息,生成一系列的Map和Reduce任務,調度給空閒的TaskTracker;
(4)TaskTracker啓動Map任務,並從HDFS中讀取數據,執行期間每次心跳向JodTracker發送狀態和任務完成進度;
# 讀取HDFS文件,並每行解析爲<k,v>,每個鍵值對調用一次map函數
# 然後處理,轉換爲新的<k,v>
# 然後對新的鍵值對進行分區,對不同分區內的數據按照k進行排序、分組(相同k的所有v放在一起)
# 對分組後的數據進行歸約。
(5)Map執行完後,JobTracker將Reduce任務分配給TaskTracker,並啓動進程執行Reduce任務,執行過程中心跳向JobTracker發送狀態和進度:
# 根據Map的輸出,按照不同的分區,複製到不同的Reduce結點上;
# 然後進行合併、排序,得到新的<k,v>並寫入HDFS中。
(6)Reduce完成後,將結果寫入HDFS中,任務結束。
在這裏插入圖片描述

4.3 MapReduce原理

(1)Map邏輯過程:[k1,v1]->list([k2,v2])
(2)Map物理過程:
在這裏插入圖片描述
(4)shuffle邏輯過程:
在這裏插入圖片描述
(5)Reduce邏輯過程:
在這裏插入圖片描述(6)Reduce物理過程:
在這裏插入圖片描述

4.4 MapReduce容錯

(1)JobTracker故障:其發生故障後,所有作業需要重新執行;
(2)TaskTracker故障:其發生故障時,JobTracker不會收到心跳;JobTracker會安排其他TaskTracker運行失敗的作業;整個過程對永不是透明的
(3)Task故障:重新執行Map任務;重新讀取HDFS數據;如果任務經過多次嘗試後依然失敗,則任務被標記爲失敗。

5 批處理系統Spark

5.1 Spark及其設計思想

(1)Spark最初是基於內存計算的大數據並行計算框架,用於構建大型的,低延遲的數據分析應用程序;
(2)Spark具有如下幾個特點:運行速度快;容易使用;通用性;運行模式多樣;
(3)MapReduce侷限性:用戶編程複雜;磁盤IO開銷大,延遲高;多個作業之間的銜接涉及IO開銷;
(4)數據模型RDD(彈性分佈式數據集):具有可恢復的容錯性;每個RDD可分爲多個分區,不同分區可存在集羣的不同節點上;每個分區是一個數據集片段;
# 在物理存儲中,每個分區指向一個存儲在內存或者硬盤中的數據塊 (Block) ,其實這個數據塊就是每個 task 計算出的數據塊,它們可以分佈在不同的節點上。所以,RDD 只是抽象意義的數據集合,分區內部並不會存儲具體的數據,只會存儲它在該 RDD 中的 index,通過該 RDD 的 ID 和分區的 index 可以唯一確定對應數據塊的編號,然後通過底層存儲層的接口提取到數據進行處理。
# RDD是隻讀的對象集合,一經創建不可修改。由於已有的 RDD 是不可變的,所以只有對現有的RDD進行轉化操作,才能得到新的RDD。在 RDD 的計算過程中,不需要立刻去存儲計算出的數據本身,我們只要記錄每個 RDD 是經過哪些轉化操作得來的,即:依賴關係,這樣一方面可以提高計算效率,一方面是錯誤恢復會更加容易。如果在計算過程中,第 N 步輸出的 RDD 的節點發生故障,數據丟失,那麼可以根據依賴關係從第 N-1 步去重新計算出該 RDD,這也是 RDD 叫做"彈性"分佈式數據集的一個原因;
# RDD遵循函數式編程(對於變量的操作不是修改已有值,而是創建新值);
# RDD是可並行處理的。
(4)計算模型DAG:
# RDD操作支持數據運算有轉換(transformation)和動作(action)
#邏輯計算模型(左圖)和對應的物理計算模型(右圖)
在這裏插入圖片描述
在這裏插入圖片描述

5.2 Spark體系架構

(1)Cluster Manager(集羣管理器):負責管理整個系統的資源,監控工作節點
(2)Executor(執行器):負責執行任務,運行在工作節點(Worker Node)上的進程
(3)Driver(驅動器):負責啓動應用程序的主函數並管理作業運行
在這裏插入圖片描述
(4)Spark與Hadoop對比:
在這裏插入圖片描述

5.3 Spark工作原理

(1)Driver創建SparkContext進行資源申請、任務分配和監控,根據RDD的依賴關係構建DAG,交給DAGScheduler劃分stage(task/taskSet),並將每個stage分配給TaskScheduler;
在這裏插入圖片描述
# 劃分stage:在DAG中反向解析,遇到寬依賴就劃分,遇到窄依賴就加入stage;
# 一個stage內部特點:所有依賴關係都是窄依賴,可採用流水線方式;
# 不同stage之間特點:所有依賴關係都是寬依賴,只能使用shuffle方式;
# Spark的Task有兩種:ShuffleMapTask和ResultTask,其中後者在DAG最後一個階段推送給Executor,其餘所有階段推送的都是ShuffleMapTask
在這裏插入圖片描述
(2)資源管理器爲Executor分配資源,並啓動Executor進程;
(3)Executor向SparkContext申請Task,SparkContext根據Task Scheduler按照stage的拓撲順序將應用程序分發給Executor執行
(4)執行結束後寫入數據並釋放

5.4 Spark應用、作業與任務之間的關係:

(1)應用:用戶編寫的應用程序;
(2)Job(基本調度單位):一個Job包含多個RDD及作用於相應RDD轉換操作,其中最後一個爲action;
(3)Stage:一個Job會分爲多組Task;
(4)Task:運行在Executor上的工作單元

5.5 Spark容錯

(1)RDD提供持久化接口;
(2)RDD的Lineage 機制:RDD的Lineage記錄的是粗顆粒度的特定數據Transformation操作(如filter、map、join等)行爲,當這個RDD的部分分區數據丟失時,它可以通過Lineage獲取足夠的信息來重新運算和恢復丟失的數據分區。
# 窄依賴:當一個節點數據丟失,可檢查對應父節點RDD的partition是否存在,若存在則執行RDD操作,否則重構父親RDD對應的partition;
# 寬依賴:當一個節點數據丟失,可檢查對應父節點RDD的partition是否存在,若存在則執行RDD操作,否則重構整個父親RDD對應的partition;
(4)RDD檢查點機制:將RDD寫入外部可靠的分佈式文件系統(例如HDFS)


分佈式大數據處理系統大綱


  博客記錄着學習的腳步,分享着最新的技術,非常感謝您的閱讀,本博客將不斷進行更新,希望能夠給您在技術上帶來幫助。喜歡請關注+點贊o( ̄▽ ̄)d

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