web-dev-qa-db-ja.com

システムプロパティをspark-submitに渡し、クラスパスまたはカスタムパスからファイルを読み取ります

私は最近 log4j の代わりにlogbackを使用する方法を見つけましたSpark(ローカル使用とspark-submit)の両方です。ただし、最後のピースが欠落しています。

問題は、Sparkがそのクラスパスでlogback.xml設定を表示しないように非常に懸命に試みていることです。ローカル実行中にそれをロードする方法をすでに見つけました:

私が今持っているもの

基本的に、システムプロパティlogback.configurationFileを確認していますが、念のため、logback.xml/src/main/resources/から読み込んでいます。

// the same as default: https://logback.qos.ch/manual/configuration.html
private val LogbackLocation = Option(System.getProperty("logback.configurationFile"))
// add some default logback.xml to your /src/main/resources
private lazy val defaultLogbackConf = getClass.getResource("/logback.xml").getPath

private def getLogbackConfigPath = {
   val path = LogbackLocation.map(new File(_).getPath).getOrElse(defaultLogbackConf)
   logger.info(s"Loading logging configuration from: $path")
   path
}

そして、SparkContextを初期化すると...

val sc = SparkContext.getOrCreate(conf)
sc.addFile(getLogbackConfigPath)

ローカルで動作することを確認できます。

spark-submitで遊ぶ

spark-submit \
  ...
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

これはエラーになります:

Exception in thread "main" Java.io.FileNotFoundException: Added file file:/path/to/my/application-fat.jar!/logback.xml does not exist

最初にアプリケーションがファイルを見つけるので、これはナンセンスだと思います(私のコードによると)

getClass.getResource("/logback.xml").getPath

そしてその後、

sc.addFile(getLogbackConfigPath)

わかった...おっと!ファイルがありません!?一体何ですか!? jarファイルが見つからないのはなぜですか。それは明らかにそこにあります、私はそれをチェックしましたトリプル

spark-submitへの別のアプローチ

だから私はそう思いましたシステムプロパティを指定できるので、ファイルを渡します。私はlogback.xmlファイルをapplication-fat.jarの隣に置き、

spark-submit \
  ...
  --conf spark.driver.extraJavaOptions="-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --conf spark.executor.extraJavaOptions="-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

上記と同じエラーが発生します。だから私の設定は完全に無視されます!どうして?指定方法

-Dlogback.configurationFile

適切にそれを適切にドライバーとエグゼキューターに渡しますか?

ありがとう!

9
Atais

1.解決法Java.io.FileNotFoundException

これはおそらく解決できません

単純に、SparkContext.addFileはJar内からファイルを読み取ることができません。一部のZipと同じように扱われていると思います。

いいね。

2. -Dlogback.configurationFileを渡す

これは、構成パラメーターに関する私の誤解のために機能しませんでした。

--master yarnパラメータを使用していますが、--deploy-modeclusterに指定していないため、デフォルトではclientです。

読み取り https://spark.Apache.org/docs/1.6.1/configuration.html#application-properties

spark.driver.extraJavaOptions

注:クライアントモードでは、ドライバーJVMがその時点ですでに開始されているため、この構成をアプリケーションのSparkConfから直接設定しないでください。代わりに、これを--driver-Java-optionsコマンドラインオプションまたはデフォルトのプロパティファイルで設定してください。

したがって、この設定を--driver-Java-optionsで渡すとうまくいきました。

spark-submit \
  ...
  --driver-Java-options "-Dlogback.configurationFile=/path/to/my/logback.xml" \
  --master yarn \
  --class com.company.Main\
  /path/to/my/application-fat.jar \
  param1 param2 

--driver-Java-optionsに関する注意

--confとは対照的に、複数のパラメーターは1つのパラメーターとして渡される必要があります。例:

--driver-Java-options "-Dlogback.configurationFile=/path/to/my/logback.xml -Dother.setting=value" \

そして、次のは機能しません

--driver-Java-options "-Dlogback.configurationFile=/path/to/my/logback.xml" \
--driver-Java-options "-Dother.setting=value" \
12
Atais