首页 > 其他 > 详细

第28课:Spark天堂之门解密

时间:2017-02-22 11:12:56      阅读:252      评论:0      收藏:0      [点我收藏+]

 本課主題

  • Spark 天堂之门
  • Spark 天堂之门源码分享

 

Spark天堂之门:SparkContext

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

SparkContext 使用案例

技术分享技术分享

 

Spark 天堂內幕

这次主要是看当提交Spark程序后,在 SparkContext 实例化的过程中,里面会创建多少个核心实例来为应用程序完成注冊,SparkContext 最主要的是实例化 TaskSchedulerImpl。

技术分享

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

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

 

创建 SparkContext 的核心对象
  • 程序一开始运行时会实例化 SparkContext 里的东西,所以不在方法里的成员都会被实例化!
  • 一开始实例化的时候第一个关键的代码是 createTaskScheduler,它是位于 SparkContext 的 Primary Constructor 中,当它实例化时会直接被调用,这个方法返回的是 taskScheduler 和 dagScheduler 的实例,然后基于这个内容又构建了 DAGScheduler,然后调用 taskScheduler 的 start( ) 方法,要先创建taskScheduler然后再创建 dagScheduler,因为taskScheduler是受dagScheduler管理的。
    技术分享
  • 调用 createTaskSchedule,接受第一个参数是 SparkContext 对象本身,然后是字符串,(这也是你平时转入 master 里的字符串)
  • 技术分享
    技术分享
  • 它会判断一下你的 master 是什么然后具体进行不同的操作!假设我们是Spark 集群模式,它会:
  • 技术分享
    1. 创建 TaskSchedulerImpl 实例然后把 SparkContext 传进去
    2. 匹配集群中 master 的地址 e.g. spark://
    3. 创建 SparkDeploySchedulerBackend 实例,然后把 taskScheduler (这里是 TaskSchedulerImpl)、SparkContext 和 master 地址信息传进去
    4. 调用 taskScheduler (这里是 TaskSchedulerImpl) 的 initialize 方法
    5. 最后返回 (SparkDeploySchedulerBackend, TaskSchedulerImpl) 的实例对象
  • SparkDeploySchedulerBackend 是被 TaskSchedulerImpl 來管理的,所以这里要首先把 scheduler 创建,然后把 scheduler 的实例传进去。
    技术分享

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 程序也結束啦!
 
 

參考資料 

资料来源来至 DT大数据梦工厂 第28课:Spark天堂之门解密视频

 

第28课:Spark天堂之门解密

原文:http://www.cnblogs.com/jcchoiling/p/6427406.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!