のスパーク研究論文従来の Hadoop MapReduce に代わる新しい分散プログラミング モデルを規定し、特に機械学習において多くの場合簡素化と大幅なパフォーマンス向上を実現したと主張しています。ただし、この論文ではそのinternal mechanics
詳細を明らかにする資料が不足しているようです。Resilient Distributed Datasets
Directed 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 グラフのより図式的なビューです。
DAG が構築されると、Spark スケジューラは物理的な実行プランを作成します。前述のように、DAG スケジューラはグラフを複数のステージに分割し、ステージは変換に基づいて作成されます。狭い範囲の変換は、1 つのステージにグループ化 (パイプライン化) されます。したがって、この例では、Spark は次のように 2 つのステージ実行を作成します。
DAG スケジューラは、ステージをタスク スケジューラに送信します。送信されるタスクの数は、テキスト ファイルに存在するパーティションの数によって異なります。この例では 4 つのパーティションがあると仮定すると、十分なスレーブ/コアがあれば、4 セットのタスクが並行して作成され、送信されます。次の図は、これをより詳細に示しています。
さらに詳しい情報については、Spark の作成者が DAG と実行プランおよび有効期間について詳しく説明している次の YouTube ビデオをご覧になることをお勧めします。