188

確かに...それはかなり議論されてきました。

ただし、多くのあいまいさがあり、いくつかの回答が提供されています... jars/executor/driver 構成またはオプションでの JAR 参照の複製を含みます。

あいまいなおよび/または省略された詳細

次のあいまいさ、不明確、および/または省略された詳細は、各オプションについて明確にする必要があります。

  • ClassPath への影響
    • 運転者
    • Executor (実行中のタスク用)
    • 両方
    • 全くない
  • 区切り文字: コンマ、コロン、セミコロン
  • 提供ファイルを自動配信する場合
    • タスク用 (各エグゼキュータへ)
    • リモートドライバー用 (クラスターモードで実行されている場合)
  • 受け入れられる URI のタイプ: ローカル ファイル、HDFS、HTTP など。
  • 共通の場所にコピーする場合、その場所はどこですか (HDFS、ローカル?)

影響するオプション:

  1. --jars
  2. SparkContext.addJar(...)方法
  3. SparkContext.addFile(...)方法
  4. --conf spark.driver.extraClassPath=...また--driver-class-path ...
  5. --conf spark.driver.extraLibraryPath=...、 また--driver-library-path ...
  6. --conf spark.executor.extraClassPath=...
  7. --conf spark.executor.extraLibraryPath=...
  8. 忘れないように、spark-submit の最後のパラメーターも .jar ファイルです。

主要な Apache Spark ドキュメントがどこで見つかるか、具体的には送信方法、利用可能なオプション、および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

別の投稿への回答で素敵な記事を見つけました。しかし、新しいことは何も学ばれませんでした。ポスターは、ローカル ドライバー(yarn-client) とリモート ドライバー(yarn-cluster)の違いについて適切なコメントをしています。心に留めておくことは間違いなく重要です。

4

6 に答える 6

215

クラスパス:

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"

ファイル配布:

これは、ジョブを実行しているモードによって異なります。

  1. クライアント モード - 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
    
  2. クラスター モード - クラスター モードでは、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 ファイルのオプションが続きます。

したがって、これらの値を適切な場所に設定してください。そうすれば、一方が他方よりも優先されても驚くことはありません。

質問の各オプションを分析してみましょう。

  • --jarsvs SparkContext.addJar: これらは同一です。1 つだけが Spark 送信によって設定され、もう 1 つがコードによって設定されます。あなたに合ったものを選んでください。注意すべき重要な点の 1 つは、これらのオプションのいずれかを使用しても、JAR ファイルが driver/executor classpath に追加されないことです。extraClassPath両方の構成を使用して明示的に追加する必要があります。
  • SparkContext.addJarvs : コードで使用する必要がある依存関係がある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-pathextraClassPath

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
于 2016-05-20T13:40:21.863 に答える
3

の使用には制限があります。ファイル--jarsの場所にディレクトリを指定する場合、jar/xmlディレクトリの展開は許可されません。これは、各 JAR ファイルの絶対パスを指定する必要がある場合を意味します。

指定--driver-class-pathし、yarn クラスター モードで実行している場合、ドライバー クラスは更新されません。クラスパスが更新されているかどうかは、Spark UI またはタブ環境の Spark 履歴サーバーで確認できます。

ディレクトリ展開を含み、糸クラスターモードで機能するJARファイルを渡すために機能したオプションが--confオプションでした。ドライバーとエグゼキューターのクラス パスを として渡すことをお勧めします--conf。これにより、それらが Spark セッション オブジェクト自体に追加され、それらのパスが 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
于 2018-01-01T05:14:47.157 に答える
2

--master yarn-cluster で spark-submit を使用すると、アプリケーション JAR ファイルと--jarsオプションに含まれる JAR ファイルが自動的にクラスターに転送されます。--jars の後に指定する URL は、コンマで区切る必要があります。そのリストは、ドライバーとエグゼキューターのクラスパスに含まれています

例:

spark-submit --master yarn-cluster --jars ../lib/misc.jar, ../lib/test.jar --class MainClass MainApp.jar

参照

申請書の提出

于 2020-06-04T21:21:05.960 に答える