本当...それはかなり多く議論されています。
しかし、多くのあいまいさといくつかの答えが提供されています... jar/executor/driverの設定やオプションでのjar参照の複製を含む。
以下のあいまいさ、不明確さ、および/または省略された詳細は、各オプションについて明確にされるべきです:
--jars
SparkContext.addJar(...)
メソッドSparkContext.addFile(...)
メソッド--conf spark.driver.extraClassPath=...
または--driver-class-path ...
--conf spark.driver.extraLibraryPath=...
、または--driver-library-path ...
--conf spark.executor.extraClassPath=...
--conf spark.executor.extraLibraryPath=...
私はどこで メインスパークドキュメント 、特に 送信方法 、利用可能な オプション 、そしてまた{ JavaDoc を見つけることができるかを知っています_。しかし、それは部分的にも答えましたが、私にはまだかなりの穴が残っていました。
それほど複雑ではないこと、そして誰かが私に明確で簡潔な答えをくれることを願っています。
ドキュメントから推測すると、--jars
、SparkContext
、addJar
、およびaddFile
の各メソッドはファイルを自動的に配布するもので、他のオプションはClassPathを変更するだけです。
簡単にするために、3つの主なオプションを使用してアプリケーションのjarファイルを追加することができます。
spark-submit --jar additional1.jar,additional2.jar \
--driver-library-path additional1.jar:additional2.jar \
--conf spark.executor.extraLibraryPath=additional1.jar:additional2.jar \
--class MyClass main-application.jar
別の投稿への回答 で素敵な記事が見つかりました。しかし、新しいことは何も学びませんでした。ポスターは、Local driver(yarn-client)とRemote Driver(yarn-cluster)の違いについてよく説明しています。心に留めておくことは間違いなく重要です。
ClassPathは、提供する内容によって影響を受けます。クラスパスに何かを設定するには、いくつかの方法があります。
spark.driver.extraClassPath
またはエイリアス--driver-class-path
は、ドライバーを実行しているノードに追加のクラスパスを設定します。spark.executor.extraClassPath
は、ワーカーノードに追加のクラスパスを設定します。特定のJARをマスターとワーカーの両方で有効にする場合は、BOTHフラグでこれらを個別に指定する必要があります。
:
--conf "spark.driver.extraClassPath=/opt/prog/hadoop-aws-2.7.1.jar:/opt/prog/aws-Java-sdk-1.10.50.jar"
;
--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 /その他のソースを介して、すべてのワーカーノードでJARSを手動で使用可能にする必要があります。
"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は各ワーカーノードのworkingディレクトリにコピーされます。それは正確にはどこですか? /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
理解する最も重要なことは、priorityです。コードを介してプロパティを渡す場合、spark-submit
を介して指定するオプションよりも優先されます。これはSparkのドキュメントに記載されています:
フラグとして、またはプロパティファイルで指定された値はすべてアプリケーションに渡され、SparkConfで指定された値とマージされます。 SparkConfに直接設定されたプロパティが最も優先され、spark-submitまたはspark-Shellに渡されたフラグ、spark-defaults.confファイルのオプション
そのため、適切な場所にこれらの値を設定してください。そうすれば、一方が他方より優先されても驚かないでしょう。
問題の各オプションを分析します。
--jars
vs SparkContext.addJar
:これらは同じです。1つだけがspark submitで設定され、1つはコードで設定されます。最適なスイートを選択してください。注意すべき重要な点は、これらのオプションのいずれかを使用しても、JARがドライバー/エグゼキューターのクラスパスに追加されないため、明示的に追加する必要があることです。両方でextraClassPath
configを使用します。SparkContext.addJar
vs SparkContext.addFile
:コードで使用する必要があるdependencyがある場合は前者を使用します。任意のファイルをワーカーノードに渡すだけの場合は、後者を使用します。これは、コードの実行時依存関係ではありません。--conf spark.driver.extraClassPath=...
または--driver-class-path
:これらはエイリアスであり、どちらを選択してもかまいません--conf spark.driver.extraLibraryPath=..., or --driver-library-path ...
上記と同じ、エイリアス。--conf spark.executor.extraClassPath=...
:これは、uber JARに含めることができない依存関係があり(たとえば、ライブラリバージョン間でコンパイル時の競合があるため)、実行時にロードする必要がある場合に使用します。--conf spark.executor.extraLibraryPath=...
これは、JVMのJava.library.path
オプションとして渡されます。 JVMから見えるライブラリパスが必要な場合に使用します。簡単にするために、3つの主要なオプションを同時に使用して追加のアプリケーションjarファイルを追加できると想定しても安全ですか?
これは、クラスターモードではなく、クライアントモードでのみ安全に想定できます。前に言ったように。また、指定した例にはいくつかの冗長な引数があります。たとえば、JARを--driver-library-path
に渡すのは役に立たないので、クラスパスに配置する場合は、extraClassPath
に渡す必要があります。最終的に、外部JARをドライバーとワーカーの両方にデプロイするときに行うことは次のとおりです。
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
spark 2.1.0
のもう1つのアプローチは、ユーザーが--conf spark.driver.userClassPathFirst=true
オプションでクラスパスに追加しているjarを優先することによって、依存性ロードの優先順位、したがってspark-jobの動作を変更するspark-submitの間に--jars
を使用することです。
Spark-submitユーティリティを使用してスパークジョブを送信する一方で、オプション--jars
があります。このオプションを使用すると、jarファイルをスパークアプリケーションに渡すことができます。
--jars
の使用には制限があります。jar/xml
ファイルの場所にディレクトリを指定したい場合、ディレクトリの拡張はできません。これは、各jarファイルの絶対パスを指定する必要があるかどうかを意味します。
--driver-class-path
を指定し、かつ、ヤーンクラスタモードで実行している場合、ドライバクラスは更新されません。タブ環境下でクラスパスが更新されているかどうかを確認することができます。
ディレクトリ展開を含むjarクラスタモードで動作するjarファイルを渡すために私には有効だったオプションは--conf
オプションでした。ドライバとエグゼキュータのクラスパスを--conf
として渡す方が良いでしょう。これはそれらをスパークセッションオブジェクト自体に追加し、それらのパスはSpark設定に反映されます。しかし、jarは必ずクラスタ内の同じパスに配置してください。
spark-submit \
--master yarn \
--queue spark_queue \
--deploy-mode cluster \
--num-executors 12 \
--executor-memory 4g \
--driver-memory 8g \
--executor-cores 4 \
--conf spark.ui.enabled=False \
--conf spark.driver.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
--conf spark.hadoop.mapred.output.dir=/tmp \
--conf spark.executor.extraClassPath=/usr/hdp/current/hbase-master/lib/hbase-server.jar:/usr/hdp/current/hbase-master/lib/hbase-common.jar:/usr/hdp/current/hbase-master/lib/hbase-client.jar:/usr/hdp/current/hbase-master/lib/zookeeper.jar:/usr/hdp/current/hbase-master/lib/hbase-protocol.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/scopt_2.11-3.3.0.jar:/usr/hdp/current/spark2-thriftserver/examples/jars/spark-examples_2.10-1.1.0.jar:/etc/hbase/conf \
--conf spark.hadoop.mapreduce.output.fileoutputformat.outputdir=/tmp
デプロイモードとしてyarn
の場合のjarとクラスパスに関するその他の設定可能なSparkオプションは以下の通りです。
sparkドキュメントから、
spark.yarn.jars
YARNコンテナに配布するSparkコードを含むライブラリのリスト。デフォルトでは、Spark on YARNはローカルにインストールされたSpark jarを使用しますが、Spark jarはHDFS上の世界的に読み取り可能な場所に置くこともできます。これにより、YARNはそれをノードにキャッシュして、アプリケーションが実行されるたびに配布する必要がないようにすることができます。たとえば、HDFSのjarファイルを指すには、この設定をhdfs:/// some/pathに設定します。グロブは許可されています。
spark.yarn.archive
YARNキャッシュへの配布に必要なSpark jarを含むアーカイブ。設定すると、この設定はspark.yarn.jarsを置き換え、アーカイブはすべてのアプリケーションのコンテナで使用されます。アーカイブのルートディレクトリにjarファイルが含まれているはずです。前のオプションと同様に、ファイル配布を高速化するためにアーカイブをHDFSでホストすることもできます。
ユーザーは自分のjarファイルを指定するようにこのパラメータを設定することができ、そのinturnはSparkドライバのクラスパスに含まれます。