Mesos上でSparkを実行

SparkはApache Mesosで管理されるハードウェアクラスタ上で実行することができます。

SparkをMesosと一緒にデプロイする利点には以下が含まれます:

どうやって動くか

スタンドアローンクラスター配備の場合、以下の図のクラスタマネージャーはSparkマスターインスタンスです。Mesosを使う場合は、MesosマスターはクラスターマネージャーとしてSparkマスターを置き換えます。

Spark クラスターコンポーネント

ドライバーがジョブを生成しスケジューリングのためのタスクの発行を開始する場合は、Mesosはどのマシーンがどのタスクを処理するかを決定します。これらの多くの短時間のタスクをスケジュールする場合他のフレームワークを考慮に入れるため、リソースの静的なパーティションの助け無しに複数のフレームワークが同じクラスタ上で共存することができます。

開始するには、MesosをインストールしMesosを使ってSparkジョブをデプロイするには以下のステップに従います。

Mesosのインストール

Spark 1.6.0はMesos 0.21.0と一緒に使うように設計され、Mesosのどのような特別なパッチも必要としません。

既に実行中のMesosクラスタがある場合は、このMesosインストールステップをスキップすることができます。

そうでなければ、SparkのためのMesosのインストールは他のフレームワークによって使われるMesosのインストールと変わりません。Mesosをソースからあるいはprebuiltパッケージのどちらかからインストールすることができます。

ソースから

Apache Mesosをソースからインストールするには、これらのステップに従います:

  1. Mesosのリリースを mirrorからダウンロードします。
  2. Mesosをコンパイルおよびインストールするには Mesosの開始 ページに従います。

注意: Mesosをシステムのデフォルトのパスにインストールすること無しにMesosを実行したい場合(例えば、インストールするための管理権限が無い)、どこにインストールするかを教えるために--prefix オプションを configure に渡します。例えば、--prefix=/home/me/mesosを渡します。出悪fるとでは、prefixは/usr/localです。

サードパーティパッケージ

Apache Mesosプロジェクトはバイナリパッケージではなく、ソースリリースのみで公開しています。しかし他のサードパーティプロジェクトはMesos設定に役立つかも知れないバイナリリリースを公開しています。

それらの一つが Mesosphere です。Mesosphereによって提供されるバイナリリリースを使ってMesosをインストールするには:

  1. downloads pageからMesosインストレーションパッケージをダウンロードします。
  2. インストレーションと設定はそれらの指示に従ってください。

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パッケージを使うには:

  1. Sparkの ダウンロードページからSparkバイナリパッケージをダウンロードします。
  2. 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スクリプトを使ってパッケージを作成する必要は無いでしょう。

  1. ここの説明を使ってSparkをダウンロードおよびビルドする。
  2. make-distribution.sh --tgzを使ってバイナリパッケージを作成する。
  3. 圧縮ファイルを http/s3/hdfs にアップロードする

MesosマスターURLの使用

MesosのマスターURLは、一つのマスターのMesosクラスタについては mesos://host:5050、ZooKeeperを使った複数マスターのMesosクラスタについては mesos://zk://host:2181 の形式です。

クライアントモード

クライアントモードでは、Spark Mesosフレームワークは直接クライアントマシーン上で起動され、ドライバ出力を待ちます。

ドライバーはMesosと適切にやり取りするためにspark-env.shの中に幾つかの設定を必要とします:

  1. 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>.
  2. また 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から見つけることができます。

クラスタモードを使うには、クラスタ内でMesosClusterDispatchersbin/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.constraintstachyon: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 属性 & リソース を参照してください。
  • 数値の制限は "以下"の構文に合致します。つまり、制限での数値はリソースの提供内での数値以下でなければなりません。
  • 範囲の制限は"包含"構文に合致します。つまり、制限内の値はリソースが提供する値の中になければなりません。
  • セットの制限は"副集合"構文に合致します。つまり制限内の値はリソースの提供する値の副集合でなければなりません。
  • テキスト制限は"同等”構文に合致します。つまり、制限内の値はリソースが提供する値に完全に一致しなければなりません。
  • 制限として何も値が無い場合は、対応する属性に提供されるどのようなものも(値のチェック無しに)受け付けられるでしょう。

トラブルシューティングとデバッグ

デバッグの際に見るべき幾つかの場所があります:

And common pitfalls:

TOP
inserted by FC2 system