其餘更多java基礎文章:
java基礎學習(目錄)html
概述
Spark,是一種通用的大數據計算框架,正如傳統大數據技術Hadoop的MapReduce和Storm流式實時計算引擎等。
Spark包含了大數據領域常見的各類計算框架, 好比:java
- Spark Core用於離線計算
- Spark SQL用於交互式查詢
- Spark Streaming用於實時流式計算
- Spark MLlib用於機器學習
- Spark GraphX用於圖計算
Spark VS MapReduce
這部分因爲水平有限,只能轉至其餘大神的總結web
www.cnblogs.com/deadend/p/6…
blog.csdn.net/wyz05160711…shell
簡單總結一下:多線程
- Spark提供了內存計算,可將中間結果放到內存中,對於迭代運算效率更高
- Spark基於DAG的任務調度執行機制,要優於Hadoop MapReduce的迭代執行機制
- 使用多線程池模型來減小task啓動開稍,shuffle過程當中避免 沒必要要的sort操做以及減小磁盤IO操做,而MapReduce使用多進程模型
- Spark提供了多種語言支持,特別是scala,方便易用
Spark重點概念
- 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, 這個每個CoarseGrainedExecutor Backend能並行運行Task的數量取決與分配給它的cpu個數
- Cluter Manager:指的是在集羣上獲取資源的外部服務。目前有三種類型
- Standalon : spark原生的資源管理,由Master負責資源的分配
- Apache Mesos:與hadoop MR兼容性良好的一種資源調度框架
- Hadoop Yarn: 主要是指Yarn中的ResourceManager
- Worker: 集羣中任何能夠運行Application代碼的節點,在Standalone模式中指的是經過slave文件配置的Worker節點,在Spark on Yarn模式下就是NodeManager節點
- 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(窄依賴)架構
- ResultTask:對於 DAG 圖中最後一個 Stage(也就是 ResultStage),會生成與該 DAG 圖中哦最後一個 RDD (DAG 圖中最後邊)partition 個數相同的 ResultTask
- ShuffleMapTask:對於非最後的 Stage(也就是 ShuffleMapStage),會生成與該 Stage 最後的 RDD partition 個數相同的 ShuffleMapTask
Spark運行模式
Spark的運行模式多種多樣,靈活多變,部署在單機上時,既能夠用本地模式運行,也能夠用僞分佈模式運行,而當以分佈式集羣的方式部署時,也有衆多的運行模式可供選擇,這取決於集羣的實際狀況,底層的資源調度便可以依賴外部資源調度框架,主要有如下3種:app
- local本地模式
- Spark內建的Standalone模式。
- Spark on Yarn模式
- Spark on mesos模式
local模式
此種模式下,咱們只要將Spark包解壓便可使用,運行時Spark目錄下的bin目錄執行bin/spark-shell便可,適合本身練習以及測試的狀況。框架
Spark運行模式(一)-----Spark獨立模式機器學習
Standalone模式
Spark(一): 基本架構及原理分佈式
- Standalone模式使用Spark自帶的資源調度框架
- 採用Master/Slaves的典型架構,選用ZooKeeper來實現Master的HA
- 框架結構圖以下:
- 該模式主要的節點有Client節點、Master節點和Worker節點。其中Driver既能夠運行在Master節點上中,也能夠運行在本地Client端。當用spark-shell交互式工具提交Spark的Job時,Driver在Master節點上運行;當使用spark-submit工具提交Job或者在Eclips、IDEA等開發平臺上使用」new SparkConf.setManager(「spark://master:7077」)」方式運行Spark任務時,Driver是運行在本地Client端上的 運行過程以下圖:
- SparkContext鏈接到Master,向Master註冊並申請資源(CPU Core 和Memory)
- Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪一個Worker上分配資源,而後在該Worker上獲取資源,而後啓動StandaloneExecutorBackend;
- StandaloneExecutorBackend向SparkContext註冊;
- SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;而且SparkContext解析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操做時,就會催生Job;每一個Job中含有1個或多個Stage,Stage通常在獲取外部數據和shuffle以前產生),而後以Stage(或者稱爲TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;
- StandaloneExecutorBackend會創建Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成
- 全部Task完成後,SparkContext向Master註銷,釋放資源
Spark on Yarn模式
Yarn的基本框架能夠閱讀前面的文章Hadoop學習(二)——MapReduce\Yarn架構。
Spark on YARN模式根據Driver在集羣中的位置分爲兩種模式:一種是YARN-Client模式,另外一種是YARN-Cluster(或稱爲YARN-Standalone模式)。
Yarn Client模式
- Spark Yarn Client向YARN的ResourceManager申請啓動Application Master。同時在SparkContent初始化中將建立DAGScheduler和TASKScheduler等,因爲咱們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend
- ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不運行SparkContext,只與SparkContext進行聯繫進行資源的分派
- Client中的SparkContext初始化完畢後,與ApplicationMaster創建通信,向ResourceManager註冊,根據任務信息向ResourceManager申請資源(Container)
- 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通訊,要求它在得到的Container中啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向Client中的SparkContext註冊並申請Task
- client中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向Driver 彙報運行的狀態和進度,以讓Client隨時掌握各個任務的運行狀態,從而能夠在任務失敗時從新啓動任務
- 應用程序運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉本身
YARN-Cluster模式
- Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啓動ApplicationMaster的命令、須要在Executor中運行的程序等
- ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等(Driver)的初始化
- ApplicationMaster向ResourceManager註冊,這樣用戶能夠直接經過ResourceManage查看應用程序的運行狀態,而後它將採用輪詢的方式經過RPC協議爲各個任務申請資源,並監控它們的運行狀態直到運行結束
- 一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通訊,要求它在得到的Container中啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式同樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增長了對Executor的等待邏輯等
- ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而能夠在任務失敗時從新啓動任務
- 應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉本身
Spark Client 和 Spark Cluster的區別:
- 理解YARN-Client和YARN-Cluster深層次的區別以前先清楚一個概念:Application Master。在YARN中,每一個Application實例都有一個ApplicationMaster進程,它是Application啓動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源以後告訴NodeManager爲其啓動Container。從深層次的含義講YARN-Cluster和YARN-Client模式的區別其實就是ApplicationMaster進程的區別
- YARN-Cluster模式下,Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督做業的運行情況。當用戶提交了做業以後,就能夠關掉Client,做業會繼續在YARN上運行,於是YARN-Cluster模式不適合運行交互類型的做業
- YARN-Client模式下,Driver運行在Client客戶端中,Application Master僅僅向YARN請求Executor,Client會和請求的Container通訊來調度他們工做,也就是說Client不能離開
Spark的運行流程
Spark的基本運行流程
spark運行流程圖以下:
- 構建Spark Application的運行環境,啓動SparkContext
- SparkContext向資源管理器(能夠是Standalone,Mesos,Yarn)申請運行Executor資源,並啓動StandaloneExecutorbackend
- Executor向SparkContext申請Task
- SparkContext將應用程序分發給Executor
- SparkContext構建成DAG圖,將DAG圖分解成Stage、將Taskset發送給Task Scheduler,最後由Task Scheduler將Task發送給Executor運行
- Task在Executor上運行,運行完釋放全部資源
RDD的基本運行流程
-
RDD在Spark中運行大概分爲如下三步:
- 建立RDD對象
- DAGScheduler模塊介入運算,計算RDD之間的依賴關係,RDD之間的依賴關係就造成了DAG
- 每個Job被分爲多個Stage。劃分Stage的一個主要依據是當前計算因子的輸入是不是肯定的(寬依賴窄依賴),若是是則將其分在同一個Stage,避免多個Stage之間的消息傳遞開銷
-
示例圖以下:
如下面一個按 A-Z 首字母分類,查找相同首字母下不一樣姓名總個數的例子來看一下 RDD 是如何運行起來的
建立 RDD 上面的例子除去最後一個 collect 是個動做,不會建立 RDD 以外,前面四個轉換都會建立出新的 RDD 。所以第一步就是建立好全部 RDD( 內部的五項信息 )? 建立執行計劃 Spark 會盡量地管道化,並基因而否要從新組織數據來劃分 階段 (stage) ,例如本例中的 groupBy() 轉換就會將整個執行計劃劃分紅兩階段執行。最終會產生一個 DAG(directed acyclic graph ,有向無環圖 ) 做爲邏輯執行計劃
調度任務 將各階段劃分紅不一樣的 任務 (task) ,每一個任務都是數據和計算的合體。在進行下一階段前,當前階段的全部任務都要執行完成。由於下一階段的第一個轉換必定是從新組織數據的,因此必須等當前階段全部結果數據都計算出來了才能繼續