<menuitem id="uhyqr"><label id="uhyqr"></label></menuitem>

          1. 藍鷗旗下品牌:鷗課學院
            全國咨詢電話:13152008057
            您的位置: 首頁 > 技術(shù)文章 > 【原創(chuàng)】Spark Standalong模式運行原理剖析

            【原創(chuàng)】Spark Standalong模式運行原理剖析

            2017-06-16 藍鷗
            6127人 瀏覽:

              一、概述

              Apache Spark是一種快速和通用的集群計算系統(tǒng)。它提供Java,Scala,Python和R中的高級API,以及支持一般執(zhí)行圖的優(yōu)化引擎。它還支持一組豐富的更高級別的工具,包括Spark SQL用于SQL和結(jié)構(gòu)化數(shù)據(jù)的處理,MLlib機器學習,GraphX用于圖形處理和Spark Streaming。

              Spark除了在Mesos或YARN群集管理器上運行,它還提供了一種簡單的獨立部署模式Standalone模式。接下來我們就以下面的WordCount代碼為例剖析Spark Standalone模式的運行原理。理解并掌握Spark Standalone模式的運行原理對后期進一步學習Spark相關(guān)技術(shù)有很大的幫助,同時也是Spark開發(fā)工程師崗位面試經(jīng)常被提問的地方。

              WordCount代碼如下:

            1.jpg

              Standalone運行模式原理概要如下圖所示:

            2.png

              二、Standalong模式運式原理剖析之天龍八“步”

              1、第一步:

              通過spark-submit指令將打好的Spark jar包提交到Spark集群中運行。先從Driver進程開始運行,Driver中包含了我們所編寫的代碼。

              首先執(zhí)行代碼中的前兩行代碼,

              //創(chuàng)建SparkConf對象  

              val conf = new SparkConf().setAppName("WordCount")  

              //創(chuàng)建SparkContext對象  

              val sc = new SparkContext(conf)

              這兩行代碼分別創(chuàng)建了SparkConf和SparkContext對象,在創(chuàng)建SparkContext對象的過程中,Spark會去做兩件很重要的事,就是創(chuàng)建DAGScheduler和TaskScheduler這兩個對象。然后,TaskScheduler會通過一個后臺進程負責與Master進行注冊通信,告訴Master有一個新的Application應用程序要運行,需要Master管理分配調(diào)度集群的資源。

              2、第二步:

              Master接收到TaskScheduler的注冊請求之后,會通過資源調(diào)度算法對集群資源進行調(diào)度,并且與Worker進行通信,請求Worker啟動相應的Executor。

              3、第三步:

              Worker接收到Master的請求之后,會在本節(jié)點中啟動Executor。因為集群中有多個Worker節(jié)點,那么也意味著會啟動多個Executor。一個Application對應著Worker中的一個Executor。

              4、第四步:

              Executor啟動完成之后,會向Driver中的TaskScheduler進行反注冊,反注冊的目的就是讓Driver知道新提交的Application應用將由哪些Executor負責執(zhí)行。

              5、第五步:

              Executor向Driver中的TaskScheduler反注冊完成之后,就意味著SparkContext的初始化過程已經(jīng)完成,接下來去執(zhí)行SparkContext下面的代碼。

              //從linux或者HDFS中獲取數(shù)據(jù)

              val lines = sc.textFile("hdfs://tgmaster:9000/in/resws")

              //進行單詞統(tǒng)計計數(shù)

              val result = lines.flatMap(_.split(" ")).map((_, 1))

              //將計算結(jié)果保存到HDFS中

              result.saveAsTextFile("hdfs://tgmaster:9000/out/res3")

              sc.stop()

              6、第六步:

              在SparkContext下面的代碼中,創(chuàng)建了初始RDD,并對初始RDD進行了Transformation類型的算子操作,但是系統(tǒng)只是記錄下了這些操作行為,這些操作行并沒有真正的被執(zhí)行,直到遇到Action類型的算子,觸發(fā)提交job之后,Action類型的算子之前所有的Transformation類型的算子才會被執(zhí)行。job會被提交給DAGScheduler,DAGScheduler根據(jù)stage劃分算法將job劃分為多個stage(階段),并將其封裝成TaskSet(任務集合),然后將TaskSet提交給TaskScheduler。

              7、第七步:

              TaskScheduler根據(jù)task分配算法,將TaskSet中的每一個小task分配給Executor去執(zhí)行。

              8、第八步:

              Executor接受到task任務之后,通過taskrunner來封裝一個task,并從線程池中取出相應的一個線程來執(zhí)行task。

              task線程針對RDD partition分區(qū)中的數(shù)據(jù)進行指定的算子操作,這些算子操作包括Transformation和Action類型的操作。

              補充說明:

              1、taskrunner(任務運行器),會對我們編寫代碼進行復制、反序列化操作,進行執(zhí)行task任務。

              2、task分為兩大類:ShuffleMapTask和ResultTask。最后一個stage階段中的task稱為ResultTask,在這之前所有的Task稱為ShuffleMapTask。

            1. 廣告1
            2. 廣告2
            3. 廣告3
            4. 廣告4
            尹人香蕉久久99天天拍,中文字幕永久在线中文免费,久久久久噜噜噜亚洲熟女综合,麻豆av在线免费观看精品
                  <menuitem id="uhyqr"><label id="uhyqr"></label></menuitem>