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 1.6.0は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-1.6.0.tar.gz /path/to/spark-1.6.0.tar.gz
あるいは、Sparkの独自コンパイルバージョンを使っている場合は、Sparkソースの tarball/checkoutに含まれるmake-distribution.sh
スクリプトを使ってパッケージを作成する必要は無いでしょう。
- ここの説明を使ってSparkをダウンロードおよびビルドする。
make-distribution.sh --tgz
を使ってバイナリパッケージを作成する。- 圧縮ファイルを http/s3/hdfs にアップロードする
MesosマスターURLの使用
MesosのマスターURLは、一つのマスターのMesosクラスタについては mesos://host:5050
、ZooKeeperを使った複数マスターのMesosクラスタについては mesos://zk://host:2181
の形式です。
クライアントモード
クライアントモードでは、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-1.6.0.tar.gz uploaded above>
.
- また
spark.executor.uri
を<URL of spark-1.6.0.tar.gz>
に設定します。
これでクラスタに対してSparkアプリケーションを開始する場合に、SparkContext
を作成する時にmesos://
URLをマスターとして渡します。例えば:
val conf = new SparkConf()
.setMaster("mesos://HOST:5050")
.setAppName("My app")
.set("spark.executor.uri", "<path to spark-1.6.0.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
)。
クライアントからは、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"モードは代わりにただ一つの長く実行されるSparkタスクを各Mesosマシーン上で起動し、その中で自身の"mini-task"を動的にスケジュールします。開始時のオーバーヘッドの低さが利点ですが、アプリケーションが動いている間のMesosのリソースの提供を犠牲にします。
coarse-grained がデフォルトのモードです。有効にするためにSparkConf内で明示的にspark.mesos.coarse
プロパティをtrueに設定することもできます:
conf.set("spark.mesos.coarse", "true")
更に、coarse-grained モードについては、Sparkが取得するリソースの最大数を制御することができます。デフォルトではクラスタ内の(Mesosによって提供される)全てのコアが取得されます。一度に一つのアプリケーションだけを実行する場合にのみ意味があるでしょう。(例えば)conf.set("spark.cores.max", "10")
を使ってコアの最大の数に上限をつけることができます。
"fine-grained"モード(デフォルト)では、各Sparkタスクは個別のMesosタスクとして実行されます。これにより、Sparkの複数のインスタンス(と他のフレームワーク)は、とても良い粒度でマシーンを共有することができ、各アプリケーションはマシーンをより多くあるいは少なく取ることができますが、各タスクの起動の追加のオーバーヘッドがあります。このモードは、対話的な問い合わせあるいはwebアプリケーションの提供のようなレイテンシの低い要求には適切ではないかも知れません。
coarse-grained モードで実行するには、SparkConf内の spark.mesos.coarse
プロパティをfalseに設定します。
conf.set("spark.mesos.coarse", "false")
mesosのリソースが提供する制限に基づいた属性を設定するためにspark.mesos.constraints
も利用したいかも知れません。デフォルトでは、提供される全てのリソースが使われるでしょう。
conf.set("spark.mesos.constraints", "tachyon:true;us-east-1:false")
例えば、spark.mesos.constraints
が tachyon:true;us-east-1:false
に設定された場合、これらの制約に合うかどうかを見るためにリソースがチェックされ、その場合にのみ新しいexecutorを開始するために受け付けられるでしょう。
MesosのDocker サポート
SparkはSparkConf内のspark.mesos.executor.docker.image
プロパティを設定することで、Mesos Docker containerizer を使うことができます。
The Docker image used must have an appropriate version of Spark already part of the image, or you can have Mesos download Spark via the usual methods.
必要な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の数を変更します。動的割り当てはexecutorの数のスケールアップおよびスケールダウンをサポートしますが、coarse grainスケジューラはは設定された量のリソースを使ってスレーブあたり1つのexecutorを実行するように既に設計されているため、スケールダウンのみをサポートします。しかし、executorの数をスケールダウンした後でcoarse grainスケジューラはSparkがもっと多くのexecutorを必要だと信号を送ると、同じ数のexecutorまでスケールバックします。
Mesosはまだ他のフレームワークの終了の通知をサポートしないため、この機能を使いたいユーザは、Shuffleサービス上でシャッフルデータの掃除機能を提供するMesos Shuffleサービスを起動する必要があります。Mesos Shuffle サービスを起動/停止するには、提供されている sbin/start-mesos-shuffle-service.sh および sbin/stop-mesos-shuffle-service.sh スクリプトをそれぞれ使用してください。
Shuffle サービスはSpark executorを実行するだろう各スレーブノード上で実行されていることが期待されます。Mesosを使ってこれを簡単に行う一つの方法は、ユニークなホストの制限を持つMarathonを使ってShuffle サービスを起動することです。
設定
Sparkの設定の情報については 設定ページを見てください。以下の設定はMesos上でSparkのために固有のものです。
Sparkのプロパティ
プロパティ名 | デフォルト | 意味 |
---|---|---|
spark.mesos.coarse |
false |
true に設定すると、"coarse-grained" 共有モードでMesos上で動作し、Sparkは1つのSparkタスクごとに1つのMesosタスクではなく各マシーンごとに1つの長く動作するMesosを必要とします。これにより短いクエリに関してはレンテンシーが低くなるスケジュールになりますが、Sparkジョブが動いている間のリソースは使われたままになります。
|
spark.mesos.extra.cores |
0 |
秒間あたりリクエストするためのCPUの余分な数を設定します。この設定は Mesos coarse grain モードでのみ使われます。タスクあたりに必要とされるコアの総数は提供されるコアに加えて設定された余分なコアの数です。executorが要求する総コア数はspark.cores.max 設定を超えないだろうことに注意してください。
|
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-grainおよびfine-grainモードの両方に適用されます。 |
spark.mesos.principal |
(none) | SparkがMesosを使って認証する場合に使われる原則を設定します。 |
spark.mesos.secret |
(none) | SparkフレームワークがMesosを使って認証する場合に使われる秘密鍵を設定します。 |
spark.mesos.role |
* |
このSparkフレームワークがMesosで果たす役割を設定します。役割は、Mesosの中で予約およびリソースの重み付け共有のために使われます。 |
spark.mesos.constraints |
(none) |
Attribute based constraints on mesos resource offers. デフォルトでは、提供される全てのリソースが使われるでしょう。属性についての詳細は情報は Mesos 属性 & リソース を参照してください。
|
トラブルシューティングとデバッグ
デバッグの際に見るべき幾つかの場所があります:
- ポート
:5050
上のMesosマスター- スレーブタブにスレーブがなければなりません。
- Sparkのアプリケーションがフレームワークタブに現れなければなりません。
- タスクがフレームワークの詳細に現れなければなりません。
- 失敗したタスクのサンドボックスの標準出力および標準エラーをチェックします。
- Mesosのログ
- マスターおよびスレーブのログは両方ともデフォルトでは
/var/log/mesos
の中にあります。
- マスターおよびスレーブのログは両方ともデフォルトでは
And common pitfalls:
- Spark assembly not reachable/accessible
- Slaves must be able to download the Spark binary package from the
http://
,hdfs://
ors3n://
URL you gave
- Slaves must be able to download the Spark binary package from the
- ファイアウォールが通信をブロックしている
- 失敗した通信についてのメッセージを調べてください。
- 一時的にデバッグのためにファイアウォールを無効にし、適切な穴を開けます。