十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
大數(shù)據(jù)開發(fā)中Spar的Stage,Executor,Driver該如何理解,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比前鋒網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式前鋒網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋前鋒地區(qū)。費用合理售后完善,十年實體公司更值得信賴。
對于Spark新手來說,首先對于Spark的運行機(jī)制不了解,往往跟你交流的時候,互相都不知道在說什么,比如部署模式和運行模式,可能都混為一談,對于有一定開發(fā)經(jīng)驗的老手,即使知道運行機(jī)制,可能在表述上,對Spark的各種術(shù)語也不是很懂,因此理解Spark術(shù)語,是Spark開發(fā)者之間溝通的必要之路,下面從Spark的運行機(jī)制開始,到WordCount案例來理解Spark中的各種術(shù)語。
首先拿官網(wǎng)的一張圖,來說明,其是分布式集群上spark應(yīng)用程序的一般執(zhí)行框架。主要由sparkcontext(spark上下文)、cluster manager(資源管理器)和?executor(單個節(jié)點的執(zhí)行進(jìn)程)。其中cluster manager負(fù)責(zé)整個集群的統(tǒng)一資源管理。executor是應(yīng)用執(zhí)行的主要進(jìn)程,內(nèi)部含有多個task線程以及內(nèi)存空間。
Spark的主要運行流程如下:
應(yīng)用程序在使用spark-submit提交后,根據(jù)提交時的參數(shù)設(shè)置(deploy mode)在相應(yīng)位置初始化sparkcontext,即spark的運行環(huán)境,并創(chuàng)建DAG Scheduler和Task Scheduer,Driver根據(jù)應(yīng)用程序執(zhí)行代碼,將整個程序根據(jù)action算子劃分成多個job,每個job內(nèi)部構(gòu)建DAG圖,DAG Scheduler將DAG圖劃分為多個stage,同時每個stage內(nèi)部劃分為多個task,DAG Scheduler將taskset傳給Task Scheduer,Task Scheduer負(fù)責(zé)集群上task的調(diào)度。至于stage和task的關(guān)系以及是如何劃分的我們后面再詳細(xì)講。
Driver根據(jù)sparkcontext中的資源需求向resource manager申請資源,包括executor數(shù)及內(nèi)存資源。
資源管理器收到請求后在滿足條件的work node節(jié)點上創(chuàng)建executor進(jìn)程。
Executor創(chuàng)建完成后會向driver反向注冊,以便driver可以分配task給他執(zhí)行。
當(dāng)程序執(zhí)行完后,driver向resource manager注銷所申請的資源。
從運行機(jī)制上,我們來繼續(xù)解釋下面的名詞術(shù)語,
driver就是我們編寫的spark應(yīng)用程序,用來創(chuàng)建sparkcontext或者sparksession,driver會和cluster mananer通信,并分配task到executor上執(zhí)行
負(fù)責(zé)整個程序的資源調(diào)度,目前的主要調(diào)度器有:
YARN
Spark Standalone
Mesos
Executors其實是一個獨立的JVM進(jìn)程,在每個工作節(jié)點上會起一個,主要用來執(zhí)行task,一個executor內(nèi),可以同時并行的執(zhí)行多個task。
Job是用戶程序一個完整的處理流程,是邏輯的叫法。
一個Job可以包含多個Stage,Stage之間是串行的,State的觸發(fā)是由一些shuffle,reduceBy,save動作產(chǎn)生的
一個Stage可以包含多個task,比如sc.textFile("/xxxx").map().filter(),其中map和filter就分別是一個task。每個task的輸出就是下一個task的輸出。
partition是spark里面數(shù)據(jù)源的一部分,一個完整的數(shù)據(jù)源會被spark切分成多個partition以方便spark可以發(fā)送到多個executor上去并行執(zhí)行任務(wù)。
RDD是分布式彈性數(shù)據(jù)集,在spark里面一個數(shù)據(jù)源就可以看成是一個大的RDD,RDD由多個partition組成,spark加載的數(shù)據(jù)就會被存在RDD里面,當(dāng)然在RDD內(nèi)部其實是切成多個partition了。
那么問題來了一個spark job是如何執(zhí)行的?
(1)我們寫好的spark程序,也稱驅(qū)動程序,會向Cluster Manager提交一個job
(2)Cluster Manager會檢查數(shù)據(jù)本地行并尋找一個最合適的節(jié)點來調(diào)度任務(wù)
(3)job會被拆分成不同stage,每個stage又會被拆分成多個task
(4)驅(qū)動程序發(fā)送task到executor上執(zhí)行任務(wù)
(5)驅(qū)動程序會跟蹤每個task的執(zhí)行情況,并更新到master node節(jié)點上,這一點我們可以在spark master UI上進(jìn)行查看
(6)job完成,所有節(jié)點的數(shù)據(jù)會被最終再次聚合到master節(jié)點上,包含了平均耗時,最大耗時,中位數(shù)等等指標(biāo)。
部署模式 就是說的,Cluster Manager,一般有Standalone, Yarn ,而運行模式說的是Drvier的運行機(jī)器,是集群還是提交任務(wù)的機(jī)器,分別對應(yīng)Cluster和Client模式,區(qū)別在于運行結(jié)果,日志,穩(wěn)定性等。
Job:Job是由Action觸發(fā)的,因此一個Job包含一個Action和N個Transform操作;
Stage:Stage是由于shuffle操作而進(jìn)行劃分的Task集合,Stage的劃分是根據(jù)其寬窄依賴關(guān)系;
Task:最小執(zhí)行單元,因為每個Task只是負(fù)責(zé)一個分區(qū)的數(shù)據(jù)
處理,因此一般有多少個分區(qū)就有多少個Task,這一類的Task其實是在不同的分區(qū)上執(zhí)行一樣的動作;
下面是一段WordCount程序
import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.rdd.RDD object WordCount { def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("yarn").setAppName("WordCount") val sc = new SparkContext(conf) val lines1: RDD[String] = sc.textFile("data/spark/wc.txt") val lines2: RDD[String] = sc.textFile("data/spark/wc2.txt") val j1 = lines1.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_) val j2 = lines2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_) j1.join(j2).collect() sc.stop() } }
Yarn模式在生產(chǎn)環(huán)境用的較多,因此從Yarn的部署模式來看,代碼上只有一個action操作collect,所以只有一個Job, Job又由于Shuffle的原因被劃分為3個stage, 分別是flatMap 和 map 和 reduceBykey 算一個Stage0, 另外的line2又算一個,Stage1, 而Stage3 是前面兩個結(jié)果join,然后collect, 且stage3依賴于 stage1 和 stage0, 但stage0 和 stage1 是并行的,在實際的生產(chǎn)環(huán)境下,要去看依賴stage的依賴圖,可以明顯看到依賴的關(guān)系。
關(guān)于大數(shù)據(jù)開發(fā)中Spar的Stage,Executor,Driver該如何理解問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。