RDD の裏で DAG はどのように機能するのか? 質問する

RDD の裏で DAG はどのように機能するのか? 質問する

スパーク研究論文従来の Hadoop MapReduce に代わる新しい分散プログラミング モデルを規定し、特に機械学習において多くの場合簡素化と大幅なパフォーマンス向上を実現したと主張しています。ただし、この論文ではそのinternal mechanics詳細を明らかにする資料が不足しているようです。Resilient Distributed DatasetsDirected Acyclic Graph

ソースコードを調べて学んだほうが良いでしょうか?

ベストアンサー1

私も、Spark が RDD から DAG を計算し、その後タスクを実行する方法について Web で調べていました。

大まかに言えば、RDD で何らかのアクションが呼び出されると、Spark は DAG を作成し、それを DAG スケジューラに送信します。

  • DAG スケジューラは、演算子をタスクのステージに分割します。ステージは、入力データのパーティションに基づくタスクで構成されます。DAG スケジューラは、演算子をパイプライン化します。たとえば、多数のマップ演算子を 1 つのステージでスケジュールできます。DAG スケジューラの最終結果は、ステージのセットです。

  • ステージはタスク スケジューラに渡されます。タスク スケジューラは、クラスター マネージャー (Spark Standalone/Yarn/Mesos) を介してタスクを起動します。タスク スケジューラは、ステージの依存関係を認識しません。

  • ワーカーはスレーブ上でタスクを実行します。

Spark が DAG を構築する方法について見てみましょう。

高レベルでは、RDDに適用できる変換は2つあります。狭い変換と広い変換基本的に、ワイド変換はステージ境界をもたらします。

狭い変換- パーティション間でデータをシャッフルする必要はありません。たとえば、マップ、フィルターなど。

幅広い変革- たとえば、reduceByKey など、データをシャッフルする必要があります。

重大度レベルごとにログメッセージがいくつ表示されるかを数える例を見てみましょう。

以下は重大度レベルで始まるログファイルです。

INFO I'm Info message
WARN I'm a Warn message
INFO I'm another Info message

そして、同じものを抽出するために次のScalaコードを作成します。

val input = sc.textFile("log.txt")
val splitedLines = input.map(line => line.split(" "))
                        .map(words => (words(0), 1))
                        .reduceByKey{(a,b) => a + b}

このコマンド シーケンスは、後でアクションが呼び出されたときに使用される RDD オブジェクトの DAG (RDD 系統) を暗黙的に定義します。各 RDD は、親との関係の種類に関するメタデータとともに、1 つ以上の親へのポインターを保持します。たとえば、val b = a.map()RDD を呼び出すと、RDD はbその親への参照 (系統) を保持しますa

RDD の系統を表示するために、Spark はデバッグ メソッドを提供しますtoDebugString()。たとえば、 RDDtoDebugString()で実行するとsplitedLines、次のように出力されます。

(2) ShuffledRDD[6] at reduceByKey at <console>:25 []
    +-(2) MapPartitionsRDD[5] at map at <console>:24 []
    |  MapPartitionsRDD[4] at map at <console>:23 []
    |  log.txt MapPartitionsRDD[1] at textFile at <console>:21 []
    |  log.txt HadoopRDD[0] at textFile at <console>:21 []

最初の行 (下から) は入力 RDD を示しています。 を呼び出してこの RDD を作成しましたsc.textFile()。以下は、指定された RDD から作成された DAG グラフのより図式的なビューです。

RDD DAGグラフ

DAG が構築されると、Spark スケジューラは物理的な実行プランを作成します。前述のように、DAG スケジューラはグラフを複数のステージに分割し、ステージは変換に基づいて作成されます。狭い範囲の変換は、1 つのステージにグループ化 (パイプライン化) されます。したがって、この例では、Spark は次のように 2 つのステージ実行を作成します。

ステージ

DAG スケジューラは、ステージをタスク スケジューラに送信します。送信されるタスクの数は、テキスト ファイルに存在するパーティションの数によって異なります。この例では 4 つのパーティションがあると仮定すると、十分なスレーブ/コアがあれば、4 セットのタスクが並行して作成され、送信されます。次の図は、これをより詳細に示しています。

タスク実行

さらに詳しい情報については、Spark の作成者が DAG と実行プランおよび有効期間について詳しく説明している次の YouTube ビデオをご覧になることをお勧めします。

  1. 高度な Apache Spark - Sameer Farooqui (Databricks)
  2. Spark の内部構造をより深く理解する - Aaron Davidson (Databricks)
  3. AmpLab Spark 内部の紹介

おすすめ記事