1. ホーム
  2. java

[解決済み] SparkのジョブにJARファイルを追加する - spark-submit

2022-04-16 18:23:44

質問

本当だ...結構議論されているんですね。

しかし、多くの曖昧さがあり、提供された答えのいくつかは... jars/executor/driverの設定やオプションでJAR参照を重複させるなどしています。

あいまいな点、省略されている点

各オプションについて、以下の曖昧さ、不明確さ、省略された内容を明確にすること。

  • ClassPathの影響について
    • ドライバ
    • エグゼキュータ(タスク実行用)
    • 両方
    • ぜんぜん
  • 区切り文字:カンマ、コロン、セミコロン
  • 提供されたファイルが自動的に配布される場合
    • タスク(各エクゼキュータ)に対して
    • リモートドライバー用 (クラスターモードで実行した場合)
  • 受け入れられる 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 addJaraddFile メソッドは自動的にファイルを配布するもので、他のオプションは単に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

でいい記事を見つけました。 他の投稿への回答 . しかし、何も新しいことは学べなかった。この投稿者は、"A "と "B "の違いについて、良い指摘をしています。 ローカルドライバ (yarn-client)と リモートドライバ (yarn-cluster)です。間違いなく重要なことなので、覚えておいてください。

解決方法は?

クラスパス

ClassPathは、提供するものによって影響を受けます。クラスパスに何かを設定するには、いくつかの方法があります。

  • spark.driver.extraClassPath またはその別名 --driver-class-path を使用して、ドライバを実行しているノードに追加のクラスパスを設定します。
  • spark.executor.extraClassPath で、Worker ノードに追加のクラスパスを設定します。

もし、あるJARをMasterとWorkerの両方で有効にしたい場合は、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サーバーを設定します。JARファイルは、HDFS、S3、またはすべてのノードが利用できるその他のソースを介して、すべてのワーカーノードが利用できるように手動で作成する必要があります。

使用可能なファイルURI

申請書を提出します。 Spark のドキュメントでは、ファイルに対して受け入れられる接頭辞について、うまく説明されています。

<ブロッククオート

spark-submitを使用する場合、アプリケーションのjarと任意のjar jarsオプションで指定されたものは、自動的に クラスタ Sparkは、以下のURLスキームを使用して、さまざまな の戦略で配布することができます。

  • ファイルです。- 絶対パスと file:/ URI は、ドライバの HTTP ファイルサーバからファイルを取得し、各エクゼキュータがドライバの HTTP サーバに接続します。
  • hdfs:, http:, https:, ftp: - これらは、ファイルやJARをプルダウンします。 URIから期待される
  • local: - local:/で始まるURIは、そのURIを使用することで は、各ワーカーノード上にローカルファイルとして存在することが期待されます。これは ネットワークIOが発生しないので、大きなファイル/JARの場合はうまくいきます。 を、各ワーカーにプッシュしたり、NFS や GlusterFS などで共有したりします。
<ブロッククオート

JARやファイルは、それぞれの作業ディレクトリにコピーされることに注意してください。 実行ノード上の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 ファイルにあるオプション

ですから、これらの値を適切な場所に設定するようにしてください。そうすれば、どちらかが優先されても驚かないでしょう。

設問の各選択肢を分析してみよう。

  • --jarsSparkContext.addJar : これらは同じものです。片方はSparkのsubmitで、片方はコードで設定するだけです。自分に合った方を選んでください。注意点としては、これらのオプションのどちらを使っても は、JARファイルをドライバ/エグゼキュータのクラスパスに追加しません。 . を使用して明示的に追加する必要があります。 extraClassPath の両方で設定できます。
  • SparkContext.addJarSparkContext.addFile : がある場合は前者を使用します。 依存関係 をコードで使用する必要があります。後者は、単にワーカーノードに任意のファイルを渡したいだけで、コードの実行時依存関係にはならない場合に使用します。
  • --conf spark.driver.extraClassPath=... または --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から見えるライブラリ・パスが必要な場合に、これを使用します。
<ブロッククオート

を追加することができると考えてもよいでしょうか。 アプリケーションの jar ファイルを、3つの主要なオプションで同時に使用することができます。

に限って想定しておくと安心です。 クライアント モードではなく クラスター モードとなります。以前にも申し上げたとおりです。あと、あげた例には冗長な引数がありますね。例えば、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