日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Spark天堂之门解密

發布時間:2023/12/20 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spark天堂之门解密 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?本課主題

  • 什么是 Spark 的天堂之門
  • Spark 天堂之門到底在那里
  • Spark 天堂之門源碼鑒賞

?

引言

  Spark 天堂之門就是SparkContext,這篇文章會從 SparkContext 創建3大核心對象 TaskSchedulerImpl、DAGScheduler 和 SchedulerBackend 開始到注冊給 Master 這個過程中的源碼鑒賞,SparkContext 是整個 Spark 程序通往集群的唯一通道,它是程序起點,也是程序終點,所以把它稱之為天堂之門,看過 Spark HelloWorld 程序的朋友都知道,你在程序的開頭必需先定義SparkContext、接著調用 SparkContext 的方法,比如說 sc.textFile(file),最后也會調用 sc.stop( ) 來退出應用程序。現在我們就來看看 SparkContext 里面到底有什么秘密,以及為什么它會被稱為天堂之門。希望這篇文章能為讀者帶出以下的啟發:

  • 了解在 SparkContext 內部創建了哪些實例對象以及如何創建
  • 了解真正是哪個實例對象向 Master?注冊以及如何注冊

?

什么是 Spark 的天堂之門

  • Spark 程序在運行的時候分為?Driver?和?Executor?兩部分
  • Spark 程序編寫是基于 SparkContext 的,具體來說包含兩方面
  • Spark 編程的核心基礎-RDD 是由 SparkContext 來最初創建的(第一個RDD一定是由 SparkContext 來創建的)
  • Spark 程序的調度優化也是基于 SparkContext,首先進行調度優化。
  • Spark 程序的注冊時通過 SparkContext 實例化時生產的對象來完成的(其實是 SchedulerBackend 來注冊程序)
  • Spark 程序在運行的時候要通過 Cluster Manager 獲取具體的計算資源,計算資源獲取也是通過 SparkContext 產生的對象來申請的(其實是 SchedulerBackend 來獲取計算資源的)
  • SparkContext 崩潰或者結束的時候整個 Spark 程序也結束啦!
  • ?

    Spark 天堂之門到底在那里

    運行一個程序,你會看見 SparkContext 從程序開始到結束都有它的身影,SparkContext 是 Spark 應用程序的核心呀!

    [下圖是一個 HelloWord 應用程序在 IDEA 中的運行狀況]

    ?

    Spark 天堂之門源碼鑒賞

    這次主要是看當提交Spark程序后,在 SparkContext 實例化的過程中,里面會創建多少個核心實例來為應用程序完成注冊,SparkContext 最主要的是實例化?TaskSchedulerImpl。

    [下圖是 SparkContext 在創建核心對象后的流程圖]

  • SparkContext 構建的頂級三大核心:DAGScheduler,?TaskScheduler,?SchedulerBackend,其中:
    • DAGScheduler 是面向 Job 的 Stage 的高層調度器;
    • TaskScheduler 是一個接口,是低層調度器,根據具體的 ClusterManager 的不同會有不同的實現,Standalone 模式下具體的實現 TaskSchedulerImpl;?
    • SchedulerBackend 是一個接口,根據具體的 ClusterManager 的不同會有不同的實現,Standalone 模式下具體的實現是SparkDeploySchedulerBackend
    從整個程序運行的角度來講,SparkContext 包含四大核心對象:DAGScheduler,?TaskScheduler,?SchedulerBackend,?MapOutputTrackerMaster SparkDeploySchedulerBackend 有三大核心功能:
    • 負責向Master 連接連接注冊當前程序 RegisterWithMaster
    • 接收集群中為當前應用程序而分配的計算資源 Executor 的注冊并管理 Executors;?
    • 負責發送 Task 到具體的 Executor 執行

    補充說明的是?SparkDeploySchedulerBackend 是被?TaskSchedulerImpl 來管理的!

    創建 SparkContext 的核心對象
    • 程序一開始運行時會實例化 SparkContext 里的東西,所以不在方法里的成員都會被實例化!一開始實例化的時候第一個關鍵的代碼是?createTaskScheduler,它是位于 SparkContext 的 Primary Constructor 中,當它實例化時會直接被調用,這個方法返回的是 taskScheduler 和 dagScheduler 的實例,然后基于這個內容又構建了 DAGScheduler,然后調用?taskScheduler 的 start( ) 方法,要先創建taskScheduler然后再創建 dagScheduler,因為taskScheduler是受dagScheduler管理的。
      [下圖是 SparkContext.scala 中的創建 schedulerBackend 和 taskSchdulerImpl 的實例對象]
    • 調用 createTaskSchedule,這個方法創建了 TaskSchdulerImpl 和 SparkDeploySchedulerBackend,接受第一個參數是 SparkContext 對象本身,然后是字符串,(這也是平時傳入 master 里的字符串)
      [下圖是 HelloSpark.scala 中創建 SparkConf 和 SparkContext 的上下文信息]

      [下圖是 SparkContext.scala 中的 createTaskScheduler 方法]
    • 它會判斷一下你的 master 是什么然后具體進行不同的操作!假設我們是Spark 集群模式,它會:
      [下圖是 SparkContext.scala 中的 SparkMasterRegex 靜態對象]
    • 創建 TaskSchedulerImpl 實例然后把 SparkContext 傳進去;?
    • 匹配集群中 master 的地址 e.g. spark://?
    • 創建 SparkDeploySchedulerBackend 實例,然后把 taskScheduler (這里是 TaskSchedulerImpl)、SparkContext 和 master 地址信息傳進去;
    • 調用 taskScheduler (這里是 TaskSchedulerImpl) 的 initialize 方法?最后返回 (SparkDeploySchedulerBackend,?TaskSchedulerImpl) 的實例對象
    • SparkDeploySchedulerBackend 是被?TaskSchedulerImpl 來管理的,所以這里要首先把 scheduler 創建,然后把?scheduler 的實例傳進去。
      [下圖是 SparkContext.scala 中的調用模式匹配 SPARK_REGEX 的處理邏輯]
    • Task 默認失敗后重新啟動次數為 4 次
      [下圖是 TaskSchedulerImpl.scala 中的類和主構造器的調用方法]

    TaskSchedulerImpl.initialize( )方法是

    • 創建一個 Pool 來初定義資源分布的模式 Scheduling Mode,默認是 先進先出的?模式。

    調用?taskScheduler 的 start( ) 方法

    • 在這個方法中再調用 backend (SparkDeploySchedulerBackend) 的 start( ) 方法。

    • 當通過 SparkDeploySchedulerBackend 注冊程序給 Master 的時候會把以上的 command 提交給 Master?
    CoarseGrainedExecutorBackend
    • Master 發指令給 Worker 去啟動 Executor 所有的進程的時候加載的 Main 方法所在的入口類就是 command 中的CoarseGrainedExecutorBackend,當然你可以實現自己的 ExecutorBackend,在?CoarseGrainedExecutorBackend 中啟動 Executor (Executor 是先注冊在實例化),Executor 通過線程池并發執行 Task。

    • 這里調用了它的 run 方法


    • 注冊成功后再實例化
    SparkDeploySchedulerBackend 的 start 方法內幕
    • 然后創建一個很重要的對象,AppClient 對象,然后調用它的 client (AppClient) 的?start( ) 方法,創建一個 ClientEndpoint 對象。

    • 它是一個 RpcEndPoint,然后接下來的故事就是向 Master?注冊,首先調用自己的 onStart 方法
    • 然后再調用 registerWithMaster 方法
    • 從?registerWithMaster 調用 tryRegisterAllMasters,開一條新的線程來注冊,然后發送一條信息(RegisterApplication 的case class )?給 Master,注冊是通過 Thread 來完成的。


      ApplicationDescription 的 case class
    Master 接受程序的注冊
    • Master 收到了這個信息便開始注冊,注冊后最后再次調用 schedule( ) 方法
      ?

    ?

    總結

    SparkContext 開啟了天堂之門:Spark 程序是通過 SparkContext 發布到 Spark集群的SparkContext 導演了天堂世界:Spark 程序運行都是在 SparkContext 為核心的調度器的指揮下進行的:SparkContext 關閉了天堂之門:SparkContext 崩潰或者結束的是偶整個 Spark 程序也結束啦!

    ?

    程序提交整體流程如下圖:

    ?

    ?

    轉載于:https://www.cnblogs.com/sky-sql/p/9078660.html

    總結

    以上是生活随笔為你收集整理的Spark天堂之门解密的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。