http://spark.Apache.org/docs/0.8.0/cluster-overview.html に関するドキュメントを読んだ後、明確にしたい質問がありました。
Sparkからこの例を取ります。
JavaSparkContext spark = new JavaSparkContext(
new SparkConf().setJars("...").setSparkHome....);
JavaRDD<String> file = spark.textFile("hdfs://...");
// step1
JavaRDD<String> words =
file.flatMap(new FlatMapFunction<String, String>() {
public Iterable<String> call(String s) {
return Arrays.asList(s.split(" "));
}
});
// step2
JavaPairRDD<String, Integer> pairs =
words.map(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) {
return new Tuple2<String, Integer>(s, 1);
}
});
// step3
JavaPairRDD<String, Integer> counts =
pairs.reduceByKey(new Function2<Integer, Integer>() {
public Integer call(Integer a, Integer b) {
return a + b;
}
});
counts.saveAsTextFile("hdfs://...");
したがって、3つのノードクラスターがあり、ノード1がマスターとして実行されており、上記のドライバープログラムが適切にjarされているとします(たとえば、application-test.jar)。マスターノードでこのコードを実行しているので、SparkContext
が作成された直後に、application-test.jarファイルがワーカーノードにコピーされます(各ワーカーはそのアプリケーション)。
さて、私の質問:ワーカーに送信されるタスク例のstep1、step2、step3はありますか?はいの場合、ワーカーはそれをどのように実行しますか? Java -cp "application-test.jar" step1
等々?
SparkContext
を作成すると、各ワーカーはexecutorを開始します。これは独立したプロセス(JVM)であり、jarもロードします。エグゼキューターはドライバープログラムに接続します。これで、ドライバーは、例のflatMap
、map
、reduceByKey
などのコマンドを送信できます。ドライバーが終了すると、executorはシャットダウンします。
RDDは、パーティションに分割された大きな配列のようなもので、各エグゼキューターはこれらのパーティションの一部を保持できます。
taskは、Function
オブジェクトをシリアル化することにより、ドライバーからエグゼキューターに送信されるコマンドです。 executorはコマンドをデシリアライズし(jarをロードしたため可能です)、パーティションで実行します。
(これは概念的な概要です。詳細については詳しく説明しますが、役立つことを願っています。)
特定の質問に答えるには:いいえ、各ステップで新しいプロセスは開始されません。 SparkContext
が構築されると、各ワーカーで新しいプロセスが開始されます。
タスクがどのように作成およびスケジュールされるかについて明確な洞察を得るには、Sparkで実行モデルがどのように機能するかを理解する必要があります。簡単に言えば、spark=のアプリケーションは3つのステップで実行されます。
ワードカウントの例では、RDDグラフはかなり単純で、次のようなものです。
ファイル->行->単語->単語ごとのカウント->グローバルな単語カウント->出力
このグラフに基づいて、2つのステージが作成されます。ステージ作成ルールは、できるだけ多くの狭い変換をパイプライン化するという考えに基づいています。あなたの例では、狭い変換は単語ごとのカウントで終了します。したがって、2つのステージを取得します
sparkはステージからタスクを生成します。最初のステージはShuffleMapTasksを作成し、最後のステージはResultTasksを作成します。最後のステージには結果を生成するための1つのアクション操作が含まれます。
生成されるタスクの数は、ファイルの配布方法によって異なります。 3つの異なるノードに3つの3つの異なるファイルがあり、最初の段階で3つのタスク(パーティションごとに1つのタスク)が生成されるとします。
したがって、ステップをタスクに直接マップしないでください。タスクはステージに属し、パーティションに関連付けられています。
通常、ステージで実行されたタスクの数は最終的なRDDのパーティションの数とまったく同じですが、RDDを共有できるため(したがってShuffleMapStages
)、その数はRDD /ステージ共有によって異なります。 RDDでDAGがどのように機能するか を参照してください。