在上文中我們知道spark的集群主要有三種運行模式standalone、yarn、mesos,其中常被使用的是standalone和yarn,本文了解一下什么是standalone運行模式,它的運行流程是怎么樣的。
簡介
standalone模式,是spark自己實現的,它是一個資源調度框架。這里我們要關注這個框架的三個節點:
1)client
2)master
3)worker
spark應用程序有一個Driver驅動,Driver可以運行在Client上也可以運行在master上。如果你使用spark-shell去提交job的話它會是運行在master上的,如果你使用spark-submit或者IDEA開發工具方式運行,那么它是運行在Client上的。這樣我們知道了,Client的主體作用就是運行Driver。而master除了資源調度的作用還可以運行Driver。
再關注master和worker節點,standalone是一個主從模式,master節點負責資源管理,worker節點負責任務的執行。
運行流程
了解standalone主要節點之后,我們看一下它的運行流程,如圖:
1)當spark集群啟動以后,worker節點會有一個心跳機制和master保持通信;
2)SparkContext連接到master以后會向master申請資源,而master會根據worker心跳來分配worker的資源,並啟動worker的executor進程;
3)SparkContext將程序代碼解析成dag結構,並提交給DagScheduler;
4)dag會在DagScheduler中分解成很多stage,每個stage包含着多個task;
5)stage會被提交給TaskScheduler,而TaskScheduler會將task分配到worker,提交給executor進程,executor進程會創建線程池去執行task,並且向SparkContext報告執行情況,直到task完成;
6)所有task完成以后,SparkContext向Master注銷並釋放資源;
總結
standalone的是spark默認的運行模式,它的運行流程主要就是把程序代碼解析成dag結構,並再細分到各個task提交給executor線程池去並行計算。
在運行流程中我們並沒有提到job這個概念,只是說dag結構會被分解成很多的stage。其實,分解過程中如果遇到action操作(這不暫時不關注action操作是什么),那么就會生成一個job,而每一個job都包含着一個或者多個stage,所以job和stage也是一個總分的邏輯關系。