クラスパス:
ClassPathは、提供する内容に応じて影響を受けます。クラスパスに何かを設定するには、いくつかの方法があります。
spark.driver.extraClassPath
または--driver-class-path
、ドライバを実行しているノードに追加のクラスパスを設定するエイリアスです。
spark.executor.extraClassPath
ワーカーノードに追加のクラスパスを設定する。
特定のJARをマスターとワーカーの両方で有効にする場合は、両方のフラグでこれらを個別に指定する必要があります。
分離文字:
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 / Otherソースを介して、すべてのワーカーノードでJARSを手動で使用できるようにする必要があります。
ファイルの受け入れられるURI
では「提出アプリケーション」、スパークのドキュメントは、ファイルのための受け入れられたプレフィックスを説明するのは良い仕事をしていません。
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
:これらは同じです。sparksubmitを介して設定されるのは1つだけで、コードを介して設定されるのは1つだけです。あなたに合ったものを選んでください。注意すべき重要な点の1つは、これらのオプションのどちらを使用しても、JARがドライバー/エグゼキューターのクラスパスに追加されないためextraClassPath
、両方の構成を使用して明示的に追加する必要があるということです。
SparkContext.addJar
vs SparkContext.addFile
:コードで使用する必要がある依存関係がある場合は、前者を使用します。後者は、任意のファイルをワーカーノードに渡したいだけの場合に使用します。これは、コードの実行時の依存関係ではありません。
--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=...
これはjava.library.path
、JVM のオプションとして渡されます。これは、JVMから見えるライブラリパスが必要な場合に使用します。
簡単にするために、3つの主要なオプションを同時に使用して追加のアプリケーションjarファイルを追加できると想定しても安全でしょうか。
これは、クラスターモードではなく、クライアントモードでのみ安全に想定できます。以前に言ったように。また、あなたが与えた例にはいくつかの冗長な引数があります。たとえば、JARを渡しても意味がありません。JARをクラスパスに置きたい場合--driver-library-path
は、JARを渡す必要があり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