Spark基礎到高階 第一課 spark概述
一 Spark介紹-spark的基本架構及相關原理
1.1 spark簡介
spark是一個實現快速通用的叢集計算平臺。它是由加州大學伯克利分校AMP實驗室 開發的通用記憶體平行計算框架,用來構建大型的、低延遲的資料分析應用程式。它擴充套件了廣泛使用的MapReduce計算
模型。高效的支撐更多計算模式,包括互動式查詢和流處理。spark的一個主要特點是能夠在記憶體中進行計算,依賴磁碟進行復雜的運算,Spark依然比MapReduce更加高效。
1.2 Spark的架構
Spark組成(BDAS):全稱伯克利資料分析棧,通過大規模整合演算法、機器、人之間展現大資料應用的一個平臺。也是處理大資料、雲端計算、通訊的技術解決方案。
它的主要元件如圖所示:
Spark Core:
包含Spark的基本功能;尤其是定義RDD的API、操作以及這兩者上的動作。其他Spark的庫都是構建在RDD和Spark Core之上的 Spark SQL:
提供通過Apache Hive的SQL變體Hive查詢語言(HiveQL)與Spark進行互動的API。每個資料庫表被當做一個RDD,Spark SQL查詢被轉換為Spark操作。 Spark Streaming:
對實時資料流進行處理和控制。Spark Streaming允許程式能夠像普通RDD一樣處理實時資料 MLlib:
一個常用機器學習演算法庫,演算法被實現為對RDD的Spark操作。這個庫包含可擴充套件的學習演算法,比如分類、迴歸等需要對大量資料集進行迭代的操作。 GraphX:
控制圖、並行圖操作和計算的一組演算法和工具的集合。GraphX擴充套件了RDD API,包含控制圖、建立子圖、訪問路徑上所有頂點的操作
1.3 spark的組成架構
spark遵循簡單的主從架構,這裡為大家做1個簡單的描述
- Cluster Manager:
- 在standalone模式中即為Master主節點,控制整個叢集,監控worker。在YARN模式中為資源管理器
- Worker節點:
- 從節點,負責控制計算節點,啟動Executor或者Driver。
- Driver: 執行Application 的main()函式
- Executor:執行器,是為某個Application執行在worker node上的一個程序
1.4Spark和hadoop生態圈
首先我們需要明確一點,spark並不是取代hadoop,只是替代了hadoop的計算引擎
Spark只是替代hadoop的一部分,也就是hadoop的相關計算引擎,mr,hive查詢引擎
Spark本身不提供大資料的儲存!
1.5 Spark和hive的關係
spark 可以直接從hive中查詢資料.
結構上Hive On Spark和SparkSQL都是一個翻譯層,spark是把一個SQL翻譯成分散式可執行的Spark程式
hive是把sql翻譯為mr
1.5.1 Hive on Mapreduce和SparkSQL使用場景
Hive on Mapreduce場景 Hive的出現可以讓那些精通SQL技能、但是不熟悉MapReduce 、程式設計能力較弱與不擅長Java語言的使用者能夠在HDFS大規模資料集上很方便地利用SQL 語言查詢、彙總、分析資料,畢竟精通SQL語言的人要比精通Java語言的多得多 Hive適合處理離線非實時資料 SparkSQL場景 Spark既可以執行本地local模式,也可以以Standalone、cluster等多種模式執行在Yarn、Mesos上,還可以執行在雲端例如EC2。此外,Spark的資料來源非常廣泛,可以處理來自HDFS、HBase、 Hive、Cassandra、Tachyon上的各種型別的資料。 實時性要求或者速度要求較高的場所
1.5.2 Hive on Mapreduce和SparkSQL效能對比
大家可以參考過往記憶的部落格:
結論:sparksql和hive on spark時間差不多,但都比hive on mapreduce快很多,官方資料認為spark會被傳統mapreduce快10-100倍
1.6 Spark提升
1.6.1 常見術語介紹
- Application:
- Appliction都是指使用者編寫的Spark應用程式,其中包括一個Driver功能的程式碼和分佈在叢集中多個節點上執行的Executor程式碼
- Driver:
- Spark中的Driver即執行上述Application的main函式並建立SparkContext,建立SparkContext的目的是為了準備Spark應用程式的執行環境,在Spark中有SparkContext負責與ClusterManager通訊,進行資源申請、任務的分配和監控等,當Executor部分執行完畢後,Driver同時負責將SparkContext關閉,通常用SparkContext代表Driver
- Executor:
- 某個Application執行在worker節點上的一個程序, 該程序負責執行某些Task, 並且負責將資料存到記憶體或磁碟上,每個Application都有各自獨立的一批Executor, 在Spark on Yarn模式下,其程序名稱為CoarseGrainedExecutor Backend。一個CoarseGrainedExecutor Backend有且僅有一個Executor物件, 負責將Task包裝成taskRunner,並從執行緒池中抽取一個空閒執行緒執行Task, 這個每一個oarseGrainedExecutor Backend能並行執行Task的數量取決與分配給它的cpu個數
- Cluter Manager:
- 指的是在叢集上獲取資源的外部服務。目前有三種類型
-
- Standalon : spark原生的資源管理,由Master負責資源的分配
- Apache Mesos:與hadoop MR相容性良好的一種資源排程框架
- Hadoop Yarn: 主要是指Yarn中的ResourceManager
- Worker: 叢集中任何可以執行Application程式碼的節點,在Standalone模式中指的是通過slave檔案配置的Worker節點,在Spark on Yarn模式下就是NoteManager節點
- Task: 被送到某個Executor上的工作單元,但hadoopMR中的MapTask和ReduceTask概念一樣,是執行Application的基本單位,多個Task組成一個Stage,而Task的排程和管理等是由TaskScheduler負責
- Job: 包含多個Task組成的平行計算,往往由Spark Action觸發生成, 一個Application中往往會產生多個Job
- Stage: 每個Job會被拆分成多組Task, 作為一個TaskSet, 其名稱為Stage,Stage的劃分和排程是有DAGScheduler來負責的,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種,Stage的邊界就是發生shuffle的地方
- DAGScheduler: 根據Job構建基於Stage的DAG(Directed Acyclic Graph有向無環圖),並提交Stage給TASkScheduler。 其劃分Stage的依據是RDD之間的依賴的關係找出開銷最小的排程方法,如下圖
- TASKSedulter:
- 將TaskSET提交給worker執行,每個Executor執行什麼Task就是在此處分配的. TaskScheduler維護所有TaskSet,當Executor向Driver發生心跳時,TaskScheduler會根據資源剩餘情況分配相應的Task。另外TaskScheduler還維護著所有Task的執行標籤,重試失敗的Task。下圖展示了TaskScheduler的作用
- 在不同執行模式中任務排程器具體為:
-
- Spark on Standalone模式為TaskScheduler
- YARN-Client模式為YarnClientClusterScheduler
- YARN-Cluster模式為YarnClusterScheduler
- 將這些術語串起來的執行層次圖如下:
- Job=多個stage,Stage=多個同種task, Task分為ShuffleMapTask和ResultTask,Dependency分為ShuffleDependency和NarrowDependency
1.6.2 Spark的執行模式
- Spark的執行模式多種多樣,靈活多變,部署在單機上時,既可以用本地模式執行,也可以用偽分佈模式執行,而當以分散式叢集的方式部署時,也有眾多的執行模式可供選擇,這取決於叢集的實際情況,底層的資源排程即可以依賴外部資源排程框架,也可以使用Spark內建的Standalone模式。
具體來說:
對於外部資源排程框架的支援,目前的實現包括相對穩定的Mesos模式,以及hadoop YARN模式
本地模式:常用於本地開發測試,本地還分別 local 和 local cluster
standalone: 獨立叢集執行模式
Mesos:Spark可以執行在Mesos裡面(Mesos 類似於yarn的一個資源排程框架)
standalone:Spark自己可以給自己分配資源(master,worker)
YARN:Spark可以執行在yarn上面