10

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

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

私がこれまでに持っているもの

基本的に、 System プロパティ をチェックしますが、念のためmy から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

だから私は思った、OK。システム プロパティを指定できるので、ファイルを渡します。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

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

ありがとう!

4

1 に答える 1

18

1.解決java.io.FileNotFoundException

これはおそらく解決不可能です。

単純にSparkContext.addFile、Jar 内からファイルを読み取ることができません。私はそれがいくつかzipまたは同様にあったように扱われると信じています。

罰金。

2.合格-Dlogback.configurationFile

これは、構成パラメーターの誤解により機能しませんでした。

パラメーターを使用しているため、指定して--master yarnいませんが、デフォルトです。--deploy-modeclusterclient

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" \
于 2017-08-07T10:30:22.780 に答える