クラスタモードの概要
このドキュメントでは、Spark がクラスタ上でどのように実行されるかについて簡単に概要を説明し、関連するコンポーネントの理解を容易にします。アプリケーション送信ガイド を読んで、クラスタ上でアプリケーションを起動する方法を学びましょう。
コンポーネント
Spark アプリケーションは、メインプログラム(ドライバプログラムと呼ばれる)内の SparkContext
オブジェクトによって調整される、クラスタ上の独立したプロセスの集合として実行されます。
具体的には、クラスタ上で実行するために、SparkContext はいくつかのタイプのクラスタマネージャ(Spark 独自のスタンドアロンクラスタマネージャ、Mesos、YARN、または Kubernetes)に接続できます。これにより、アプリケーション間でリソースが割り当てられます。接続されると、Spark はクラスタ内のノード上でエグゼキュータを取得します。エグゼキュータとは、計算を実行し、アプリケーションのデータを保存するプロセスです。次に、アプリケーションコード(SparkContext に渡された JAR または Python ファイルで定義)をエグゼキュータに送信します。最後に、SparkContext はタスクをエグゼキュータに送信して実行します。
このアーキテクチャについて、いくつかの重要な点があります。
- 各アプリケーションは、アプリケーション全体の実行期間中稼働し、複数のスレッドでタスクを実行する独自の executor プロセスを取得します。これにより、スケジューリング側(各ドライバは独自のタスクをスケジュールする)とエグゼキュータ側(異なるアプリケーションのタスクは異なる JVM で実行される)の両方で、アプリケーションがお互いに分離されるという利点があります。ただし、外部ストレージシステムに書き込まない限り、異なる Spark アプリケーション(SparkContext のインスタンス)間でデータを共有することはできません。
- Spark は基盤となるクラスタマネージャに依存しません。エグゼキュータプロセスを取得し、それらが互いに通信できれば、他のアプリケーションもサポートするクラスタマネージャ(例:Mesos/YARN/Kubernetes)でも比較的簡単に実行できます。
- ドライバプログラムは、その存続期間中、エグゼキュータからの着信接続をリッスンして受け入れる必要があります(例:ネットワーク設定セクションの spark.driver.port を参照)。そのため、ドライバプログラムはワーカーノードからネットワークアドレス指定可能である必要があります。
- ドライバはクラスタ上でタスクをスケジュールするため、ワーカーノードの近くに、できれば同じローカルエリアネットワーク上で実行する必要があります。クラスタにリモートからリクエストを送信したい場合は、ドライバに RPC を開き、近くのドライバから操作を送信する方が、ワーカーノードから遠く離れた場所でドライバを実行するよりも優れています。
クラスタマネージャの種類
現在、システムはいくつかのクラスタマネージャをサポートしています。
- スタンドアロン – クラスタのセットアップを容易にする、Spark に含まれるシンプルなクラスタマネージャ。
- Apache Mesos – Hadoop MapReduce やサービスアプリケーションも実行できる一般的なクラスタマネージャ。(非推奨)
- Hadoop YARN – Hadoop 3 のリソースマネージャ。
- Kubernetes – コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースシステム。
アプリケーションの送信
アプリケーションは、spark-submit
スクリプトを使用して、任意の種類のクラスタに送信できます。アプリケーション送信ガイド にその方法が説明されています。
モニタリング
各ドライバプログラムには、通常ポート 4040 で、実行中のタスク、エグゼキュータ、ストレージ使用状況に関する情報を表示する Web UI があります。この UI にアクセスするには、Web ブラウザで http://<driver-node>:4040
にアクセスするだけです。モニタリングガイド には、他のモニタリングオプションについても説明されています。
ジョブスケジューリング
Spark は、アプリケーション間(クラスタマネージャレベル)とアプリケーション内(同じ SparkContext で複数の計算が行われている場合)の両方で、リソース割り当てを制御します。ジョブスケジューリングの概要 に、詳細が説明されています。
用語集
次の表は、クラスタの概念を表すために使用される用語をまとめたものです。
用語 | 意味 |
---|---|
アプリケーション | Spark 上に構築されたユーザープログラム。クラスタ上のドライバプログラムとエグゼキュータで構成されます。 |
アプリケーションJAR | ユーザの Spark アプリケーションを含む JAR ファイル。場合によっては、アプリケーションとその依存関係を含む「uber JAR」を作成することをユーザが望む場合があります。ただし、ユーザの JAR には Hadoop または Spark ライブラリを含めるべきではなく、これらは実行時に追加されます。 |
ドライバプログラム | アプリケーションの main() 関数を実行し、SparkContext を作成するプロセス。 |
クラスタマネージャ | クラスタ上のリソースを取得するための外部サービス(例:スタンドアロンマネージャ、Mesos、YARN、Kubernetes)。 |
デプロイモード | ドライバプロセスが実行される場所を区別します。「クラスタ」モードでは、フレームワークはクラスタ内でドライバを起動します。「クライアント」モードでは、送信者はクラスタの外でドライバを起動します。 |
ワーカーノード | クラスタでアプリケーションコードを実行できるノード。 |
エグゼキュータ | ワーカーノード上のアプリケーションに対して起動されるプロセスで、タスクを実行し、それら間でメモリまたはディスクストレージにデータを保持します。各アプリケーションには独自の executer があります。 |
タスク | 1 つのエグゼキュータに送信される作業単位。 |
ジョブ | Spark アクション(例:save 、collect )に応答して生成される、複数のタスクで構成される並列計算。ドライバのログでこの用語が表示されます。 |
ステージ | 各ジョブは、互いに依存するより小さなタスクの集合であるステージに分割されます(MapReduce の map ステージと reduce ステージに似ています)。ドライバのログでこの用語が表示されます。 |