Spark系列 - (1) Spark基礎

Spark

1. Spark基礎

Spark是一種基於內存的快速、通用、可擴展的大數據分析引擎。

下圖是Spark的發展歷史,

1.1 Spark核心模塊

  • Spark Core:實現了 Spark 的基本功能,包含任務調度、內存管理、錯誤恢復、與存儲 系統交互等模塊。Spark Core 中還包含了對彈性分佈式數據集(Resilient Distributed DataSet,簡稱 RDD)的 API 定義。

  • Spark SQL:是 Spark 用來操作結構化數據的程序包。通過 Spark SQL,我們可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)來查詢數據。Spark SQL 支持多種數據源, 比如 Hive 表、Parquet 以及 JSON 等。

  • Spark Streaming:是 Spark 提供的對實時數據進行流式計算的組件。提供了用來操作數據流的 API,並且與 Spark Core 中的 RDD API 高度對應。

  • Spark MLlib:提供常見的機器學習(ML)功能的程序庫。包括分類、迴歸、聚類、協同 過濾等,還提供了模型評估、數據 導入等額外的支持功能。

  • 集羣管理器:Spark 設計爲可以高效地在一個計算節點到數千個計算節點之間伸縮計 算。爲了實現這樣的要求,同時獲得最大靈活性,Spark 支持在各種集羣管理器(Cluster Manager)上運行,包括 Hadoop YARN、Apache Mesos,以及 Spark 自帶的一個簡易調度器,叫作獨立調度器。

Spark特點:

1)快:與Hadoop的MapReduce相比,Spark基於內存的運算要快100倍以上,基於硬盤的運算也要快10倍以 上。Spark實現了高效的DAG執行引擎,可以通過基於內存來高效處理數據流。計算的中間結果是存在於內存中 的。

2)易用:Spark支持Java、Python和Scala的API,還支持超過80種高級算法,使用戶可以快速構建不同的應 用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在這些Shell中使用Spark集羣來驗證解決問 題的方法。

3)通用:Spark提供了統一的解決方案。Spark可以用於批處理、交互式查詢(Spark SQL)、實時流處理 (Spark Streaming)、機器學習(Spark MLlib)和圖計算(GraphX)。這些不同類型的處理都可以在同一個應 用中無縫使用。減少了開發和維護的人力成本和部署平臺的物力成本。

4)兼容性:Spark可以非常方便地與其他的開源產品進行融合。比如,Spark可以使用Hadoop的YARN和 Apache Mesos作爲它的資源管理和調度器,並且可以處理所有Hadoop支持的數據,包括HDFS、HBase等。這對 於已經部署Hadoop集羣的用戶特別重要,因爲不需要做任何數據遷移就可以使用Spark的強大處理能力

1.2 Spark與Hadoop的區別

Hadoop是一種分佈式存儲系統,而Spark是一種分佈式計算框架。與其說是Spark和Hadoop的區別,倒不如說是Map Reduce和Spark的區別。

下圖展示了兩者最主要的區別,

  • MapReduce慢的原因:頻繁讀寫磁盤導致額外的複製,序列化和磁盤IO開銷。

  • Spark爲何快:內存計算+DAG(delay scheduling)

比較項目 Map Reduce Spark
框架 MapReduce由Map和Reduce兩個階段組成,並且通過Shuffle將兩個階段連接起來。(套用MapReduce模型解決問題,不得不將問題分解爲若干個有依賴關係的子問題,每個子問題對應一個MapReduce作業,最終所有作業形成一個DAG) Spark是通用的DAG框架,可以將多個有依賴關係的作業轉換成一個大的DAG。(核心思想是將Map和Reduce兩個操作進一步拆分爲多個元操作,並通過一些控制程序組裝後形成一個大的DAG作業。)
中間結果存儲方式(最大區別) Map 步驟是在不同機器上獨立且同步運行的,它的主要目的是將數據轉換爲 key-value 的形式;而 Reduce 步驟是做聚合運算,它也是在不同機器上獨立且同步運行的。Map 和 Reduce 中間夾雜着一步數據移動,也就是 shuffle,這步操作會涉及數量巨大的網絡傳輸(network I/O),需要耗費大量的時間。 由於 MapReduce 的框架限制,一個 MapReduce 任務只能包含一次 Map 和一次 Reduce,計算完成之後,MapReduce 會將運算結果寫回到磁盤中(更準確地說是分佈式存儲系統)供下次計算使用。這樣的讀寫數據會引起大量的網絡傳輸以及磁盤讀寫,極其耗時,而且它們都是沒什麼實際價值的廢操作。 在Spark中,使用內存(內存不夠使用本次磁盤)替代了使用HDFS存儲中間結果。對於迭代運算效率更高。
操作模型 Hadoop只提供了Map和Reduce兩種操作,所有作業都得轉換成Map和Reduce的操作 Spark提供了多種數據集操作類型,比如transformation包括map,filter,groupByKey等,actions操作包括Count,collect,reduce,lookup等等。
應用場景 離線大規模分析處理 Hadoop適用的場景基本都合適,特別對於迭代計算相比Hadoop有更大的優勢。(只有map操作或者只有一次reduce操作的場景下,兩種性能差別不大。)

總結:Spark採用更先進的架構,在靈活性、易用性、性能等方面都比MapReduce更有優勢,有取代MapReduce的趨勢,但hdfs和yarn依然有其不可替代的作用。

1.3 Spark的4種運行模式

目前Spark的運行模式主要有以下4種:

  • local:主要用於開發調試Spark應用程序
  • Standlone:利用Spark自帶的資源管理與調度器運行Spark集羣,採用Master/Slave結構,爲解決單點故障,可以採用Zookeeper實現高可靠(High Availability, HA)
  • Apache Mesos:運行在著名的Mesos資源管理框架基礎之上,該集羣運行模式將資源管理管理交給Mesos,Spark只負責運行任務調度和計算
  • Hadoop YARN:集羣運行在Yarn資源管理器上,資源管理交給YARN,Spark只負責進行任務調度和計算。

一個完整的Spark應用程序,在提交集羣運行時,它涉及到如下圖所示的組件:

每個Spark應用都由一個驅動器程序(drive program)來發起集羣上的各種並行操作。驅動器程序包含應用的main函數,驅動器負責創建SparkContext,SparkContext可以與不同種類的集羣資源管理器(Cluster Manager),例如Hadoop YARN,Mesos進行通信,獲取到集羣進行所需的資源後,SparkContext將得到集羣中工作節點(Worker Node)上對應的Executor(不同的Spark程序有不同的Executor,他們之間是相互獨立的進程,Executor爲應用程序提供分佈式計算以及數據存儲功能),之後SparkContext將應用程序代碼發送到各Executor,最後將任務(Task)分配給executors執行。

  • ClusterManager:在Standalone模式中即爲Master節點(主節點),控制整個集羣,監控Worker.在YARN中爲ResourceManager
  • Worker:從節點,負責控制計算節點,啓動Executor或Driver。在YARN模式中爲NodeManager,負責計算節點的控制。
  • Driver:運行Application的main()函數並創建SparkContect。
  • Executor:執行器,在worker node上執行任務的組件、用於啓動線程池運行任務。每個Application擁有獨立的一組Executor。
  • SparkContext:整個應用的上下文,控制應用的生命週期。
  • RDD:Spark的計算單元,一組RDD可形成執行的有向無環圖RDD Graph。
  • DAG Scheduler:根據作業(Job)構建基於Stage的DAG,並提交Stage給TaskScheduler。
  • TaskScheduler:將任務(Task)分發給Executor。
  • SparkEnv:線程級別的上下文,存儲運行時的重要組件的引用。

SparkEnv內構建幷包含如下一些重要組件的引用。

1、MapOutPutTracker:負責Shuffle元信息的存儲。
2、BroadcastManager:負責廣播變量的控制與元信息的存儲。
3、BlockManager:負責存儲管理、創建和查找快。
4、MetricsSystem:監控運行時性能指標信息。
5、SparkConf:負責存儲配置信息。

接下來介紹的4種運行模式,都遵循了下圖所示的通用運行流程,

任務提交後,都會先啓動Driver進程,隨後Driver進程向集羣管理器註冊應用程序,之後集羣管 理器根據此任務的配置文件分配Executor並啓動,當Driver所需的資源全部滿足後,Driver開始執行main函數,Spark查詢爲懶執行,當執行到action算子時開始反向推算,根據寬依賴進行 stage的劃分,隨後每一個stage對應一個taskset,taskset中有多個task,根據本地化原則,task會被分發到指定的Executor去執行,在任務執行的過程中,Executor也會不斷與Driver進行通信,報告任務運行情況。

1.3.1 Local模式

Local模式就是運行在一臺計算機上的模式,通常就是用於在本機上練手和測試。 它可以通過以下集中方式設置Master。

local: 所有計算都運行在一個線程當中,沒有任何並行計算,通常我們在本機執行 一些測試代碼,或者練手,就用這種模式;

local[K]: 指定使用幾個線程來運行計算,比如local[4]就是運行4個Worker線程。通 常我們的Cpu有幾個Core,就指定幾個線程,最大化利用Cpu的計算能力;

local[*]: 這種模式直接幫你按照Cpu最多Cores來設置線程數了。

提交任務的簡易流程如下:

其中最重要的角色就是driver和executor。

Driver(驅動器)

Spark 的驅動器是執行開發程序中的 main 方法的進程。它負責開發人員編寫的用來創 建 SparkContext、創建 RDD,以及進行 RDD 的轉化操作和行動操作代碼的執行。如果你 是用 spark shell,那麼當你啓動 Spark shell 的時候,系統後臺自啓了一個 Spark 驅動器程 序,就是在 Spark shell 中預加載的一個叫作 sc 的 SparkContext 對象。如果驅動器程序終 止,那麼 Spark 應用也就結束了。主要負責:

1)把用戶程序轉爲任務
2)跟蹤 Executor 的運行狀況
3)爲執行器節點調度任務
4)UI 展示應用運行狀況

Executor(執行器)

Spark Executor 是一個工作進程,負責在 Spark 作業中運行任務,任務間相互獨立。 Spark 應用啓動時,Executor 節點被同時啓動,並且始終伴隨着整個 Spark 應用的生命周 期而存在。如果有 Executor 節點發生了故障或崩潰,Spark 應用也可以繼續執行,會將出 錯節點上的任務調度到其他 Executor 節點上繼續運行。主要負責:

1)負責運行組成 Spark 應用的任務,並將結果返回給驅動器進程;
2)通過自身的塊管理器(Block Manager)爲用戶程序中要求緩存的 RDD 提供內存式存儲。RDD 是直接緩存在 Executor 進程內的,因此任務可以在運行時充分利用緩存數據加速運算。

下面以最簡單的wordCount程序爲例,說明整個數據流程。


1.3.2 Standalone模式

構建一個由 Master+Slave 構成的 Spark 集羣,Spark 運行在集羣中。整個運行流程如下:

這種模式下,可以利用Zookeeper進行HA配置。

1.3.3 Yarn模式

此模式下,Spark客戶端直接連接Yarn,不需要額外構建Spark集羣,有yarn-client和yarn-cluster兩種模式。主要區別在於:Driver程序的運行節點。

  • yarn-client:Driver 程序運行在客戶端,適用於交互、調試,希望立即看到 app 的輸出。
  • yarn-cluster:Driver 程序運行在由 RM(ResourceManager)啓動的 AP(APPMaster),適用於生產環境。

1.3.4 Mesos模式

Spark 客戶端直接連接 Mesos;不需要額外構建 Spark 集羣。國內應用比較少,更多的 是運用 yarn 調度。

1.3.5 總結

幾種模式的對比如下:

1.4 Spark重要概念

  • SparkContext 是程序運行調度的核心,由高層調度器DAGScheduler劃分程序的每個階段,底層調度器

  • TaskScheduler劃分每個階段的具體任務。

  • SchedulerBankend 管理整個集羣中爲正在運行的程序分配的計算資源Executor。

  • DAG (Directed Acyclic Graph)有向無環圖。Spark實現了DAG計算模型,DAG計算模型是指將一個計算任務按照計算規則分解爲 若干子任務,這些子任務之間根據邏輯關係構建成有向無環圖

  • RDD (Resilient Distributed Dataset)彈性分佈數據集。是不可變的、Lazy級別的、粗粒度的 (數據集級別的而不是單個數據級別的)數據集合,包含一個或多個數據分片,即Partition。

  • DAGScheduler 負責高層調度,劃分Stage並生成程序運行的有向無環圖。

  • TaskScheduler 負責具體Stage內部的底層調度,具體Task的調度、容錯等

  • Job (正在執行的叫ActiveJob)是Top-level的工作單元,每個Action算子都會觸發一次Job,一個Job可能包含一個或多個Stage

  • Stage 是用來計算中間結果的Tasksets。Tasksets中的Task邏輯對於同一RDD內的不同Partition都一樣。Stage在Shuffle的地方產生,此時下一個Stage要用到上一個Stage的全部數據,所以要等上一個Stage全部執行完才能開始。Stage有兩種: ShuffleMapStage和ResultStage,除了最後一個Stage是ResultStage外,其他的Stage都是ShuffleMapStage。 ShuffleMapStage會產生中間結果,以文件的方式保存在集羣裏,Stage經常被不同的Job共享,前提是這些Job重用了同一個RDD。

  • Task任務執行的工作單位,每個Task會被髮送到一個節點上,每個Task對應RDD的一個Partition。Taskset劃分的Stage會轉換成一組相關聯的任務集。

  • Transformation和Action Transformation算子會由DAGScheduler劃分到pipeline中,是Lazy級別的不會觸發任務的執行;Action算子會觸發Job來執行pipeline中的運算。


搜索『後端精進之路』並關注,立刻獲取最新文章和價值2000元的BATJ精品面試課程

後端精進之路.png

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