最近、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
ドライバーとエグゼキューターに適切に渡しますか?
ありがとう!