アプリケーションの提出
Sparkのbin
ディレクトリの中にある spark-submit
スクリプトはクラスタ上でアプリケーションを起動するために使われます。それは一様のインタフェースを使ってSparkのサポートするクラスタマネージャーを使用することができるため、アプリケーションをそれぞれのために特別に設定する必要はありません。
アプリケーションの依存性をバンドル
コードが他のプロジェクトに依存する場合は、コードをSparkのクラスタに配布するためにアプリケーションと一緒にそれらをパッケージする必要があるでしょう。これをするには、コードとその依存物を含むアセンブリjar(あるいは"uber"jar)を作る必要があります。sbt と Mavenの両方ともアセンブリ プラグインを持ちます。アセンブリjarを生成する時に、SparkおよびHadoopをprovided
依存性としてリストします; それらは実行時にクラスタマネージャーによって提供されるため、これらはバンドルされる必要があります。一旦アセンブルされたjarを持つと、ここで示すようにjarを渡している間に bin/spark-submit
スクリプトを呼び出すことができます。
Pythonの場合、.py
, .zip
あるいは .egg
ファイルをアプリケーションと一緒に分散されるものに追加するために、spark-submit
の--py-files
引数を使うことができます。複数のPythonファイルに依存する場合は、それらを.zip
または .egg
にパッケージングすることをお勧めします。
spark-submitを使ってアプリケーションを起動
一旦ユーザアプリケーションがバンドルされると、bin/spark-submit
スクリプトを使って起動することができます。このスクリプトはSparkおよびその依存物を使ったクラスパスの設定の世話をし、Sparkがサポートする異なるクラスターマネージャーとデプロイモードをサポートします。
./bin/spark-submit \
--class <main-class>
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
良く使われるオプションの幾つかは:
--class
: アプリケーションのエントリーポイント(例えば、org.apache.spark.examples.SparkPi
)--master
: クラスターのためのmaster URL (例えば、spark://23.195.26.187:7077
)--deploy-mode
: ワーカーノード上(cluster
)のドライバをデプロイするか、外部クライアント(client
)としてローカルにデプロイするかどうか (デフォルトt:client
) †--conf
: key=value形式の任意のSpark設定プロパティ空白を含む値の場合、"key=value"を引用符で囲みます(このように)。application-jar
: アプリケーションとs部得ての依存物を含むバンドルされたjarのパス。クラスタ内でURLは大域的に見えなければなりません。例えば、全てのノード上に存在するhdfs://
パスあるいはfile://
パスです。application-arguments
: もしあれば、メインクラスのメインメソッドに渡す引数
† 一般的なデプロイのストラテジはワーカーマシーンと物理的に同じ場所にあるゲートウェイマシーンからアプリケーションをサブミットします(例えば、スタンドアローンEC2クラスタ内のマスターノード)。このセットアップでは、クライアント
モードが適切です。クライアント
モードでは、ドライバーはクラスターに対する<c4>クライアント</c4>として振る舞うspark-submit
プロセスの中で直接起動されます。アプリケーションの入力と出力はコンソールにアタッチされます。したがって、このモードはREPLを含むアプリケーション (例えば、Spark シェル)に特に適しています。
もう一つの方法として、もしアプリケーションがワーカーマシーンから離れたマシーンからサブミットされた場合(例えば、手元のラップトップ)、ドライバーとexecutorの間のネットワーク遅延を最小化するためにクラスター
モードを使うことが一般的です。クラスター
モードは現在のところMesosクラスターをサポートしないことに注意してください。現在のところPythonアプリケーションに関してはYARNのみがクラスターモードをサポートします。
Pythonアプリケーションに関しては、JARの代わりに.py
ファイルを <application-jar>
の代わりに単純に渡し、Pythonの.zip
, .egg
あるいは .py
ファイルを --py-files
を使って検索パスに追加します。
使用されるクラスターマネージャーに固有の利用可能な2,3のオプションがあります。例えば、クラスタ
デプロイモードのSpark スタンドアローンクラスタを使って、もし非0の終了コード無しに失敗した場合にドライバーが自動的に必ず再起動するように--supervise
を指定することもできます。そのようなspark-submit
で利用可能な全てのオプションを数え上げるには、--help
を付けてそれを実行してください。一般的なオプションの2,3の例があります:
# Run application locally on 8 cores
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
# Run on a Spark standalone cluster in client deploy mode
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# Run on a Spark standalone cluster in cluster deploy mode with supervise
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster
--supervise
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
# Run on a YARN cluster
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \ # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
# Run a Python application on a Spark standalone cluster
./bin/spark-submit \
--master spark://207.184.161.138:7077 \
examples/src/main/python/pi.py \
1000
# Run on a Mesos cluster in cluster deploy mode with supervise
./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
マスターURL
Sparkに渡されるマスターURLは以下のフォーマットのうちの一つです:
マスターURL | 意味 |
---|---|
local | Sparkをローカルで一つのワーカースレッドで実行する(つまり、全く並行ではありません)。 |
local[K] | SparkをローカルでK個のワーカースレッドで実行する(理想的には、マシーン上のコアの数に設定します)。 |
local[*] | Sparkをローカルでマシーン上の論理コアと同数のワーカースレッドで実行する。 |
spark://HOST:PORT | 指定されたSpark スタンドアローン クラスタ マスターに接続する。ポートはマスターが使用するように設定されたどちらかでなければなりません。デフォルトでは7077です。 |
mesos://HOST:PORT | 指定された Mesosクラスタに接続する。ポートはマスターが使用するように設定されたどちらかでなければなりません。デフォルトでは5050です。あるいはZooKeeperを使っているMesosクラスタの場合は、mesos://zk://... を使います。--deploy-mode cluster を付けてサブミットするには、MesosClusterDispatcherに接続するために HOST:PORT が設定されていなければなりません。
|
yarn | --deploy-mode の値に依存するclient あるいは cluster モードで、 YARN クラスタに接続します。クラスタの場所はHADOOP_CONF_DIR あるいは YARN_CONF_DIR 変数に基づいて見つけられるでしょう。
|
yarn-client | --deploy-mode client を付けたyarn と等価で、`yarn-client`より望ましいです。
|
yarn-cluster | --deploy-mode cluster を付けたyarn と等価で、`yarn-cluster`より望ましいです。
|
ファイルから設定をロードする
spark-submit
スクリプトはプロパティファイルからデフォルトのSpark 設定値をロードし、それらをアプリケーションに渡すことができます。デフォルトでは、Sparkディレクトリ内のconf/spark-defaults.conf
からオプションを読み込むでしょう。詳細は デフォルトの設定のロードの章を見てください。
この方法でデフォルトのSpark設定をロードすると、特定のフラグがspark-submit
する必要性を未然に防ぎます。例えば、もしspark.master
プロパティが設定された場合、安全に --master
フラグをspark-submit
から省略することができます。一般的に、SparkConf
に明示的に設定された設定値は高い先例となり、次にspark-submit
に渡されたフラグで、その次がデフォルトのファイル中の値です。
設定オプションが来ている場所がこれまで明確では無い場合は、c0>spark-submitを--verbose
オプションを付けて実行することで、細かいデバッグ情報を出力することができます。
上級の依存管理
spark-submit
を使う場合、--jars
オプションを使って含まれる全てのjarと一緒にアプリケーションのjarが自動的にクラスタに転送されるでしょう。Sparkはjarを広めるために以下の異なる戦略を使用します:
- file: - ドライバーのHTTPファイルサーバによって提供される絶対パスと
file:/
URI。各executorはドライバーのHTTPサーバからファイルを取り出します。 - hdfs:, http:, https:, ftp: - これらは期待されるURIからファイルおよびJARを取り出します。
- local: - local:/ から始まるURIは、各ワーカーノード上のローカルファイルとして存在することが期待されます。このことは、ネットワークIOが発生せず、各ワーカーに送信、あるいはNFS、GlusterFSなどで共有される大きなファイル/JARにとって良く動作します。
JARおよびファイルはexecutorノード上の各SparkContextの作業ディレクトリにコピーされることに注意してください。これは長い間に膨大な量の容量を使い果たすかも知れず、掃除されなければならないでしょう。WARNを使う場合、掃除は自動的に処理され、Sparkスタンドアローンを使う場合はspark.worker.cleanup.appDataTtl
プロパティを使って自動的な掃除が設定可能です。
ユーザは--packages
を使ってmaven coordinateのカンマ区切りのリストを渡すことで他の依存性も含めるかもしれません。全ての推移的な依存性はこのコマンドが使われる場合に処理されるでしょう。追加のリポジトリ(あるいはSBTでのリゾルバー)は、フラグ--repositories
を使ったカンマ区切りの方式で追加することができます。これらのコマンドはSparkパッケージを含めるために、pyspark
, spark-shell
および spark-submit
と一緒に使うことができます。
Pythonでは、.egg
, .zip
および .py
ライブラリをexecutorに分配するために、等価な --py-files
オプションを使うことができます。
更なる情報
アプリケーションを一旦デプロイすると、分散化処理で必要とされるコンポーネントと、どうやってアプリケーションを監視およびデバッグするかについて、クラスタモードの概要が説明します。