クラスターモードの概要

このドキュメントでは、Spark がクラスター上でどのように実行されるかの簡単な概要を説明し、関係するコンポーネントを理解しやすくします。クラスターでアプリケーションを起動する方法については、アプリケーション送信ガイドをお読みください。

コンポーネント

Spark アプリケーションは、クラスター上の独立したプロセスのセットとして実行され、メインプログラム (ドライバープログラム と呼ばれる) の SparkContext オブジェクトによって調整されます。

具体的には、クラスター上で実行するために、SparkContext はいくつかの種類のクラスターマネージャー (Spark 独自のスタンドアロン クラスター マネージャー、YARN、または Kubernetes) に接続できます。これらのマネージャーは、アプリケーション間でリソースを割り当てます。接続後、Spark はクラスター内のノードでエクスキューターを確保します。エクスキューターは、アプリケーションの計算を実行し、データを保存するプロセスです。次に、アプリケーション コード (SparkContext に渡される JAR または Python ファイルで定義される) をエクスキューターに送信します。最後に、SparkContext は実行するためのタスクをエクスキューターに送信します。

Spark cluster components

このアーキテクチャについては、いくつか注目すべき点があります。

  1. 各アプリケーションは独自のエクスキュータープロセスを取得します。これらのプロセスはアプリケーション全体で維持され、複数のスレッドでタスクを実行します。これにより、スケジューリング側 (各ドライバーは独自のタスクをスケジューリングする) とエクスキューター側 (異なるアプリケーションからのタスクは異なる JVM で実行される) の両方で、アプリケーションを互いに分離するという利点があります。ただし、外部ストレージ システムに書き込まない限り、異なる Spark アプリケーション (SparkContext のインスタンス) 間でデータを共有できないことも意味します。
  2. Spark は、基盤となるクラスター マネージャーに対してアグノスティックです。エクスキュータープロセスを確保でき、それらが互いに通信できる限り、他のアプリケーションもサポートするクラスター マネージャー (例: YARN/Kubernetes) 上で実行することも比較的容易です。
  3. ドライバープログラムは、そのライフサイクル全体を通じて、エクスキューターからの着信接続をリッスンして受け入れる必要があります (例: ネットワーク構成セクションの spark.driver.port を参照)。そのため、ドライバープログラムはワーカー ノードからネットワークで到達可能である必要があります。
  4. ドライバーはクラスター上でタスクをスケジューリングするため、ワーカー ノードの近く、できれば同じローカルエリアネットワークで実行する必要があります。クラスターにリモートでリクエストを送信したい場合は、ドライバーから遠く離れた場所でドライバーを実行するよりも、ドライバーへの RPC を開き、近くから操作を送信させる方が良いでしょう。

クラスターマネージャーの種類

現在、システムはいくつかのクラスターマネージャーをサポートしています。

アプリケーションの送信

アプリケーションは、spark-submit スクリプトを使用して、任意の種類のクラスターに送信できます。アプリケーション送信ガイドで、その方法について説明しています。

監視

各ドライバープログラムには、通常ポート 4040 で Web UI があり、実行中のタスク、エクスキューター、およびストレージの使用状況に関する情報が表示されます。Web ブラウザーで http://<driver-node>:4040 にアクセスするだけで、この UI にアクセスできます。監視ガイドでは、その他の監視オプションについても説明しています。

ジョブスケジューリング

Spark は、アプリケーション (クラスター マネージャーのレベル) およびアプリケーション (同じ SparkContext で複数の計算が行われている場合) のリソース割り当てを制御できます。ジョブスケジューリングの概要で、これについて詳しく説明しています。

用語集

次の表は、クラスターの概念を参照するために使用される用語をまとめたものです。

用語意味
アプリケーション Spark 上に構築されたユーザープログラム。クラスター上のドライバープログラムエクスキューターで構成されます。
アプリケーション jar ユーザーの Spark アプリケーションを含む jar。場合によっては、ユーザーは依存関係とともにアプリケーションを含む「uber jar」を作成したい場合があります。ユーザーの jar には、Hadoop または Spark ライブラリを含めるべきではありません。これらは実行時に追加されます。
ドライバープログラム アプリケーションの main() 関数を実行し、SparkContext を作成するプロセス。
クラスターマネージャー クラスター上のリソースを取得するための外部サービス (例: スタンドアロン マネージャー、YARN、Kubernetes)。
デプロイモード ドライバープロセスが実行される場所を区別します。「クラスター」モードでは、フレームワークはドライバーをクラスター内に起動します。「クライアント」モードでは、送信者がドライバーをクラスターの外に起動します。
ワーカーノード クラスター内のアプリケーションコードを実行できるノード。
エクスキューター ワーカーノード上でアプリケーションのために起動されるプロセスで、タスクを実行し、それらの間でデータをメモリまたはディスク ストレージに保持します。各アプリケーションは独自のエクスキューターを持っています。
タスク 1 つのエクスキューターに送信される作業単位。
ジョブ Spark アクション (例: savecollect) の応答として生成される複数のタスクからなる並列計算。ドライバーのログでこの用語が使用されているのを確認できます。
ステージ 各ジョブは、互いに依存するタスクの小さなセットであるステージに分割されます (MapReduce のマップおよびリデュース ステージに似ています)。ドライバーのログでこの用語が使用されているのを確認できます。