本文爲 對劉鵬著《大數據庫》一書學習後對課後部分習題的個人理解,歡迎同學們與我討論。
1. 簡述Spark的定義。
Spark是基於內存計算的大數據並行計算框架。Spark基於內存計算,提高了在大數據環境下數據處理的實時性,同時保證了高容錯性和高可伸縮性,允許用戶將Spark部署在大量廉價硬件之上,形成集羣。
2. 對比Spark和Hadoop,分別指出兩者之間的區別。
- Spark是一個計算框架;Hadoop的兩個核心組件是分佈式計算框架MapReduce和分佈式文件系統HDFS,Hadoop還包括在其生態系統上的其他系統,如HBase、Hive等。
- Spark是MapReduce的升級方案,其兼容HDFS、Hive等分佈式存儲層,可融入Hadoop的生態系統,以彌補缺失MapReduce的不足,與Hadoop的MapReduce相比,Spark有以下優勢:
-
中間結果不輸出到磁盤上
Spark提供了內存計算,可將中間結果放到內存中,對於迭代運算效率更高。Hadoop需要將計算的中間結果輸出到磁盤中。
-
RDD方式對數據進行分區和處理
Spark使用RDD(彈性分佈式數據集)對數據進行分區和處理;Hadoop的MapReduce Schema on Read處理方式會引起較大的處理開銷。
RDD提供了一個抽象的數據架構,我們不必擔心底層數據的分佈式特性,只需將具體的應用邏輯表達爲一系列轉換處理,不同RDD之間的轉換操作形成依賴關係,可以實現管道化,避免中間數據存儲。 -
任務執行策略高效
MapReduce再數據Shuffle時需要花費大量時間來排序,Spark可減輕上述問題帶來的開銷。因爲Spark任務再Shuffle中不是所有情景都需要排序,它支持基於Hash的分佈式聚合,調度中採用更爲通用的任務執行計劃圖(DAG),每一輪次的輸出結果都在內存中緩存。
-
任務調度開銷小
傳統的MapReduce系統是爲了運行長達數小時的批量作業而設計的,MapReduce上的不同作業在同一個節點運行時,會各自啓動一個JVM。在某些極端情況下,提交一個任務的延遲非常高。而Spark採用時間驅動的類庫AKKA來啓動任務,通過線程池複用線程以避免進程或線程啓動和切換的開銷,Spark同一節點的所有任務都可以在一個JVM上運行。
3. Spark有那些特性?
- 快速性:使用DAG執行引擎以支持循環數據流與內存計算。
- 易用性:支持使用Scala、Java、Python和R語言進行編程,可以通過Spark Shell進行交互式編程。
- 通用性:Spark提供了完整而強大的技術棧,包括SQL查詢、流式計算、機器學習和圖算法組件。
- 兼容性:可運行於獨立的集羣模式中,可運行於Hadoop中,也可運行於Amazon EC2等雲環境中,並且可以訪問HDFS、Cassandra、HBase、Hive等多種數據源
4. 請分層簡述Spark生態系統BDAS。
- 資源管理層(Resource Scheduling Layer)
- Mesos
- YARN
- Standalone
- 存儲層(Storage Layer)
- HDFS
- Tachyon
- 核心層(Core Computer Layer)
- 應用組建層(Model Layer)
- Spark SQL(支持SQL查詢與分析的查詢引擎)
- Spark Streaming(流計算)
- MLbase(機器學習)
- GraphX
- BlinkDB
- SparkR
5. 簡述Spark的工作流程。
在Spark應用中,整個執行流程在邏輯上會形成有向無環圖(DAG)。Action算子出發之後,將所有累計的算子形成一個DAG,然後由調度器調度該圖上的任務進行運算。Spark的調度方式與MapReduce有所不同。Spark根據RDD之間不同的依賴關係切分形成不同的階段(Stage),一個階段包含一系列函數執行流水線。圖中 A、B、C、D、E、F、G分別代表不同的RDD,RDD內的方框代表分區。數據從HDFS輸入Spark,形成RDD A 和 RDD C,RDD C上執行map操作,轉換爲RDD D,RDD B和RDD F執行join操作,轉換爲RDD G,最後RDD G 通過函數saveAs TextFile輸出並保存到HDFS中。
6. 彈性分佈式數據集(RDD)有哪幾種創建方式?
- 基於程序中的集合創建。
- 基於本地文件創建。
- 從Hadoop文件系統HDFS(或與Hadoop兼容的其他持久化存儲系統,如Hive,HBase)輸入數據創建。
7. 分別簡述Spark算子的作用及分類。
Spark算子大致上可分三大類算子:
- Value數據類型的Transformation算子,這種變換不觸發提交作業,針對處理的數據項是Value型的數據。
- Key-Value數據類型的Transformation算子,這種變換不觸發提交作業,針對處理的數據項是Key-Value型的數據。
- Action算子,這類算子會觸發SparkContext提交作業。
8. Spark工作機制包含哪些模塊?
調度與任務分配、I/O模塊、通信控制模塊、容錯模塊、Shuffle模塊
9. Spark調度機制有哪些運行模式?
Local模式、Standalone模式、YARN模式、Mesos模式。
10. Spark有哪些容錯機制?
- 基於血統的容錯機制(Lineage)
在Spark中RDD具有不變性,在數據處理過程中,Spark通過Lineage圖記錄了各個RDD之間的變換關係,一旦某個數據處理過程出現錯誤,Spark可以根據Lineage圖快速進行容錯恢復。特別是對於map操作來說,當某個節點的任務失敗,Spark只需要重新計算相應分區的數據,而不必將整個任務重新計算。在很多分佈式數據處理系統中通過備份來進行容錯,相比於這種會導致巨大存儲消耗的容錯方式,Spark的Lineage圖只需要十幾kb的存儲空間。Spark允許用戶將數據cache下來,對於將來可能頻繁使用的某個計算結果,將這個RDDcache下來是明智的選擇。
- 檢查點支持(Checkpoint)
雖然 lineage 可用於錯誤後 RDD 的恢復,但對於很長的 lineage 的 RDD 來說,這樣的恢復耗時較長。由此,可以考慮將某些 RDD 進行檢查點操作(Checkpoint)保存到穩定存儲上。 Spark 當前提供了爲 RDD 設置檢查點操作的 API , 讓用戶自行決定需要爲哪些數據設置檢查點操作。 由於 RDD 的只讀特性使得比常用的共享內存更容易做 checkpoint.由於不需要關心一致性的問題,RDD 的寫出可在後臺進行,而不需要程序暫停或進行分佈式快照