クラスターモードの概要
このドキュメントでは、Spark がクラスター上でどのように実行されるかの簡単な概要を説明し、関係するコンポーネントを理解しやすくします。クラスターでアプリケーションを起動する方法については、アプリケーション送信ガイドをお読みください。
コンポーネント
Spark アプリケーションは、クラスター上の独立したプロセスのセットとして実行され、メインプログラム (ドライバープログラム と呼ばれる) の SparkContext オブジェクトによって調整されます。
具体的には、クラスター上で実行するために、SparkContext はいくつかの種類のクラスターマネージャー (Spark 独自のスタンドアロン クラスター マネージャー、YARN、または Kubernetes) に接続できます。これらのマネージャーは、アプリケーション間でリソースを割り当てます。接続後、Spark はクラスター内のノードでエクスキューターを確保します。エクスキューターは、アプリケーションの計算を実行し、データを保存するプロセスです。次に、アプリケーション コード (SparkContext に渡される JAR または Python ファイルで定義される) をエクスキューターに送信します。最後に、SparkContext は実行するためのタスクをエクスキューターに送信します。
このアーキテクチャについては、いくつか注目すべき点があります。
- 各アプリケーションは独自のエクスキュータープロセスを取得します。これらのプロセスはアプリケーション全体で維持され、複数のスレッドでタスクを実行します。これにより、スケジューリング側 (各ドライバーは独自のタスクをスケジューリングする) とエクスキューター側 (異なるアプリケーションからのタスクは異なる JVM で実行される) の両方で、アプリケーションを互いに分離するという利点があります。ただし、外部ストレージ システムに書き込まない限り、異なる Spark アプリケーション (SparkContext のインスタンス) 間でデータを共有できないことも意味します。
- Spark は、基盤となるクラスター マネージャーに対してアグノスティックです。エクスキュータープロセスを確保でき、それらが互いに通信できる限り、他のアプリケーションもサポートするクラスター マネージャー (例: YARN/Kubernetes) 上で実行することも比較的容易です。
- ドライバープログラムは、そのライフサイクル全体を通じて、エクスキューターからの着信接続をリッスンして受け入れる必要があります (例: ネットワーク構成セクションの spark.driver.port を参照)。そのため、ドライバープログラムはワーカー ノードからネットワークで到達可能である必要があります。
- ドライバーはクラスター上でタスクをスケジューリングするため、ワーカー ノードの近く、できれば同じローカルエリアネットワークで実行する必要があります。クラスターにリモートでリクエストを送信したい場合は、ドライバーから遠く離れた場所でドライバーを実行するよりも、ドライバーへの RPC を開き、近くから操作を送信させる方が良いでしょう。
クラスターマネージャーの種類
現在、システムはいくつかのクラスターマネージャーをサポートしています。
- スタンドアロン – Spark に含まれるシンプルなクラスターマネージャーで、クラスターを簡単にセットアップできます。
- Hadoop YARN – Hadoop 3 のリソースマネージャー。
- Kubernetes – コンテナー化されたアプリケーションのデプロイ、スケーリング、および管理を自動化するためのオープンソースシステム。
アプリケーションの送信
アプリケーションは、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 アクション (例: save、collect) の応答として生成される複数のタスクからなる並列計算。ドライバーのログでこの用語が使用されているのを確認できます。 |
| ステージ | 各ジョブは、互いに依存するタスクの小さなセットであるステージに分割されます (MapReduce のマップおよびリデュース ステージに似ています)。ドライバーのログでこの用語が使用されているのを確認できます。 |