アプリケーションの提出

Sparkのbin ディレクトリの中にある spark-submitスクリプトはクラスタ上でアプリケーションを起動するために使われます。それは一様のインタフェースを使ってSparkのサポートするクラスタマネージャーを使用することができるため、アプリケーションをそれぞれのために特別に設定する必要はありません。

アプリケーションの依存性をバンドル

コードが他のプロジェクトに依存する場合は、コードをSparkのクラスタに配布するためにアプリケーションと一緒にそれらをパッケージする必要があるでしょう。これをするには、コードとその依存物を含むアセンブリjar(あるいは"uber"jar)を作る必要があります。sbtMavenの両方ともアセンブリ プラグインを持ちます。アセンブリ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]

良く使われるオプションの幾つかは:

一般的なデプロイのストラテジはワーカーマシーンと物理的に同じ場所にあるゲートウェイマシーンからアプリケーションをサブミットします(例えば、スタンドアローン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を広めるために以下の異なる戦略を使用します:

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 オプションを使うことができます。

更なる情報

アプリケーションを一旦デプロイすると、分散化処理で必要とされるコンポーネントと、どうやってアプリケーションを監視およびデバッグするかについて、クラスタモードの概要が説明します。

TOP
inserted by FC2 system