SparkのSparkContextソースコード分析

1.はじめに

  SparkContextは、Sparkプログラムのメインエントリポイントであり、Sparkクラスターとの接続に使用されます。Sparkクラスターのすべての操作は、SparkContext上で実行されます。これは、SparkクラスターでRDD、カウンター、ブロードキャスト変数を作成するために使用できます。すべてのSparkプログラムはSparkContextオブジェクトを作成する必要があります。ストリーミングコンピューティングに使用されるStreamingContextおよびSQLコンピューティングに使用されるSQLContextも、既存のSparkContextに関連付けられるか、暗黙的にSparkContextオブジェクトを作成します。ソースコードは次のとおりです。

/ **  * Spark機能のメインエントリポイント。SparkContextはSpark
*クラスターへの接続を表し、そのクラスターでRDD、アキュムレーター、ブロードキャスト変数を作成するために使用できます。 * * JVMごとにアクティブにできるSparkContextは1つだけです。 新しいものを作成する前に* アクティブなSparkContextを `stop()`する必要があります。この制限は最終的に削除される可能性があります。詳細については、SPARK-2243を参照してください。 * * @param configアプリケーション構成を説明するSpark Configオブジェクト。内のすべての設定は 、この設定*はデフォルトのconfigsだけでなく、システムプロパティをオーバーライドします。
* / class SparkContext(config:SparkConf)extends Logging { //このSparkContextが構築された呼び出しサイト。 private val creationSite:CallSite = Utils.getCallSite() // trueの場合、複数のSparkContextsがアクティブなときに例外をスローする代わりに警告を記録します private val allowMultipleContexts:Boolean = config.getBoolean " spark.driver.allowMultipleContexts "false // In複数のSparkContextsが同時にアクティブになるのを防ぐには、このコンテキストを// 構築を開始したものとしてマークし ます。 // 注:これは、SparkContextコンストラクターの先頭に配置する必要があります。 SparkContext.markPartiallyConstructed(この、allowMultipleContexts) ヴァルのstartTime = にSystem.currentTimeMillis() プライベート [スパーク] valが停止:AtomicBoolean = 新しい AtomicBoolean( プライベート [スパーク] DEF assertNotStopped():単位= { 場合。(停止し得る()){ valをactiveContext = SparkContext.activeContext。get () val activeCreationSite = if(activeContext == null ){ " (アクティブなSparkContextはありません。)" } else { activeContext.creationSite.longForm } throw new IllegalStateException( s "" " 停止したSparkContextでメソッドを呼び出すことはできません。 | この停止したSparkContextは次の場所に作成されました: | | $ {creationSite.longForm} | | 現在アクティブなSparkContextは次の場所に作成されました: | | $ activeCreationSite "" " .stripMargin) } } def this()= thisnew SparkConf()) defthis(master:String、appName:String、conf:SparkConf)= this (SparkContext.updatedConf(conf、master、appName)) def this master:String、 appName:String、 sparkHome:String = null jars:Seq [String ] = Nil、 環境:Map [String、String] = Map())= { this(SparkContext.updatedConf(new SparkConf()、master、appName、sparkHome、jars、environment)) }
private [spark] def this(master :String、appName:String)= this(master、appName、null 、Nil、Map()) private [spark] def this(master:String、appName:String、sparkHome:String)= this (master、appName、sparkHome、Nil、Map())
private [spark] def this(master :String、appName:String、sparkHome:String、jars:Seq [String])= this (master、appName、sparkHome、jars、Map()) // ログアウトSparkバージョンのSparkドライバー logLogInfo(s " Running Spark version $ SPARK_VERSION "

2. SparkConfの設定

  SparkContextを初期化するとき、パラメーターとして必要なSparkConf構成オブジェクトは1つだけです。構成を保存するためのSparkConfクラスの定義は、同じディレクトリのSparkConf.scalaファイルにあります。その主要なメンバーはハッシュテーブルで、キーと値のタイプは両方とも文字列タイプです。

  

  SparkConfは構成用のいくつかの単純なインターフェイスを提供しますが、実際にはすべての構成は<key、value>のペアの形式で設定に保存されます。たとえば、マスターメソッドの設定は、設定項目spark.masterを設定することです。

  

  したがって、構成ファイルのspark.master構成アイテム、パラメーターリストの--masterオプション、またはsetMaster()メソッドを使用してマスターアドレスを設定できますが、優先順位は異なります。

  JVMごとに開始できるSparkContextは1つだけです。それ以外の場合は、デフォルトで例外がスローされます。たとえば、スパークシェルから開始されるインタラクティブプログラミング環境では、デフォルトでscという名前のSparkContextオブジェクトが作成されています。StreamingContextオブジェクトが直接作成される場合、エラーを報告します。簡単な解決策は、デフォルトのscを最初に停止することです。

  もちろん、次のようにspark.driver.allowMultipleContextをtrueに設定して、このエラーを無視することもできます。

  

3.初期化プロセス

  SparkContextの構築中に、すべてのサービスが開始されました。Scala構文の特性により、すべてのコンストラクターはデフォルトコンストラクターを呼び出し、デフォルトコンストラクターのコードは直接クラス定義にあります。さまざまな構成とログの初期化に加えて、最も重要な初期化操作の1つは、タスクスケジューラとDAGスケジューラを起動することです。コードは次のとおりです。

  

  DAGスケジューリングとタスクスケジューリングの違いは、DAGが高レベルのスケジューリングであり、各ジョブの有向非循環グラフを描画し、各ステージの出力を追跡し、ジョブを完了するための最短経路を計算し、タスクをタスクスケジューラに送信することです。実行する。タスクスケジューラは、DAGスケジューラのリクエストを受け入れるだけであり、タスクの実際のスケジューリング実行を担当するため、DAGSchedulerの初期化はタスクスケジューラの後に行う必要があります。

  DAGとタスクを別々に設計する利点は、Sparkが独自のDAGスケジューリングを柔軟に設計できることと、YARNやMesosなどの他のリソーススケジューリングシステムと組み合わせることができることです。

  タスクスケジューラ自体は、createTaskScheduler関数で作成されます。Sparkプログラムの送信時に指定されたさまざまなモードに応じて、さまざまなタイプのスケジューラーを開始できます。フォールトトレランスのために、createTaskSchedulerは1つのマスターと1つのバックアップを持つ2つのスケジューラーを返します。YARNクラスターモードを例にとると、マスタースケジューラーとスタンバイスケジューラーは異なるタイプのインスタンスに対応していますが、同じ構成がロードされています。コードは次のとおりです。

case masterUrl => 
        val cm = getClusterManager(masterUrl)match {
           case Some(clusterMgr)=> clusterMgr
           case None => throw  new SparkException(" could not parse Master URL: ' " + master + " ' " 
        } 
        try {
           val scheduler = cm.createTaskScheduler(sc、masterUrl)
          val backend = cm.createSchedulerBackend(sc、masterUrl、scheduler) 
          cm.initialize(scheduler、backend) 
          (backend、scheduler)
        } catch {
           case se:SparkException => throw se
           case NonFatal(e)=>
             throw  new SparkException(" 外部スケジューラはインスタンス化できません" 、e)
        } 
}

4.その他の機能インターフェース

  環境を初期化してSparkクラスターに接続することに加えて、SparkContextは次のように多くの機能的な入り口も提供します。

  1. RDDを作成します。RDDを作成するためのすべてのメソッドは、ParallizeやtextFilenewAPIHadoopFileなどのSparkContextで定義されます。

  2. RDDの永続性。RDDのpersistRDDおよびunpersistRDDの永続操作メソッドもSparkContextで定義されています。

  3.シェア変数を作成します。カウンターとブロードキャスト変数を含みます。

  4.stop()SparkContextを停止します。

  5.runJob。スケジュールされたすべての実行のエントリポイントであるRDDアクション操作を送信します。

おすすめ

転載: www.cnblogs.com/yszd/p/12696690.html