web-dev-qa-db-ja.com

Sparkのタスクとは何ですか? Spark= workerはjarファイルをどのように実行しますか?

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 等々?

43
EdwinGuo

SparkContextを作成すると、各ワーカーはexecutorを開始します。これは独立したプロセス(JVM)であり、jarもロードします。エグゼキューターはドライバープログラムに接続します。これで、ドライバーは、例のflatMapmapreduceByKeyなどのコマンドを送信できます。ドライバーが終了すると、executorはシャットダウンします。

RDDは、パーティションに分割された大きな配列のようなもので、各エグゼキューターはこれらのパーティションの一部を保持できます。

taskは、Functionオブジェクトをシリアル化することにより、ドライバーからエグゼキューターに送信されるコマンドです。 executorはコマンドをデシリアライズし(jarをロードしたため可能です)、パーティションで実行します。

(これは概念的な概要です。詳細については詳しく説明しますが、役立つことを願っています。)


特定の質問に答えるには:いいえ、各ステップで新しいプロセスは開始されません。 SparkContextが構築されると、各ワーカーで新しいプロセスが開始されます。

96
Daniel Darabos

タスクがどのように作成およびスケジュールされるかについて明確な洞察を得るには、Sparkで実行モデルがどのように機能するかを理解する必要があります。簡単に言えば、spark=のアプリケーションは3つのステップで実行されます。

  1. RDDグラフを作成する
  2. RDDグラフに従って実行計画を作成します。このステップでステージが作成されます
  3. 計画に基づいてタスクを生成し、ワーカー全体でそれらをスケジュールします

ワードカウントの例では、RDDグラフはかなり単純で、次のようなものです。

ファイル->行->単語->単語ごとのカウント->グローバルな単語カウント->出力

このグラフに基づいて、2つのステージが作成されます。ステージ作成ルールは、できるだけ多くの狭い変換をパイプライン化するという考えに基づいています。あなたの例では、狭い変換は単語ごとのカウントで終了します。したがって、2つのステージを取得します

  1. ファイル->行->単語->単語ごとのカウント
  2. グローバルな単語数->出力

sparkはステージからタスクを生成します。最初のステージはShuffleMapTasksを作成し、最後のステージはResultTasksを作成します。最後のステージには結果を生成するための1つのアクション操作が含まれます。

生成されるタスクの数は、ファイルの配布方法によって異なります。 3つの異なるノードに3つの3つの異なるファイルがあり、最初の段階で3つのタスク(パーティションごとに1つのタスク)が生成されるとします。

したがって、ステップをタスクに直接マップしないでください。タスクはステージに属し、パーティションに関連付けられています。

通常、ステージで実行されたタスクの数は最終的なRDDのパーティションの数とまったく同じですが、RDDを共有できるため(したがってShuffleMapStages)、その数はRDD /ステージ共有によって異なります。 RDDでDAGがどのように機能するか を参照してください。

32
Hui Wang