web-dev-qa-db-ja.com

RDDでDAGがどのように機能するか?

Sparkリサーチペーパー は、従来のHadoop MapReduceよりも新しい分散プログラミングモデルを規定しており、多くの場合、特に機械学習で単純化と大幅なパフォーマンス向上を主張しています。ただし、internal mechanics オン Resilient Distributed Datasets with Directed Acyclic Graphこの論文には欠けているようです。

ソースコードを調査することで、よりよく学ぶべきでしょうか?

60
sof

私もsparkがRDDからDAGを計算し、その後タスクを実行する方法について学ぶためにWebを探していました。

高レベルでは、RDDでアクションが呼び出されると、SparkはDAGを作成し、DAGスケジューラーに送信します。

  • DAGスケジューラーは、オペレーターをタスクのステージに分割します。ステージは、入力データのパーティションに基づいたタスクで構成されます。 DAGスケジューラーは、オペレーターを一緒にパイプライン化します。例えば多くのマップオペレーターは、単一の段階でスケジュールできます。 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つ以上の親へのポインターを保持します。たとえば、RDDでval b = a.map()を呼び出すと、RDD bはその親であるaへの参照を保持します。これは系統です。

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

_(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を示しています。 sc.textFile()を呼び出してこのRDDを作成しました。以下は、特定のRDDから作成されたDAGグラフのより概略的なビューです。

RDD DAG graph

DAGがビルドされると、Spark=スケジューラーは物理実行プランを作成します。上記のように、DAGスケジューラーはグラフを複数のステージに分割し、変換に基づいてステージが作成されます。グループ化(パイプライン)されて単一のステージになります。したがって、この例では、Sparkは次のように2つのステージ実行を作成します。

Stages

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

Task execustion

より詳細な情報については、Spark作成者がDAGと実行計画および存続期間に関する詳細を提供する次のYouTubeビデオをご覧になることをお勧めします。

  1. 高度なApache Spark- Sameer Farooqui(Databricks)
  2. Spark Internals-Aaron Davidson(Databricks))のより深い理解
  3. AmpLabの紹介Spark Internals
138
Sathish

始まりSpark 1.4データの視覚化は、次の3つのコンポーネントによって追加され、DAGの明確なグラフィカル表現も提供します。

  • Sparkイベントのタイムラインビュー

  • 実行DAG

  • Spark=ストリーミング統計の可視化

詳細については link を参照してください。

5
bdcloud