Mesos上でSparkを実行

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

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

どうやって動くか

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

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

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

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

Mesosのインストール

Spark 2.2.0 はMesos 1.0.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-2.2.0.tar.gz /path/to/spark-2.2.0.tar.gz

あるいは、Sparkの独自コンパイルバージョンを使っている場合は、Sparkソースの tarball/checkoutに含まれるdev/make-distribution.shスクリプトを使ってパッケージを作成する必要は無いでしょう。

  1. ここの説明を使ってSparkをダウンロードおよびビルドする。
  2. ./dev/make-distribution.sh --tgzを使ってバイナリパッケージを作成する。
  3. 圧縮ファイルを 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の中に幾つかの設定を必要とします:

  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-2.2.0.tar.gz uploaded above>.
  2. また spark.executor.uri<URL of spark-2.2.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-2.2.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)。MesosClusterDispatcherはまだHAのための複数のインスタンスをサポートしていません。

MesosClusterDispatcher もZookeeperへの回復状態の書き込みをサポートします。これによりMesosClusterDispatcherは再起動時に全てのサブミットされ実行中のコンテナを回復することができます。この回復モードを有効にするために、spark.deploy.recoveryMode と関係する spark.deploy.zookeeper.* 設定を設定することで、SPARK_DAEMON_JAVA_OPTS を設定することができます。これらの設定についての詳しい情報は設定ドキュメントを参照してください。

クライアントからは、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 は以下の設定変数に応じて調整されます:

詳細とデフォルト値については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.

In this mode spark executors will honor port allocation if such is provided from the user. Specifically if the user defines spark.executor.port or spark.blockManager.port in Spark configuration, the mesos scheduler will check the available offers for a valid port range containing the port numbers. そのような範囲が利用可能では無い場合、タスクを起動しないでしょう。ユーザによってポート番号に押し付けの制限が無い場合、いつものように短命ポートが使われます。This port honouring implementation implies one task per host if the user defines a port. 将来、ネットワークの隔離がサポートされるべきです。

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.constraintsos: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 以上です。

デフォルトではMesosエージェントは画像がエージェント上にまだ無い場合は画像を取りださないことに注意してください。複数のイメージタグを使う場合は、executorを実行する前にエージェントがイメージを常に取り出すように強制するためにspark.mesos.executor.docker.forcePullImagetrue にすることができます。画像の強制取り出しはMesosバージョン 0.22以上でのみ利用可能です。

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.enabledtrueに設定して、$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.forcePullImage false Mesos エージェントがspark.mesos.executor.docker.imageで指定されたイメージを強制的に取り出すようにします。デフォルトでは、Mesosエージェントはすでにキャッシュしているイメージを取り出さないでしょう。
spark.mesos.executor.docker.parameters (none) dockerコンテナ化を使ってMesos上でSparkのexecutorを起動する場合、docker run コマンドに渡されるだろう独自のパラメータのリストを設定します。このプロパティの形式はキー/値のペアのカンマ区切りのリストです。例:
key1=val1,key2=val2,key3=val3
spark.mesos.executor.docker.volumes (none) Dockerイメージがマウントされるだろうボリュームのリストを設定します。これは spark.mesos.executor.docker.imageを使って設定されました。このプロパティのフォーマットは docker run -v に渡される以下のマッピング形式のカンマ区切りです。つまり、それらは以下の形式を取ります:
[host_path:]container_path[:ro|:rw]
spark.mesos.task.labels (none) 各タスクに追加するMesosのラベルを設定します。ラベルはキー-値のペアの自由形式です。キー-値のペアはコロンで区切られ、1つ以上をリスト化するためにカンマが使われるべきです。Ex. key:value,key2:value2.
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.containerizer docker これはdockerコンテナにのみ影響します。"docker" あるいは "mesos" のうちの一つでなければなりません。Mesos はdockerのための二つの種類のコンテナライザーをサポートします: "docker" コンテナライザー、そして優先的な "mesos" コンテナライザー。詳しくはここを読んでください: http://mesos.apache.org/documentation/latest/container-image/
spark.mesos.driver.webui.url (none) フレームワークとやり取りするための Spark Mesos ドライバーの webui_url を設定します。設定しない場合は、Sparkの内部web UIを示すでしょう。
spark.mesos.driverEnv.[EnvironmentVariableName] (none) これはクラスタモードでサブミットされたドライバにのみ影響します。EnvironmentVariableName で指定された環境変数をドライバプロセスに追加します。ユーザは複数の環境変数を設定するために複数のそれらを指定することができます。
spark.mesos.dispatcher.webui.url (none) フレームワークとやり取りするための Spark Mesos dispatcherの webui_url を設定します。設定しない場合は、Sparkの内部web UIを示すでしょう。
spark.mesos.dispatcher.driverDefault.[PropertyName] (none) dispatcherを通じてサブミットされたドライバのためのデフォルトのプロパティを設定します。例えば、spark.mesos.dispatcher.driverProperty.spark.executor.memory=32g はクラスタモードにサブミットされた全てのドライバのexecutorが32g コンテナで実行するようにします。
spark.mesos.dispatcher.historyServer.url (none) 履歴サーバのURLを設定します。dispatcher は履歴サーバ内のエントリを各ドライバにリンクします。
spark.mesos.gpus.max 0 このジョブのために取得するGPUリソースの最大数を設定します。この設定は単なる上限であり保証では無いため、GPUリソースが無い場合でもexecutorは起動しつづけるでしょう。
spark.mesos.network.name (none) 指定された名前のネットワークにコンテナをアタッチします。このジョブがクラスタモード内で起動された場合は、指定された名前のネットワーク内でドライバも起動します。詳細は Mesos CNI ドキュメント を見てください。
spark.mesos.fetcherCache.enable false `true` に設定した場合、全てのURL (例えば: `spark.executor.uri`, `spark.mesos.uris`) は Mesos Fetcher Cacheによって捕らえられるでしょう。

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

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

そして共通の落とし穴:

TOP
inserted by FC2 system