クラスターモードの概要
このドキュメントはSparkがクラスタ上でどのように実行されるかの概要を示し、関係するコンポーネントの理解を簡単にします。クラスタ上のアプリケーションの起動については アプリケーションのサブミット ガイドを読んでください。
コンポーネント
Sparkアプリケーションはクラスタ上で非依存のプロセスとして実行され、(driver programと呼ばれる)メインプログラム中のSparkContext
オブジェクトによって調整されます。
特に、クラスタ上で動作するために、SparkContextは幾つかの種類のcluster managers(Sparkの独自のスタンドアローンクラスタマネージャーあるいはMesos あるいは YARN)に接続することができます。これらはアプリケーション間でリソースを割り当てます。一度接続すると、Sparkはクラスタ内のノード上の executorsを得ます。これらは計算の実行およびアプリケーションのためのデータを格納するプロセスです。次に、アプリケーションコード(JARによって定義あるいはSparkContextに渡されるPythonファイル)をexecutorに送信します。最後に、SparkContextはexecutorが実行するように tasks を送信します。
この構造に注意すべき幾つかの有用なことがあります:
- 各アプリケーションは独自のexecutorプロセスを取得し、それらは全てのアプリケーションおよび複数スレッド内でタスクを実行する当分の間は動いたままでいます。これは、スケジューリングの点(各ドライバは独自のタスクをスケジュールする)およびexecutorの点(異なるJVMの中で実行される異なるアプリケーションからのタスク)の両方の点で、アプリケーションがお互いに独立するのに役立ちます。しかし、それはデータが外部ストレージシステムへの書き込み無しには、異なるSparkアプリケーション(SparkContextのインスタンス)間で共有できないことも意味します。
- Sparkは潜在的なクラスタマネージャーに対して寛容です。executorプロセスを取得でき、お互いに通信できる限り、他のアプリケーションでもサポートされるクラスタマネージャー上でさえ、実行するのは比較的易しいです(例えば、Mesos/YARN)。
- ドライバープログラムは生きている間executorからやってくる接続をlistenし受け入れなければなりません(例えば、ネットワーク設定セクションのspark.driver.portを見てください)。そういうものとして、ドライバプログラムはワーカーノードからネットワークで特定可能でなければなりません。
- ドライバはクラスタ上でタスクをスケジュールするため、ワーカーノードの近く、できれば同じローカルエリアネットワーク上で実行されなければなりません。遠隔にあるクラスタへリクエストを送信したい場合、遠くにあるワーカーノードからドライバを実行するよりはドライバへRPCを開き近くからオペレーションをサブミットする方が良いでしょう。
クラスターマネージャータイプ
システムは現在のところ3つのクラスターマネージャーをサポートします:
- スタンドアローン - クラスタを構築するのが楽になるSparkが含まれる単純なクラスタマネージャー
- Apache Mesos - Hadoop MapReduceおよびサービスの実行も可能な一般的なクラスタマネージャー
- Hadoop YARN - Hadoop 2のリソースマネージャー
アプリケーションの提出
アプリケーションはspark-submit
スクリプトを使ってどのような種類のクラスタへサブミットすることができます。アプリケーション サブミッション ガイドでこれをどうやってするかを説明します。
監視
各ドライバプログラムは一般的にポート4040にweb UIを持っており、実行中のタスク、executorおよびストレージ利用率の情報を表示します。このUIにアクセスするには単にwebブラウザで http://<driver-node>:4040
に行きます。監視ガイド は他の監視操作についても説明します。
ジョブ スケジューリング
アプリケーション間 (クラスタマネージャーのレベル)とアプリケーション内(複数の計算が同じSparkContext上で起こる場合)の両方でSparkはリソースの割り当てを制御します。これについてジョブ スケジューリング の概要 でもっと詳しく説明します。
用語
以下の表はクラスタの概念を参照するために見るような単語を要約します。
単語 | 意味 |
---|---|
アプリケーション | Spark上のユーザプログラムの構築クラスタ上のドライバプログラム と executors から成ります。 |
アプリケーションのjar | ユーザのSparkアプリケーションを含むjar。時には、依存物と一緒にアプリケーションを含む"uber jar"を作成したいと思うでしょう。ユーザjarはHadoopあるいはSparkライブラリを含むべきではありませんが、実行時には追加されるでしょう。 |
ドライバープログラム | アプリケーションのmain()関数を実行し、SparkContextを生成するプロセス |
クラスターマネージャー | クラスタ上でリソースを獲得するための外部サービス(例えば、スタンドアローンマネージャー、Mesos, YARN) |
ノードの配備 | どこでドライバープロセスを実行するかを区別する。"クラスター"モードでは、フレームワークはクラスタ内でドライバを起動する。"クライアント" モードでは、サブミッターがクラスター外でドライバを起動する。 |
ワーカーモード | クラスタ内でアプリケーションコードを実行することができる全てのノード |
Executor | アプリケーションのためにワーカーノード上で起動されるプロセスで、タスクを実行し、タスク間でメモリあるいはディスクストレージにデータを保持します。各アプリケーションは独自のexecutorを持ちます。 |
タスク | 一つのexecutorに送信されるだろう作業の単位 |
ジョブ | Sparkアクションに応じてspawnされる複数のタスクを構成する並列計算 (例えば、save , collect ); ドライバーのログの中でこの単語が使われることを見るでしょう。 |
ステージ | 各ジョブはお互いに依存するステージと呼ばれる一連の小さなタスクに分割されます (MapReduceでのmapおよびreduceステージに似ています); この単語がドライバーログの中で使われることを見るでしょう。 |