[解決済み] SparkのジョブにJARファイルを追加する - spark-submit
質問
本当だ...結構議論されているんですね。
しかし、多くの曖昧さがあり、提供された答えのいくつかは... jars/executor/driverの設定やオプションでJAR参照を重複させるなどしています。
あいまいな点、省略されている点
各オプションについて、以下の曖昧さ、不明確さ、省略された内容を明確にすること。
-
ClassPathの影響について
- ドライバ
- エグゼキュータ(タスク実行用)
- 両方
- ぜんぜん
- 区切り文字:カンマ、コロン、セミコロン
-
提供されたファイルが自動的に配布される場合
- タスク(各エクゼキュータ)に対して
- リモートドライバー用 (クラスターモードで実行した場合)
- 受け入れられる URI のタイプ: ローカルファイル。 HDFS HTTPなど
- コピーした場合 への 共通の場所、その場所がどこなのか(HDFS、ローカル?)
影響を与えるオプション。
-
--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=...
- 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
でいい記事を見つけました。 他の投稿への回答 . しかし、何も新しいことは学べなかった。この投稿者は、"A "と "B "の違いについて、良い指摘をしています。 ローカルドライバ (yarn-client)と リモートドライバ (yarn-cluster)です。間違いなく重要なことなので、覚えておいてください。
解決方法は?
クラスパス
ClassPathは、提供するものによって影響を受けます。クラスパスに何かを設定するには、いくつかの方法があります。
-
spark.driver.extraClassPath
またはその別名--driver-class-path
を使用して、ドライバを実行しているノードに追加のクラスパスを設定します。 -
spark.executor.extraClassPath
で、Worker ノードに追加のクラスパスを設定します。
もし、あるJARをMasterとWorkerの両方で有効にしたい場合は、BOTHフラグで別々に指定する必要があります。
分離文字。
-
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サーバーを設定します。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 ファイルにあるオプション
ですから、これらの値を適切な場所に設定するようにしてください。そうすれば、どちらかが優先されても驚かないでしょう。
設問の各選択肢を分析してみよう。
-
--jars
対SparkContext.addJar
: これらは同じものです。片方はSparkのsubmitで、片方はコードで設定するだけです。自分に合った方を選んでください。注意点としては、これらのオプションのどちらを使っても は、JARファイルをドライバ/エグゼキュータのクラスパスに追加しません。 . を使用して明示的に追加する必要があります。extraClassPath
の両方で設定できます。 -
SparkContext.addJar
対SparkContext.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
関連
-
javaの実行中に「javaの例外が発生しました」と表示された場合はどうすればよいですか?
-
javaの模造品QQ WeChatのチャットルーム
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
VMの初期化中にエラーが発生しました java/lang/NoClassDefFoundError: java/lang/Object
-
javaでクラスを作成すると、enclosing classでないように見える
-
Javaエラーメッセージがenclosingクラスでない
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Mavenプロジェクトにローカルのjarファイルを追加する方法は?
-
[解決済み】Spark StandaloneクラスタのWorker、Executor、Coreとは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
スレッド "main "での例外をEclipseで解決 java.lang.Error: 未解決のコンパイル問題、コンパイラとパッケージの不整合
-
jd-gui Java Exceptionが発生しました。
-
SpringBootApplication を型解決できない。
-
Android Studio 3.1.2 で v4, v7 パッケージが見つからない シンボル 'AppCompatActivity' を解決できない
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
java.lang.NoClassDefFoundError: org.apache.jasper.el.ELContextImpl クラスを初期化できませんでした。
-
Exception: java.util.NoSuchElementException: 行が見つかりません
-
Google Chromeのエラー「Not allowed to load local resource」の解決策について
-
コミットには何も追加されないが、未追跡のファイルが存在し、gitで未追跡のファイルに対する完璧な解決策