クラスパス:
ClassPath は、提供する内容に応じて影響を受けます。クラスパスに何かを設定するには、いくつかの方法があります。
spark.driver.extraClassPath
--driver-class-path
または、ドライバーを実行しているノードに追加のクラスパスを設定するエイリアスです。
spark.executor.extraClassPath
ワーカー ノードに追加のクラス パスを設定します。
特定の JAR をマスターとワーカーの両方で有効にする場合は、これらを BOTH フラグで個別に指定する必要があります。
区切り文字:
JVM と同じルールに従います。
- Linux: コロン、
:
- 例えば:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-java-sdk-1.10.50.jar"
- Windows: セミコロン、
;
- 例えば:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar;/opt/prog/aws-java-sdk-1.10.50.jar"
ファイル配布:
これは、ジョブを実行しているモードによって異なります。
クライアント モード - Spark は、各ワーカー ノードの起動時にファイルを配布するNetty HTTP サーバーを起動します。Spark ジョブを開始すると、次のことがわかります。
16/05/08 17:29:12 INFO HttpFileServer: HTTP File server directory is /tmp/spark-48911afa-db63-4ffc-a298-015e8b96bc55/httpd-84ae312b-5863-4f4c-a1ea-537bfca2bc2b
16/05/08 17:29:12 INFO HttpServer: Starting HTTP Server
16/05/08 17:29:12 INFO Utils: Successfully started service 'HTTP file server' on port 58922.
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/foo.jar at http://***:58922/jars/com.mycode.jar with timestamp 1462728552732
16/05/08 17:29:12 INFO SparkContext: Added JAR /opt/aws-java-sdk-1.10.50.jar at http://***:58922/jars/aws-java-sdk-1.10.50.jar with timestamp 1462728552767
クラスター モード - クラスター モードでは、Sparkはドライバープロセスを実行するリーダーワーカーノードを選択しました。これは、ジョブがマスターノードから直接実行されていないことを意味します。ここで、SparkはHTTP サーバーを設定しません。HDFS、S3、またはすべてのノードで利用可能なその他のソースを介して、すべてのワーカー ノードで JAR ファイルを手動で利用できるようにする必要があります。
ファイルの受け入れられる URI
"Submitting Applications"では、Spark のドキュメントで、ファイルに使用できるプレフィックスが適切に説明されています。
spark-submit を使用すると、アプリケーション jar と --jars オプションに含まれるすべての jar が自動的にクラスターに転送されます。Spark は、次の URL スキームを使用して、jar を配布するためのさまざまな戦略を許可します。
- file: - 絶対パスと file:/ URI はドライバーの HTTP ファイル サーバーによって提供され、すべてのエグゼキューターはドライバーの HTTP サーバーからファイルをプルします。
- hdfs:、http:、https:、ftp: - これらは、URI から期待どおりにファイルと JAR をプル ダウンします。
- local: - local:/ で始まる URI は、各ワーカー ノードにローカル ファイルとして存在することが期待されます。これは、ネットワーク IO が発生しないことを意味し、各ワーカーにプッシュされるか、NFS、GlusterFS などを介して共有される大きなファイル/JAR に適しています。
JAR とファイルは、executor ノードの各 SparkContext の作業ディレクトリにコピーされることに注意してください。
前述のとおり、JAR ファイルは各ワーカーノードの作業ディレクトリにコピーされます。それは正確にはどこですか?通常はの下にあり、次のように表示されます。/var/run/spark/work
drwxr-xr-x 3 spark spark 4096 May 15 06:16 app-20160515061614-0027
drwxr-xr-x 3 spark spark 4096 May 15 07:04 app-20160515070442-0028
drwxr-xr-x 3 spark spark 4096 May 15 07:18 app-20160515071819-0029
drwxr-xr-x 3 spark spark 4096 May 15 07:38 app-20160515073852-0030
drwxr-xr-x 3 spark spark 4096 May 15 08:13 app-20160515081350-0031
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172020-0032
drwxr-xr-x 3 spark spark 4096 May 18 17:20 app-20160518172045-0033
内部を見ると、デプロイしたすべての JAR ファイルが表示されます。
[*@*]$ cd /var/run/spark/work/app-20160508173423-0014/1/
[*@*]$ ll
total 89988
-rwxr-xr-x 1 spark spark 801117 May 8 17:34 awscala_2.10-0.5.5.jar
-rwxr-xr-x 1 spark spark 29558264 May 8 17:34 aws-java-sdk-1.10.50.jar
-rwxr-xr-x 1 spark spark 59466931 May 8 17:34 com.mycode.code.jar
-rwxr-xr-x 1 spark spark 2308517 May 8 17:34 guava-19.0.jar
-rw-r--r-- 1 spark spark 457 May 8 17:34 stderr
-rw-r--r-- 1 spark spark 0 May 8 17:34 stdout
影響を受けるオプション:
理解すべき最も重要なことは、優先度です。コードでプロパティを渡すと、 で指定したオプションよりも優先されますspark-submit
。これは、Spark のドキュメントに記載されています。
フラグまたはプロパティ ファイルで指定された値はすべてアプリケーションに渡され、SparkConf で指定された値とマージされます。SparkConf に直接設定されたプロパティが最も優先され、spark-submit または spark-shell に渡されるフラグ、spark-defaults.conf ファイルのオプションが続きます。
したがって、これらの値を適切な場所に設定してください。そうすれば、一方が他方よりも優先されても驚くことはありません。
質問の各オプションを分析してみましょう。
--jars
vs SparkContext.addJar
: これらは同一です。1 つだけが Spark 送信によって設定され、もう 1 つがコードによって設定されます。あなたに合ったものを選んでください。注意すべき重要な点の 1 つは、これらのオプションのいずれかを使用しても、JAR ファイルが driver/executor classpath に追加されないことです。extraClassPath
両方の構成を使用して明示的に追加する必要があります。
SparkContext.addJar
vs : コードで使用する必要がある依存関係があるSparkContext.addFile
場合は、前者を使用します。コードの実行時の依存関係ではない任意のファイルをワーカー ノードに渡すだけの場合は、後者を使用します。
--conf spark.driver.extraClassPath=...
or --driver-class-path
: これらはエイリアスであり、どちらを選択しても問題ありません
--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
上記と同じ、別名。
--conf spark.executor.extraClassPath=...
: über JAR に含めることができず (たとえば、ライブラリ バージョン間にコンパイル時の競合があるため)、実行時にロードする必要がある依存関係がある場合に使用します。
--conf spark.executor.extraLibraryPath=...
java.library.path
これは、JVMのオプションとして渡されます。これは、JVM から見えるライブラリ パスが必要な場合に使用します。
簡単にするために、次の 3 つの主要なオプションを同時に使用してアプリケーション jar ファイルを追加できると仮定しても安全でしょうか。
これは、クラスターモードではなく、クライアントモードでのみ安全に想定できます。私が以前に言ったように。また、あなたが示した例には、いくつかの冗長な引数があります。たとえば、JAR ファイルを に渡しても無駄です。それらをクラスパスに配置したい場合は、それらを渡す必要があります。最終的に、ドライバーとワーカーの両方に外部 JAR ファイルをデプロイすると、次のことが必要になります。--driver-library-path
extraClassPath
spark-submit --jars additional1.jar,additional2.jar \
--driver-class-path additional1.jar:additional2.jar \
--conf spark.executor.extraClassPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar