Sparkリサーチペーパー は、従来のHadoop MapReduceよりも新しい分散プログラミングモデルを規定しており、多くの場合、特に機械学習で単純化と大幅なパフォーマンス向上を主張しています。ただし、internal mechanics
オン Resilient Distributed Datasets
with Directed Acyclic Graph
この論文には欠けているようです。
ソースコードを調査することで、よりよく学ぶべきでしょうか?
私も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グラフのより概略的なビューです。
DAGがビルドされると、Spark=スケジューラーは物理実行プランを作成します。上記のように、DAGスケジューラーはグラフを複数のステージに分割し、変換に基づいてステージが作成されます。グループ化(パイプライン)されて単一のステージになります。したがって、この例では、Sparkは次のように2つのステージ実行を作成します。
次に、DAGスケジューラーはステージをタスクスケジューラーに送信します。送信されるタスクの数は、textFileに存在するパーティションの数によって異なります。 Foxの例では、この例では4つのパーティションがあり、十分なスレーブ/コアがあれば、4セットのタスクが並行して作成および送信されます。以下の図は、これをより詳細に示しています。
より詳細な情報については、Spark作成者がDAGと実行計画および存続期間に関する詳細を提供する次のYouTubeビデオをご覧になることをお勧めします。
始まりSpark 1.4
データの視覚化は、次の3つのコンポーネントによって追加され、DAG
の明確なグラフィカル表現も提供します。
Sparkイベントのタイムラインビュー
実行DAG
Spark=ストリーミング統計の可視化
詳細については link を参照してください。