spark 执行流程及各组件执行
?
?
Spark初始化:
1.Spark的啟動流程
?sbin/start-all.sh -> sbin/start-master.sh -> sbin/start-slaves.sh(ssh)
?Master和Worker主類啟動,這兩個主類都包含main方法
2.啟動Master都完成了哪些工作呢?
?1.解析參數
?2.創建ActorSystem,然后通過ActorSystem創建Actor(Master extends Actor)
?3.調用Master的preStart(),啟動了一個定時器,定期檢查超時的Worker
?
3.啟動Worker都完成了哪些工作呢?
?1.解析參數
?2.創建ActorSystem,然后通過ActorSystem創建Actor(Worker extends Actor)
?3.調用Worker的preStart(),通過Master的連接URL,跟Master建立連接,發送注冊消息
?Master接收Worker的注冊請求,然后將注冊消息保存起來,向Worker發送一個注冊成功的消息
?WorkerWorker接收的這個消息后,啟動一個定時器,定期向Master發送心跳
?Master接收到Worker發送來的心跳信息后,更新Worker的上一次心跳時間
?
----------------------------------------------------------------------------
4.內部構建實例
?先創建一個SparkContext實例,在SparkContext的主構造器中完成了的重要步驟:
??1.創建一個SparkEnv
???1.1創建ActorSystem(AkkaUtils創建的)
???1.2創建ShuffleManager
???1.3創建BlockManager
??2.先創建的TaskScheduler
???2.1跟據Master的連接URL(--master spark://node-1.xiaoniu.com:7077)
???TaskSchedulerImpl,又創建了一個SparkDeploySchedulerBackend
??3.創建DAGScheduler
??4.啟動TaskScheduler
???在TaskSchedulerImpl.start()方法,在該方法中,SchedulerBackend的Start方法,
???在調用父類的start方法中,創建一個DriverActor(負責跟Executors通信的)
???在SparkDeploySchedulerBackend準備了一堆參數(任務需要的資源,一下java參數,Executor的實現類)將這些參數封裝到ApplicationDescription,然后創建ClientActor(跟Master通信的)
??5.在ClientActor的preStart方法中,跟Master建立連接,向Master提交任務(將任務的描述信息通過case class發送給Master)
??6.Master接收到ClientActor的任務描述后,將任務描述信息保存起來,然后給ClientActor返回一下消息,告訴ClientActor任務注冊成功。接下來,Master調用了schedule方法,進行資源調度。有兩種調度方式
??(一種的打散,一種是盡量集中)
??7.Master跟Worker通信,然后讓Worker啟動Executor(將Excutor需要的資源,任務描述信息,還有一堆參數發送給了Worker)
??8.Worker跟Master發送來的信息,啟動Executor(Executor的實現類是ClientActor準備的,先發給Master,Master再發給Worker)
??9.Executor中有一個Main方法,先創建ActorSystem,然后創建Actor,在Actor的preStart方法中跟DriverActor進行通信。
Spark各組件執行時機:
1.SparkContext哪一端生成的?
? ? Drvier端?
2.DAG是在哪一端被構建的?
????Driver端
3.RDD是在哪一端生成的? RDD的分區是在哪一端:
Driver端
4.廣播變量是在哪一端調用的方法進行廣播的?
?Driver端
5.要廣播的數據應該在哪一端先創建好再廣播呢?
Driver端
6.調用RDD的算子(Transformation和Action)是在哪一端調用的
Driver端
7.RDD在調用Transformation和Action時需要傳入一下函數,函數是在哪一端聲明和傳入的?
Driver端
8.RDD在調用Transformation和Action時需要傳入函數,請問傳入的函數是在哪一端執行了函數的業務邏輯?
Executor端,Executor中的Task執行的函數的業務邏輯,Executor是一個Java進程,并且Executor中有一個線程池,Task有一個包裝類一個實現了Runnable接口的實例,將Task的包裝類丟到線程池中,Task包裝類的run方法會被調用,然后執行Task中的業務邏輯
9.自定義的分區器這個類是在哪一端實例化的?
Driver端
10.分區器中的getParitition方法在哪一端調用的呢?
Executor中的Task中被執行?
11.Task是在哪一端生成的呢?
Driver端生成的Task,然后Task序列化,通過網絡發送給Executor,Executor接收后,將Task反序列化,,然后用一個實現了Runnable接口的實現類包裝,在丟進線程池執行
12.DAG是在哪一端構建好的并被切分成一到多個State的
Driver端
13.DAG是哪個類完成的切分Stage的功能?
DAGScheduler
14.DAGScheduler將切分好的Stage以什么樣的形式給TaskScheduler
TaskSet,里面裝了多個Task,在一個Stage中,Task是業務邏輯相同,但是處理的數據不相同的實例
?
轉載于:https://www.cnblogs.com/lsbigdata/p/10091786.html
總結
以上是生活随笔為你收集整理的spark 执行流程及各组件执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ4475: [Jsoi2015]
- 下一篇: luogu P1393 P3157 动