Spark アプリケーションは、単に YARN アプリケーションの一種です。
Apache Spark は Scala で記述されており、互換性のある Scala ランタイム JAR がクラスパスに提示されている限り、任意の JVM 上で実行できます。
ワーカーノードが動作するには HDFS クライアントと YARN クライアントが必要であり、ジョブの入力および出力用のファイルを HDFS 上で読み書きします。
概要 #
ユーザーは JVM バイトコードのプログラム(Java または Scala のいずれか)を作成します。このプログラムは ドライバープログラム と呼ばれ、foo.jar という JAR ファイルにパッケージ化されます。
この JAR ファイルにはすべての依存関係を含めることも(いわゆる uber JAR)、ワーカーノードの環境から提供されることを前提として依存関係を含めないこともできます。
ドライバープログラムは次のようになります。
java
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.Dataset;
public class SimpleApp {
public static void main(String[] args) {
SparkSession spark = SparkSession.builder().appName("Simple Application").getOrCreate();
Dataset<String> logData = spark.read().textFile("SOME_DIR/SOME_FILE.md").cache();
long numAs = logData.filter(s -> s.contains("a")).count();
long numBs = logData.filter(s -> s.contains("b")).count();
System.out.println("Lines with a: " + numAs + ", lines with b: " + numBs);
spark.stop();
}
}次に、ユーザーは次のコマンドでこのプログラムを実行します。
sh
./bin/spark-submit \
--master 'spark://master-server-addr:port' \
--class org.full.package.SimpleApp \
foo.jarこのコマンドはローカル JVM プロセスを直ちに開始し、このプログラムをすべてローカルで実行します。
その後、次の処理が行われます。
SparkSessionインスタンスの作成時に、このプログラム(ドライバー)はマスターノードとの TCP 接続を確立し、"こんにちは、マスター。いくつかのエグゼキューター・プロセスが必要です。エグゼキューターを割り当て、準備ができたら TCP 経由で私と通信してください。これが私の IP アドレスと待ち受け TCP ポートです。"と伝えます。- このドライバープログラムは、そのライフタイム全体にわたってブロックし、エグゼキューターからの着信接続を待ち受けます。
- マスター(別名クラスターマネージャー)が具体的に何であるかは、このドライバープログラムにとって重要ではありません。マスターがプロトコルを理解し、将来的にいずれかのエグゼキューターから TCP 接続が来る限り問題ありません。
その他 #
- 各
SparkContextのインスタンスは Spark アプリケーションと呼ばれます。同じドライバープログラム内に、互いに完全に独立した複数のSparkContextを持つことができます。 - 同じ Spark アプリケーション内では、複数の Spark アクション(別名ジョブ) を同時に実行できます。
SparkContextは(そうあるべきですが)シングルトンであり、Spark アプリケーション内で一度しか作成できません。- 一方、
SparkSessionは 1 つのアプリケーション内で複数回作成できます。
コメント
GitHub で閲覧・コメントする(投稿にはログインが必要です)