Mesos上でSparkを実行
- どうやって動くか
- Mesosのインストール
- SparkをMesosに接続
- Mesos 実行モード
- MesosのDocker サポート
- Hadoopと一緒に実行
- Mesosを使った動的なリソースの割り当て
- 設定
- トラブルシューティングとデバッグ
SparkはApache Mesosで管理されるハードウェアクラスタ上で実行することができます。
SparkをMesosと一緒にデプロイする利点には以下が含まれます:
- Sparkと他のフレームワークの間の動的なパーティション
- Sparkの複数のインスタンス間のパーティションのスケール
どうやって動くか
スタンドアローンクラスター配備の場合、以下の図のクラスタマネージャーはSparkマスターインスタンスです。Mesosを使う場合は、MesosマスターはクラスターマネージャーとしてSparkマスターを置き換えます。
ドライバーがジョブを生成しスケジューリングのためのタスクの発行を開始する場合は、Mesosはどのマシーンがどのタスクを処理するかを決定します。これらの多くの短時間のタスクをスケジュールする場合他のフレームワークを考慮に入れるため、リソースの静的なパーティションの助け無しに複数のフレームワークが同じクラスタ上で共存することができます。
開始するには、MesosをインストールしMesosを使ってSparkジョブをデプロイするには以下のステップに従います。
Mesosのインストール
Spark 2.0.2 はMesos 0.21.0 以上と一緒に使うように設計され、Mesosのどのような特別なパッチも必要としません。
既に実行中のMesosクラスタがある場合は、このMesosインストールステップをスキップすることができます。
そうでなければ、SparkのためのMesosのインストールは他のフレームワークによって使われるMesosのインストールと変わりません。Mesosをソースからあるいはprebuiltパッケージのどちらかからインストールすることができます。
ソースから
Apache Mesosをソースからインストールするには、これらのステップに従います:
注意: Mesosをシステムのデフォルトのパスにインストールすること無しにMesosを実行したい場合(例えば、インストールするための管理権限が無い)、どこにインストールするかを教えるために--prefix
オプションを configure
に渡します。例えば、--prefix=/home/me/mesos
を渡します。出悪fるとでは、prefixは/usr/local
です。
サードパーティパッケージ
Apache Mesosプロジェクトはバイナリパッケージではなく、ソースリリースのみで公開しています。しかし他のサードパーティプロジェクトはMesos設定に役立つかも知れないバイナリリリースを公開しています。
それらの一つが Mesosphere です。Mesosphereによって提供されるバイナリリリースを使ってMesosをインストールするには:
- downloads pageからMesosインストレーションパッケージをダウンロードします。
- インストレーションと設定はそれらの指示に従ってください。
Mesosphere インストレーションの文章は、Mesosマスターフェイルオーバーを処理するためにZooKeeperのセットアップを提案します。しかしMesosは単一のマスターを使ってZooKeeper無しに実行することもできます。
検証
MesosクラスタがSparkの準備ができていることを確認するために、ポート :5050
のMesosマスターweb UIに行き、すべての期待しているマシーンがスレーブタブ内に存在することを確認します。
SparkをMesosに接続
SparkからMesosを使うには、Mesosからアクセス可能な場所にSparkバイナリパッケージと、Mesosに接続するように設定されたSparkドライバプログラムが必要です。
代わりに、全てのMesosスレーブ内の同じ場所にSparkをインストールし、spark.mesos.executor.home
(SPARK_HOMEのデフォルト) がその場所を示すように設定することもできます。
Sparkパッケージのアップロード
Mesosが初めてMesosスレーブ上でタスクを実行する場合、スレーブはSpark Mesos executor バックエンドを実行するためにSparkバイナリパッケージを持つ必要があります。Sparkパッケージはhttp://
を使ったHTTP、s3n://
を使ったAmazon Simple Storage Serviceあるいはhdfs://
を使ったHDFSを含む、どのようなHadoopでアクセス可能なURIでホストすることができます。
precompileパッケージを使うには:
- Sparkの ダウンロードページからSparkバイナリパッケージをダウンロードします。
- hdfs/http/s3 にアップロードします
HDFS上でホストするには、Hadoop fs put コマンドを使用します: hadoop fs -put spark-2.0.2.tar.gz /path/to/spark-2.0.2.tar.gz
あるいは、Sparkの独自コンパイルバージョンを使っている場合は、Sparkソースの tarball/checkoutに含まれるdev/make-distribution.sh
スクリプトを使ってパッケージを作成する必要は無いでしょう。
- ここの説明を使ってSparkをダウンロードおよびビルドする。
./dev/make-distribution.sh --tgz
を使ってバイナリパッケージを作成する。- 圧縮ファイルを http/s3/hdfs にアップロードする
MesosマスターURLの使用
MesosのマスターURLは、一つのマスターのMesosクラスタについては mesos://host:5050
、ZooKeeperを使った複数マスターのMesosクラスタについては mesos://zk://host1:2181,host2:2181,host3:2181/mesos
の形式です。
クライアントモード
クライアントモードでは、Spark Mesosフレームワークは直接クライアントマシーン上で起動され、ドライバ出力を待ちます。
ドライバーはMesosと適切にやり取りするためにspark-env.sh
の中に幾つかの設定を必要とします:
spark-env.sh
の中で幾つかの環境変数を設定します:export MESOS_NATIVE_JAVA_LIBRARY=<path to libmesos.so>
. このパスは一般的には<prefix>/lib/libmesos.so
で、デフォルトではprefixが/usr/local
です。上のMesosインストレーションの説明を見てください。Mac OS X上では、libmesos.so
の代わりにlibmesos.dylib
ライブラリが呼ばれます。export SPARK_EXECUTOR_URI=<URL of spark-2.0.2.tar.gz uploaded above>
.
- また
spark.executor.uri
を<URL of spark-2.0.2.tar.gz>
に設定します。
これでクラスタに対してSparkアプリケーションを開始する場合に、SparkContext
を作成する時にmesos://
URLをマスターとして渡します。例えば:
val conf = new SparkConf()
.setMaster("mesos://HOST:5050")
.setAppName("My app")
.set("spark.executor.uri", "<path to spark-2.0.2.tar.gz uploaded above>")
val sc = new SparkContext(conf)
(spark-submit
を使い、conf/spark-defaults.conf ファイル内のspark.executor.uri
を設定することもできます。)
シェルを実行する場合には、spark.executor.uri
パラメータがSPARK_EXECUTOR_URI
から継承されるため、システムプロパティとして重複して渡す必要はありません。
./bin/spark-shell --master mesos://host:5050
クラスターモード
Mesos上のSparkもクラスタモードをサポートします。ドライバはクラスタ内で起動され、クライアントはドライバの結果をMesos Web UIから見つけることができます。
クラスタモードを使うには、クラスタ内でMesosClusterDispatcher
を sbin/start-mesos-dispatcher.sh
スクリプトを使って開始し、MesosマスターURL(例えば mesos://host:5050)を渡さなければなりません。これはMesosClusterDispatcher
をホスト上で実行するデーモンとして開始します。
Marathonを使ってMesosClusterDispatcher
を実行したい場合は、フォアグラウンドで MesosClusterDispatcher
を実行する必要があります (つまり: bin/spark-class org.apache.spark.deploy.mesos.MesosClusterDispatcher
)。MesosClusterDispatcher
はまだHAのための複数のインスタンスをサポートしていません。
MesosClusterDispatcher
もZookeeperへの回復状態の書き込みをサポートします。これによりMesosClusterDispatcher
は再起動時に全てのサブミットされ実行中のコンテナを回復することができます。この回復モードを有効にするために、spark.deploy.recoveryMode
と関係する spark.deploy.zookeeper.* 設定を設定することで、SPARK_DAEMON_JAVA_OPTS を設定することができます。これらの設定についての詳しい情報は、設定 (doc)[configurations.html#deploy] を参照してください。
クライアントからは、spark-submit
を実行し、マスターURLをMesosClusterDispatcher
のURL(例えば: mesos://dispatcher:7077)に指定することで、ジョブをサブミットすることができます。ドライバの状態をSpark クラスターWeb UI上で見ることができます。
例えば:
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
http://path/to/examples.jar \
1000
Sparkドライバーは自動的にローカルのjarをアップロードしないため、spark-submitに渡されるjarあるいはphtyonファイルはMesosスレーブによってアクセス可能なURLでなければならないことに注意してください。
Mesos 実行モード
Mesos上でSparkは2つのモードで実行することができます: "coarse-grained" (デフォルト) および "fine-grained"(非推奨)。
Coarse-Grained
"coarse-grained" モードでは、Sparkの各executorは単一のMesosタスクとして実行します。Sparkのexecutors は以下の設定変数に応じて調整されます:
- Executor メモリ:
spark.executor.memory
- Executor コア:
spark.executor.cores
- executorsの数:
spark.cores.max
/spark.executor.cores
詳細とデフォルト値についてはSpark設定 ページを見てください。
アプリケーションが開始すると、executorは熱心にspark.cores.max
に到達するまで起動されます。spark.cores.max
を設定しない場合、SparkアプリケーションはMesosによって提供される全てのリソースを維持しようとします。そのため、同時実行の複数のSparkアプリケーションを含めてどのような種類のマルチテナントのクラスターでもこの変数を設定することをもちろん強くお勧めします。
The scheduler will start executors round-robin on the offers Mesos gives it, but there are no spread guarantees, as Mesos does not provide such guarantees on the offer stream.
coarse-grained モードでの恩恵は、アプリケーションの完了までの時間についてMesosリソースを保持する犠牲の上で、スタートアップ時のオーバーヘッドが少ないことです。リソースの要求に動的に適合するようにジョブを設定するためには、動的割り当てを調べてください。
Fine-Grained (非推奨)
注意: Fine-grained モードはSpark 2.0.0の時点で非推奨です。その恩恵のいくつかについては、動的割り当てを使って考えてください。完全な説明はSPARK-11857を見てください。
"fine-grained"モード(デフォルト)では、Spark executor内の各Sparkタスクは個別のMesosタスクとして実行されます。これにより、Sparkの複数のインスタンス(と他のフレームワーク)は、とても良い粒度でコアを共有することができ、各アプリケーションはコアをより多くあるいは少なく取ることができますが、各タスクの起動の追加のオーバーヘッドがあります。このモードは、対話的な問い合わせあるいはwebアプリケーションの提供のようなレイテンシの低い要求には適切ではないかも知れません。
fine-grainedでのSparkのタスクは終了した時にコアを破棄しますが、JVMはメモリをオペレーティングシステムに戻さないため、メモリを破棄しないだろうことに注意してください。executorの仕事が無い場合にもexecutorは終了しないでしょう。
fine-grained モードで実行するには、SparkConf内の spark.mesos.coarse
プロパティをfalseに設定します。
conf.set("spark.mesos.coarse", "false")
mesosのリソースが提供する制限に基づいた属性を設定するためにspark.mesos.constraints
も利用したいかも知れません。デフォルトでは、提供される全てのリソースが使われるでしょう。
conf.set("spark.mesos.constraints", "os:centos7;us-east-1:false")
例えば、spark.mesos.constraints
が os:centos7;us-east-1:false
に設定された場合、これらの制約に合うかどうかを見るためにリソースがチェックされ、その場合にのみ新しいexecutorを開始するために受け付けられるでしょう。
MesosのDocker サポート
SparkはSparkConf内のspark.mesos.executor.docker.image
プロパティを設定することで、Mesos Docker containerizer を使うことができます。
Dockerイメージは既にイメージの一部であるSparkの適切なバージョンを持たなければなりません。あるいは通常の方法を使ってMesosダウンロードのSparkを持つことができます。
必要なMesosのバージョンは 0.20.1 以上です。
Hadoopと一緒に実行
SparkおよびMesosをそれらを別個のサービスとしてマシーン上で起動するだけで、既存のHadoopクラスタ上で実行することができます。HadoopデータにSparkからアクセスするには、完全な hdfs://
URL が必要です(一般的には hdfs://<namenode>:9000/path
)。しかし、Hadoop Namenode web UI上でその正しいURLを見つけることができます。
更に、より良いリソースの隔離および二者間の共有のために、Mesos上のHadoop MapReduceを実行することもできます。この場合、各ノード上のLinuxスケジューラを使ってリソースを共有するのとは逆に、MesosはHadoopあるいはSparkのどちらかにコアを割り当てる統一されたスケジューラとして振る舞うでしょう。Mesos上のHadoopを参照してください。
いずれの場合も、HDFSはMesosを使ってスケジュールされること無しにHadoop MapReduceとは別個に実行します。
Mesosを使った動的なリソースの割り当て
Meosはcoarse grainモードでのみ動的割り当てをサポートします。これはアプリケーションの統計に基づいてexecutorの数を変更します。一般的な情報については動的なリソースの割り当てを見てください。
使用する外部のシャッフルサービスはMesosシャッフルサービスです。Mesosはまだ他のフレームワークの終了の通知をサポートしないため、シャッフルサービス上でシャッフルデータの掃除の機能を提供します。起動するには、全てのスレーブノード上でspark.shuffle.service.enabled
をtrue
に設定して、$SPARK_HOME/sbin/start-mesos-shuffle-service.sh
を実行します。
これはユニークなホストの制限有りでMarahonと以下のコマンドを使ってすることもできます:bin/spark-class org.apache.spark.deploy.mesos.MesosExternalShuffleService
.
設定
Sparkの設定の情報については 設定ページを見てください。以下の設定はMesos上でSparkのために固有のものです。
Sparkのプロパティ
プロパティ名 | デフォルト | 意味 |
---|---|---|
spark.mesos.coarse |
true |
true に設定すると、"coarse-grained"共有モードのMesosクラスタ上で実行します。Sparkは各マシーン上で一つだけ長く続くMesosタスクを獲得します。false に設定すると、"fine-grained"共有モードで実行します。Sparkのタスクごとに1つのMesosタスクが生成されます。'Mesos Run Modes'で詳述します。
|
spark.mesos.extra.cores |
0 |
executorが通知する余分な数のコアを設定します。これはより多くのコアが割り当てられる結果にはなりません。そうではなく、executorがもっとコアを持っている"振りをする"ことを意味し、ドライバーはもっと多くのタスクを送信するでしょう。並行度を増やすためにこれを使います。この設定は Mesos coarse-grained モードのためのみに使われます。 |
spark.mesos.mesosExecutor.cores |
1.0 |
(Fine-grained モードのみ) 各Mesos executorに渡されるコアの数これはSparkタスクを実行するために使われるコアを含みません。言い換えると、Sparkのタスクが実行されていない場合、各Mesos executorはここで設定されたコアの数を占有するでしょう。値は浮動小数でありえます。 |
spark.mesos.executor.docker.image |
(none) |
Spark executorが中で実行されるdockerイメージの名前を設定する。選択されたイメージはSparkがインストールされていなければならず、Mesosライブラリのバージョンと互換性がなれければなりません。イメージ内のSparkのインストールされたパスはspark.mesos.executor.home で指定することができます; Mesosライブラリがインストールされたパスはspark.executorEnv.MESOS_NATIVE_JAVA_LIBRARY で指定することができます。
|
spark.mesos.executor.docker.volumes |
(none) |
Dockerイメージがマウントされるだろうボリュームのリストを設定します。これは spark.mesos.executor.docker.image を使って設定されました。このプロパティのフォーマットは docker run -v に渡される以下のマッピング形式のカンマ区切りです。つまり、それらは以下の形式を取ります:
[host_path:]container_path[:ro|:rw] |
spark.mesos.executor.docker.portmaps |
(none) |
Dockerイメージによって公開されている入っているポートのリストを設定します。これはspark.mesos.executor.docker.image を使って設定されていました。コノプロパティの形式は以下の形式を取るマッピングのカンマ区切りの行です:
host_port:container_port[:tcp|:udp] |
spark.mesos.executor.home |
ドライバー側 SPARK_HOME |
Mesos内のexecutor状にインストールされているSparkのディレクトリを設定します。デフォルトでは、executorは単純にドライバーのSparkホームディレクトリを使うでしょう。これはexecutorには見えないかも知れません。Spark バイナリパッケージが spark.executor.uri を使って指定されない場合にのみ関係することに注意してください。
|
spark.mesos.executor.memoryOverhead |
最小384 の executor memoriy * 0.10。 |
追加のメモリのMBで指定される量で、executorごとに割り当てられます。デフォルトでは、全体が384あるいはspark.executor.memory の10%のどちらかでしょう。設定されている場合、最終のオーバーヘッドがこの値になるでしょう。
|
spark.mesos.uris |
(none) | Mesosによってドライバーあるはexecutorが起動された場合に、sandboxにダウンロードされるカンマ区切りのURIのリスト。これはcoarse-grainedおよびfine-grainedモードの両方に適用されます。 |
spark.mesos.principal |
(none) | SparkがMesosを使って認証する場合に使われる原則を設定します。 |
spark.mesos.secret |
(none) | SparkフレームワークがMesosを使って認証する場合に使われる秘密鍵を設定します。 |
spark.mesos.role |
* |
このSparkフレームワークがMesosで果たす役割を設定します。役割は、Mesosの中で予約およびリソースの重み付け共有のために使われます。 |
spark.mesos.constraints |
(none) |
mesosのリソース上の制限に基づく属性を提供します。デフォルトでは、提供される全てのリソースが使われるでしょう。属性についての詳細は情報は Mesos 属性 & リソース を参照してください。
|
spark.mesos.driver.webui.url |
(none) |
フレームワークとやり取りするための Spark Mesos ドライバーの webui_url を設定します。設定しない場合は、Sparkの内部web UIを示すでしょう。 |
spark.mesos.dispatcher.webui.url |
(none) |
フレームワークとやり取りするための Spark Mesos dispatcherの webui_url を設定します。設定しない場合は、Sparkの内部web UIを示すでしょう。 |
トラブルシューティングとデバッグ
デバッグの際に見るべき幾つかの場所があります:
- ポート
:5050
上のMesosマスター- スレーブタブにスレーブがなければなりません。
- Sparkのアプリケーションがフレームワークタブに現れなければなりません。
- タスクがフレームワークの詳細に現れなければなりません。
- 失敗したタスクのサンドボックスの標準出力および標準エラーをチェックします。
- Mesosのログ
- マスターおよびスレーブのログは両方ともデフォルトでは
/var/log/mesos
の中にあります。
- マスターおよびスレーブのログは両方ともデフォルトでは
そして共通の落とし穴:
- Sparkのアセンブリが到達可能/アクセス可能ではありません。
- 指定した
http://
,hdfs://
あるいはs3n://
URL からSparkパッケージがダウンロードできなければなりません。
- 指定した
- ファイアウォールが通信をブロックしている
- 失敗した通信についてのメッセージを調べてください。
- 一時的にデバッグのためにファイアウォールを無効にし、適切な穴を開けます。