開源組件系列(12):DAG計算引擎Spark

目錄

(一)概述

(二)Spark核心概念

(三)Spark程序基本框架

(四)Spark編程接口

(五)Spark運行模式

(六)Spark應用示例

(七)Spark作業生命週期

(八)Spark Shuffle


(一)概述

 

Spark是在MapReduce的基礎上產生的,借鑑了大量MapReduce實踐經驗,並引入多種新型設計思想和優化策略。我們首先看一下MapReduce的侷限和Spark在此基礎上做出的改進。

 

MapReduce的缺陷:

1.僅支持Map和Reduce兩種操作:由於MapReduce提供的編程結果比較低層次,因而實現一些常用的功能,如排序、分組等,需要編寫大量的代碼。

2.處理效率低:每次啓動MapReduce均需要消耗大量資源,對於複雜的Hive Sql,需要拆解成多個MapReduce作業。

3.不適合迭代式和交互式計算:MapReduce是一種基於磁盤的分佈式計算框架,追求的是高吞吐率而非高性能,因此在迭代式(機器學習)和交互式(點擊日誌分析)等場景下表現並不好。

 

Spark的特點:

1.高性能:Spark採用內存計算引擎,允許用戶將數據放到內存中以加快數據讀取;同時,Spark提供了更加通用的DAG計算引擎,使得數據可通過本地磁盤或內存流向不同的計算單元。

2.簡單易用:Spark提供了豐富的高層次API,包括sortByKey、groupByKey等操作,並且提供了四種編程語言API:Scala、Python、Java和R,從代碼量看,Spark比MapReduce少2~5倍。

3.與Hadoop完好集成:Spark作爲新型框架,可以部署在YARN集羣桑,讀取和存儲HDFS/HBase中的數據。

 

(二)Spark核心概念

 

1.RDD

Spark提出了一個數據集抽象概念RDD,即彈性分佈式數據集,它是一個只讀的、帶分區的數據集合,並支持多種分佈式算子。RDD是Spark計算引擎的核心,具有以下幾個特點:

(1)分佈在集羣中的只讀對象集合,由多個Partition構成,這些Partition可能存儲在不同機器上。

(2)RDD可以存儲在磁盤或內存中,Partition可全部存儲在內存或磁盤上,也可以部分在內存中,部分在磁盤上。

(3)通過並行“轉換”操作構造:Spark提供了大量API聽過並行的方式構造和生成RDD。

(4)失效後自動重構:RDD可通過一定計算方式轉換成另外一種RDD,這種通過轉換而產生的RDD關係稱爲“血統”。Spark通過記錄RDD的血統,可瞭解每個RDD的產生方式,進而能夠通過重算的方式構造因機器故障或磁盤損壞而丟失的RDD數據。

RDD只是一個邏輯概念,它可能並不對應磁盤或內存中的物理數據,而僅僅是記錄了RDD的由來,RDD由五個部分組成:一組partition、每個partition的計算函數、所依賴的RDD列表、對於key-value類型的RDD包含一個partitioner(默認是hash)、計算每個partition所傾向的節點位置。

作用在RDD上的操作主要分爲兩類:transformation和action:transformation是轉換的意思,主要作用爲將一種RDD轉換爲另一類RDD。action是行動的意思,通過處理RDD得到一個或一組結果。

 

2.DAG

Spark是一個通用的DAG引擎,這使得用戶能夠在一個應用程序中描述複雜的邏輯,以便於優化整個數據流,並讓不同計算階段直接通過本地磁盤或內存交換數據,而不是像MapReduce那樣需要通過HDFS。以下面的SQL語句爲例:

下面左圖是MapReduce生成的DAG數據流,右圖是Spark生成的DAG數據流。

可以看出,Spark的實現要簡潔的多,內部不同計算單元通過本地磁盤或內存交換數據,使得磁盤和網絡IO的消耗更小,性能更加高效。

 

(三)Spark程序基本框架

 

每個Spark應用程序的運行環境是由一個Driver進程和多個Executor進程構成的,它們運行在不同機器上,並通過網絡相互通信。Driver進程運行用戶程序,並依次經歷邏輯計劃生成、物理計劃生成、任務調度等階段後,將任務分配到各個Executor上執行。Executor進程擁有獨立計算資源的JVM實例,其內部以線程方式運行Driver分配的任務。下圖展示了一個Spark應用程序的運行環境,由1個Driver和3個Executor構成,每個Executor內部可同時運行4個任務。

 

(四)Spark編程接口

 

Spark程序設計流程一般如下:

1.實例化SparkContext對象:SparkContext封裝了程序運行的Context,包括配置信息、數據塊管理、任務調度器等;

2.構造RDD:可通過SparkContext提供的函數構造RDD,常見的RDD構造方式分爲兩種:將Scala集合轉換爲RDD和將Hadoop文件轉換爲RDD;

 

3.在RDD的基礎上,通過Spark提供的transformation算子完成數據處理邏輯;

4.通過action算子將最終RDD作爲結果直接返回或者保存到文件中。

 

(五)Spark運行模式

 

Spark支持的運行模型包括:

1.Local:本地模式,將Driver與Executor均運行在本地。

2.Standalone:由一個master和多個slave服務組成的Spark獨立集羣運行環境,Spark應用程序的Driver與Executor運行在該集羣環境中。

3.YARN:將Hadoop YARN作爲資源管理和調度系統,讓Spark程序運行在YARN之上。根據Driver是否由YARN管理,可以進一步分爲yarn-client和yarn-cluster兩種模式。

4.Mesos:將Apache Mesos作爲資源管理和調度系統,用戶可通過設置master url的方式,指定Spark應用程序的運行模式。

 

(六)Spark應用示例

 

以倒排索引爲例:

 

(七)Spark作業生命週期

 

Spark應用程序從提交到運行,依次會經歷以下幾個階段:

1.生成邏輯計劃:通過應用程序內部RDD之間的依賴關係,構造DAG,其中DAG中每個點事一個RDD對象,邊則是兩個RDD之間的轉換方式。簡而言之,該階段主要作用是將用戶程序直接翻譯成DAG。

2.生成物理計劃:根據前一階段生成的DAG,按照一定的規則進一步將之劃分爲若干Stage,每個Stage由若干個可並行計算的任務構成。

3.調度並執行任務:按照依賴關係,調度並計算每個Stage,對於給定的Stage,將其對應的任務調度給多個Executor同時計算。

 

(八)Spark Shuffle

 

Shuffle階段是Spark應用程序最關鍵的計算和數據交換環節,Spark中很多算子會產生Shuffle階段,包括:*ByKey(groupByKey、reduceByKey、sortByKey等)、join、cogroup、cartesian和repartition等,下面代碼片段給出了reduceByKey算子的使用方式哦、

下圖給出了上述代碼的邏輯計劃圖,其中reduceByKey算子會產生一個Shuffle階段,其輸入RDD爲kvRdd,輸出RDD爲resultRdd,兩者之間生成了兩個臨時的RDD,並通過網絡進行數據交換。本質上,這是一個兩階段的執行過程,與MapReduce基本一致:第一類任務並行從輸入目錄中讀取與處理數據,之後啓動另一類任務讀取前一類任務的輸出結果,並進行規約,將最終結果寫到輸出目錄中。

 

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