簡介
- Apache Spark 是專為大規(guī)模數(shù)據(jù)處理而設(shè)計的快速通用的計算引擎。
- Spark是UC Berkeley AMP lab (加州大學(xué)伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用并行框架
優(yōu)點
- 快速:spark有先進(jìn)的DAG執(zhí)行引擎接箫,支持循環(huán)數(shù)據(jù)流和內(nèi)存計算伪煤;spark在內(nèi)存中的執(zhí)行速度是MR的100倍,在磁盤上的運(yùn)行速度是MR的10倍
- 易用:SPARK支持使用Java/Scala/Python/Sql語言快速編寫應(yīng)用盯蝴,提供統(tǒng)一API毅哗,使得 編寫應(yīng)用程序更容易。編寫應(yīng)用程序更容易
- 通用:Spark提供了完整而強(qiáng)大的技術(shù)棧捧挺,包括SQL查詢虑绵、流式計算、機(jī)器學(xué)習(xí)和圖算法組件
- 運(yùn)行模式多樣:可運(yùn)行于獨立的集群模式中闽烙,可運(yùn)行于Hadoop中翅睛,也可運(yùn)行于Amazon EC2等云環(huán)境中,并且可以訪問HDFS/Cassandra/HBase/Hive等多種數(shù)據(jù)源
生態(tài)系統(tǒng)
imgTemp.png
- 第一層:各種文件存儲系統(tǒng)
- 第二層:部署模式(詳細(xì)信息下面介紹)
- 第三層:spark core是spark的核心組件黑竞,其操作對象是RDD(彈性分布式數(shù)據(jù)集)捕发,可以說是spark中的離線計算框架
- 第四層:處理流式數(shù)據(jù)的spark streaming;執(zhí)行sql的sparksql摊溶;用于機(jī)器學(xué)習(xí)的MLlib爬骤;用于圖計算的GraphX
術(shù)語介紹
- Application: Spark Application指的是用戶編寫的Spark應(yīng)用程序,包含了一個Driver功能的代碼和分布在集群中多個節(jié)點上運(yùn)行的Executor代碼
- Master:主控節(jié)點莫换,負(fù)責(zé)接收Client提交的作業(yè)霞玄,管理worker,并命令worker啟動Driver和Executor
- Worker:集群中任何可以運(yùn)行Application代碼的節(jié)點拉岁,類似于YARN中的NodeManager節(jié)點坷剧。在Standalone模式中指的就是通過Slave文件配置的Worker節(jié)點
- Driver:一個spark作業(yè)運(yùn)行時包括一個driver進(jìn)程,負(fù)責(zé)DAG圖的構(gòu)成喊暖,Stage的劃分惫企、Task的管理
- Executor: Application運(yùn)行在Worker節(jié)點上的一個進(jìn)程,該進(jìn)程負(fù)責(zé)運(yùn)行Task,并且負(fù)責(zé)將數(shù)據(jù)存在 內(nèi)存或者磁盤上狞尔,每個Apptication都有各自獨立的一批 Executor
- Job: 包含多個Task組成的并行計算丛版,往往由Spark Action觸發(fā)生成, 一個Application中往往會產(chǎn)生多個Job
- Stage: 每個Job會被拆分成多組Task偏序, 作為一個TaskSet页畦, 其名稱為Stage,Stage的劃分和調(diào)度是有DAGScheduler來負(fù)責(zé)的研儒,Stage有非最終的Stage(Shuffle Map Stage)和最終的Stage(Result Stage)兩種豫缨,Stage的邊界就是發(fā)生shuffle的地方
- Task: 被送到某個Executor上的工作單元,但hadoopMR中的MapTask和ReduceTask概念一樣端朵,是運(yùn)行Application的基本單位好芭,多個Task組成一個Stage,而Task的調(diào)度和管理等是由TaskScheduler負(fù)責(zé)
- Local模式:本地模式部署在單機(jī)冲呢,主要用于測試或?qū)嶒炆岚埽蛔詈唵蔚倪\(yùn)行模式,所有進(jìn)程都運(yùn)行在一臺機(jī)器的 JVM 中碗硬;本地模式用單機(jī)的多個線程來模擬Spark分布式計算瓤湘,通常用來驗證開發(fā)出來的應(yīng)用程序邏輯上有沒有問題
- cluster模式:
- standalone:Spark可以通過部署與Yarn的架構(gòu)類似的框架來提供自己的集群模式。該集群模式的架構(gòu)設(shè)計與HDFS和Yarn大致相同恩尾,都是由一個主節(jié)點多個從節(jié)點組成弛说;主:master,從:worker
- spark on yarn:yarn-cluster是基于yarn集群進(jìn)行調(diào)度管理的翰意,yarn集群上有ResourceManager(RM)和NodeManager(NM)兩個角色木人。在YARN中,每個Application實例都有一個Application Master進(jìn)程冀偶,它是Application啟動的第一個容器醒第。它負(fù)責(zé)和ResourceManager打交道,并請求資源进鸠。獲取資源之后告訴NodeManager為其啟動container
- yarn-client與yarn-cluster的區(qū)別:其實就是Application Master(AM)進(jìn)程的區(qū)別(即Driver運(yùn)行在哪)
- yarn-client模式下稠曼,driver運(yùn)行在客戶端,也就是提交作業(yè)的機(jī)器上客年;ApplicationMaster僅僅向YARN請求executor霞幅,client會和請求的container通信來調(diào)度他們工作,也就是說Client不能離開
- yarn-cluster模式下量瓜,driver運(yùn)行在集群的AM中司恳,它負(fù)責(zé)向YARN申請資源,并監(jiān)督作業(yè)的運(yùn)行狀況绍傲;作業(yè)提交完就可以關(guān)掉Client扔傅,作業(yè)會繼續(xù)在YARN上運(yùn)行
任務(wù)提交流程
-
standlone模式(http://spark.apache.org/docs/latest/spark-standalone.html):
- 6264117-7e695db53e63fa44.png
1.spark-submit 提交任務(wù)給 Master
2.Master 收到任務(wù)請求后通過 LaunchDriver 向 Worker 請求啟動 Driver
3.Worker 收到請求后啟動 Driver
4.Driver 啟動后向 Master 注冊(用戶App信息)。
5.Master 收到 App 信息后根據(jù)資源的情況向 Worker 發(fā)送 launchExecutor 啟動 Excutor
6.Worker 收到 Master 的請求后啟動相應(yīng)的 Excutor
7.Excutor 啟動后負(fù)責(zé)與 Driver 通信, 執(zhí)行相關(guān)任務(wù)
-
yarn-cluster模式(http://spark.apache.org/docs/latest/running-on-yarn.html):
- 6264117-9773993abf0e2521.png
- 1.由client向RM提交請求猎塞,并上傳jar到HDFS上试读,這期間包括四個步驟:
- a).連接到RM
- b).從 RM ASM(Applications Manager)中獲得metric、queue和resource等信息
- c).上傳 app jar and spark-assembly jar
- d).設(shè)置運(yùn)行環(huán)境和container上下文(launch-container.sh等腳本)
- 2.ASM 向 Scheduler 申請空閑 container
- 3.Scheduler 向 ASM 返回空閑 container 信息(NM 等)
- 4.RM(ASM)根據(jù)返回信息向 NM 申請資源
- 5.NM 分配創(chuàng)建一個container 并創(chuàng)建Spark Application Master(AM),此時 AM 上運(yùn)行的是 Spark Driver(每個SparkContext都有一個 AM)
- 6.AM啟動后邢享,和RM(ASM)通訊鹏往,請求根據(jù)任務(wù)信息向RM(ASM)申請 container 來啟動 executor
- 7.RM(ASM)將申請到的資源信息返回給AM
- 8.AM 根據(jù)返回的資源信息區(qū)請求對應(yīng)的 NM 分配 container 來啟動 executor
- 9.NM 收到請求會啟動相應(yīng)的 container 并啟動 executor
- 10.executor 啟動成后 反向向 AM 注冊
- 11.executor 和 AM(Driver) 交互 完成任務(wù)
- 12.后續(xù)的DAGScheduler、TaskScheduler骇塘、Shuffle等操作都是和standaloe一樣
- 13.等到所有的任務(wù)執(zhí)行完畢后,AM 向 ASM 取消注冊并釋放資源
- yarn-client模式(http://spark.apache.org/docs/latest/running-on-yarn.html):
- 6264117-8a0b34d10b5b7ae0.png
- 在yarn-client模式下韩容,Driver運(yùn)行在Client上款违,通過ApplicationMaster向RM獲取資源。本地Driver負(fù)責(zé)與所有的executor container進(jìn)行交互群凶,并將最后的結(jié)果匯總插爹。整體的過程與yarn-cluster類似。
- 不同點在于 Driver 是運(yùn)行在本地客戶端请梢,它的 AM 只是作為一個 Executor 啟動器赠尾,并沒有 Driver 進(jìn)程。
- 而且 Executor啟動后是與 Client 端的 Driver 進(jìn)行交互的毅弧,所以 Client 如果掛了 任務(wù)也就掛了气嫁。
高可用性(High Available)
- Spark同樣存在單點故障問題,官方說明中的兩種HA方式:
-
Standby Masters with ZooKeeper:
4797877-affe70f7ded9c18b.png- 在集群中啟動多個Master節(jié)點够坐,連接到ZK的實例中寸宵,利用ZK來存儲狀態(tài)和進(jìn)行Leader選舉
- 只有一個Master節(jié)點處于Active狀態(tài),其他都是Standby狀態(tài)
- 一旦ZK監(jiān)聽不到當(dāng)前的Leader的心跳元咙,另一個Standby Master就會被選舉為Leader梯影,然后恢復(fù)調(diào)度,繼續(xù)任務(wù)
- 整個恢復(fù)過程(從主節(jié)點第一次down掉開始)應(yīng)在1到2分鐘之間完成
- 請注意庶香,此延遲僅影響對新應(yīng)用程序的調(diào)度甲棍,主節(jié)點故障切換期間已經(jīng)運(yùn)行的應(yīng)用程序不受影響
- Single-Node Recovery with Local File System:
- ZooKeeper is the best way to go for production-level high availability, but if you just want to be able to restart the Master if it goes down, FILESYSTEM mode can take care of it
- In order to enable this recovery mode, you can set SPARK_DAEMON_JAVA_OPTS in spark-env using this configuration:
-
System property | Meaning | Since Version |
---|---|---|
spark.deploy.recoveryMode | Set to FILESYSTEM to enable single-node recovery mode (default: NONE). | 0.8.1 |
spark.deploy.recoveryDirectory | The directory in which Spark will store recovery state, accessible from the Master's perspective. | 0.8.1 |
后記
- 在yarn-client、yarn-cluster提交模式中赶掖,可以不啟動Spark集群感猛,因為相關(guān)的jvm環(huán)境有yarn管理(啟動、結(jié)束等)
- standalone 提交模式中 Spark集群一定要啟動倘零,因為需要依賴worker唱遭、Master進(jìn)行任務(wù)的啟動、調(diào)度等呈驶。