私は最近 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
適切にそれを適切にドライバーとエグゼキューターに渡しますか?
ありがとう!
Java.io.FileNotFoundException
これはおそらく解決できません。
単純に、SparkContext.addFile
はJar内からファイルを読み取ることができません。一部のZip
と同じように扱われていると思います。
いいね。
-Dlogback.configurationFile
を渡すこれは、構成パラメーターに関する私の誤解のために機能しませんでした。
--master yarn
パラメータを使用していますが、--deploy-mode
をcluster
に指定していないため、デフォルトでは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" \