web-dev-qa-db-ja.com

Spark Jobにjarを追加する - spark-submit

本当...それはかなり多く議論されています。

しかし、多くのあいまいさといくつかの答えが提供されています... jar/executor/driverの設定やオプションでのjar参照の複製を含む。

あいまいで省略された詳細

以下のあいまいさ、不明確さ、および/または省略された詳細は、各オプションについて明確にされるべきです:

  • ClassPathへの影響
    • Driver
    • エグゼキュータ(実行中のタスク用)
    • 両方
    • どういたしまして
  • 区切り文字:コンマ、コロン、セミコロン
  • 提供されたファイルが自動的に配布される場合
    • タスク用(各executorへ)
    • リモートドライバ用(クラスタモードで実行した場合)
  • 受け入れられるURIの種類:ローカルファイル、hdfs、httpなど
  • 共通の場所にコピーした場合、その場所は(hdfs、local?)です。

影響を受けるオプション:

  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ファイルです。

私はどこで メインスパークドキュメント 、特に 送信方法 、利用可能な オプション 、そしてまた{ JavaDoc を見つけることができるかを知っています_。しかし、それは部分的にも答えましたが、私にはまだかなりの穴が残っていました。

それほど複雑ではないこと、そして誰かが私に明確で簡潔な答えをくれることを願っています。

ドキュメントから推測すると、--jarsSparkContextaddJar、および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)の違いについてよく説明しています。心に留めておくことは間違いなく重要です。

122
YoYo

クラスパス:

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 /その他のソースを介して、すべてのワーカーノードでJARSを手動で使用可能にする必要があります。

ファイルの受け入れられた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は各ワーカーノードの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
147
Yuval Itzchakov

spark 2.1.0のもう1つのアプローチは、ユーザーが--conf spark.driver.userClassPathFirst=trueオプションでクラスパスに追加しているjarを優先することによって、依存性ロードの優先順位、したがってspark-jobの動作を変更するspark-submitの間に--jarsを使用することです。

4
Stanislav

Spark-submitユーティリティを使用してスパークジョブを送信する一方で、オプション--jarsがあります。このオプションを使用すると、jarファイルをスパークアプリケーションに渡すことができます。

0
bala

--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
0
Tanveer

デプロイモードとして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ドライバのクラスパスに含まれます。

0
DaRkMaN