2015-11-20 9 views
8

これでコードが機能しなくなるわけではありませんが、この警告がなぜ発生するのかを理解しようとすると、私は狂ってしまいます。 Scala 2.11.7、ScalaIDE、SBT 0.13.9を使用しています。Spark 1.5.2とSLF4J StaticLoggerBinder

15/11/20 12:17:05 INFO akka.event.slf4j.Slf4jLogger: Slf4jLogger started 
15/11/20 12:17:06 INFO Remoting: Starting remoting 
15/11/20 12:17:06 INFO Remoting: Remoting started; listening on addresses :[akka.tcp://[email protected]:36509] 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 

[Stage 0:=======================================================> (31 + 1)/32] 
[Stage 0:=========================================================(32 + 0)/32] 
私はこのエラーがなぜ発生するのか理解していますが、Sparkのロギングには全く問題がありません。今、私のプロジェクトにslf4j-simpleという言葉を追加すると、複数のSLF4jバインディングがあると警告しますが、この警告は表示されません。私は私の人生のために、これらのことがうまくいくようにする方法を考え出すことはできません。私のコード自体はlog4j 2.4を使って自分のログを記録しています。

私がしようとしましたが、

  1. はスパークのロギングを除くと、私自身を含め役に立つしないようにしています。
  2. log4j2を使用してlog4j2をルーティングし、SparkのSLF4jを除外します。
  3. すべてのSLF4jバインディングを文字通り含めて試してみましょう。
  4. スパークのドライブとエグゼキュータクラスパスは、私がしようとスパークのログを除外した場合、私はスパークからにClassNotFoundの問題を取得します

、私のクラスパスに、SLF4Jのjarファイルを追加するが、私の人生のために私は理解できません一体何をしているのか

ただ、いくつかの詳細は、私がスパークを使用していますが、私は除いた。ここでのHadoopの私自身のバージョン(2.7.1)

含めていますが、私に従って提供されている私が関連していると思う瓶あるさシステムクラスローダ。

~/.ivy2/cache/org.slf4j/slf4j-api/jars/slf4j-api-1.7.10.jar 
~/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.10.jar 
~/.ivy2/cache/log4j/log4j/bundles/log4j-1.2.17.jar 
~/.ivy2/cache/org.slf4j/jul-to-slf4j/jars/jul-to-slf4j-1.7.10.jar 
~/.ivy2/cache/org.slf4j/jcl-over-slf4j/jars/jcl-over-slf4j-1.7.10.jar 
~/.ivy2/cache/com.typesafe.akka/akka-slf4j_2.11/jars/akka-slf4j_2.11-2.3.11.jar 
~/.ivy2/cache/org.apache.logging.log4j/log4j-api/jars/log4j-api-2.4.1.jar 
~/.ivy2/cache/org.apache.logging.log4j/log4j-core/jars/log4j-core-2.4.1.jar 
~/.ivy2/cache/com.typesafe.akka/akka-slf4j_2.11/jars/akka-slf4j_2.11-2.4.0.jar 

これについての洞察はありますか?それは有り難いです。これはまだちょうどフォローアップの場合にはこれに答える1.6.1

スパークするために適用されます。

log4j: Trying to find [log4j.xml] using context classloader [email protected] 
log4j: Trying to find [log4j.xml] using [email protected] class loader. 
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource(). 
log4j: Trying to find [log4j.properties] using context classloader [email protected] 
log4j: Using URL [file:/home/scarman/workspace-scala/Ingestions/ingestion/bin/log4j.properties] for automatic log4j configuration. 
log4j: Reading configuration from URL file:/home/scarman/workspace-scala/Ingestions/ingestion/bin/log4j.properties 
log4j: Parsing for [root] with value=[INFO, console]. 
log4j: Level token is [INFO]. 
log4j: Category root set to INFO 
log4j: Parsing appender named "console". 
log4j: Parsing layout options for "console". 
log4j: Setting property [conversionPattern] to [%d{yy/MM/dd HH:mm:ss} %p %c: %m%n]. 
log4j: End of parsing for "console". 
log4j: Setting property [target] to [System.err]. 
log4j: Parsed "console" options. 
log4j: Parsing for [org.spark-project.jetty] with value=[WARN]. 
log4j: Level token is [WARN]. 
log4j: Category org.spark-project.jetty set to WARN 
log4j: Handling log4j.additivity.org.spark-project.jetty=[null] 
log4j: Parsing for [org.spark-project.jetty.util.component.AbstractLifeCycle] with value=[ERROR]. 
log4j: Level token is [ERROR]. 
log4j: Category org.spark-project.jetty.util.component.AbstractLifeCycle set to ERROR 
log4j: Handling log4j.additivity.org.spark-project.jetty.util.component.AbstractLifeCycle=[null] 
log4j: Parsing for [org.apache.spark] with value=[WARN]. 
log4j: Level token is [WARN]. 
log4j: Category org.apache.spark set to WARN 
log4j: Handling log4j.additivity.org.apache.spark=[null] 
log4j: Parsing for [org.apache.hadoop.hive.metastore.RetryingHMSHandler] with value=[FATAL]. 
log4j: Level token is [FATAL]. 
log4j: Category org.apache.hadoop.hive.metastore.RetryingHMSHandler set to FATAL 
log4j: Handling log4j.additivity.org.apache.hadoop.hive.metastore.RetryingHMSHandler=[null] 
log4j: Parsing for [parquet] with value=[INFO]. 
log4j: Level token is [INFO]. 
log4j: Category parquet set to INFO 
log4j: Handling log4j.additivity.parquet=[null] 
log4j: Parsing for [org.apache.hadoop] with value=[WARN]. 
log4j: Level token is [WARN]. 
log4j: Category org.apache.hadoop set to WARN 
log4j: Handling log4j.additivity.org.apache.hadoop=[null] 
log4j: Parsing for [org.apache.spark.repl.SparkILoop$SparkILoopInterpreter] with value=[INFO]. 
log4j: Level token is [INFO]. 
log4j: Category org.apache.spark.repl.SparkILoop$SparkILoopInterpreter set to INFO 
log4j: Handling log4j.additivity.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=[null] 
log4j: Parsing for [org.apache.spark.repl.SparkIMain$exprTyper] with value=[INFO]. 
log4j: Level token is [INFO]. 
log4j: Category org.apache.spark.repl.SparkIMain$exprTyper set to INFO 
log4j: Handling log4j.additivity.org.apache.spark.repl.SparkIMain$exprTyper=[null] 
log4j: Parsing for [org.apache.parquet] with value=[ERROR]. 
log4j: Level token is [ERROR]. 
log4j: Category org.apache.parquet set to ERROR 
log4j: Handling log4j.additivity.org.apache.parquet=[null] 
log4j: Parsing for [org.apache.hadoop.hive.ql.exec.FunctionRegistry] with value=[ERROR]. 
log4j: Level token is [ERROR]. 
log4j: Category org.apache.hadoop.hive.ql.exec.FunctionRegistry set to ERROR 
log4j: Handling log4j.additivity.org.apache.hadoop.hive.ql.exec.FunctionRegistry=[null] 
log4j: Finished configuring 

ロードするときに見つけSLF4J私のクラスのバインディング...

jar:file:/home/scarman/.ivy2/cache/org.slf4j/slf4j-log4j12/jars/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/Log4jLoggerFactory.class 
[email protected] 
org.slf4j.impl.Log4jLoggerFactory 
+0

'src/main/resources'に' log4j.properties'ファイルがありますか? –

+0

@MariusSoutierはい、ありません。 –

+0

奇妙なことに、SparkからJARを除外することなく動作します。 Sparkのロギングも使用していますが、クラスパスにはlog4j 1.2.17しかありません。 –

答えて

6

更新

を追加します誰もが疑問に思っていた。だから、私はこの警告がSparkの寄木細工のインターフェースの使用中に起こっていることに気づいた。私はそれを確認するためにこれをテストし、誰かがすでにそれについて SPARK-10057に書いていたことを発見しました。この問題の問題は、他の開発者がそれを複製できないということでしたが、問題を説明するときに元のレポーターはむしろ曖昧でした。

どちらの方法でも、私はこれらの問題について私のOCD-nessを満たす以外の理由でそれを追跡することに決めました。

私はS3とローカルディスクの両方のファイルを使ってテストしました。テキストとJSONファイルはこの警告を発生させませんでしたが、ファイルがローカルであるかS3であるかに関わらず、この警告が寄木細工の使用によってトリガされました。これは、寄木張りのファイルを読み書きするためのものでした。 ParquetRelation.scalaを見ると、SLF4jへの唯一の参照があります。

// Parquet initializes its own JUL logger in a static block which always prints to stdout. Here 
    // we redirect the JUL logger via SLF4J JUL bridge handler. 
    val redirectParquetLogsViaSLF4J: Unit = { 
    def redirect(logger: JLogger): Unit = { 
     logger.getHandlers.foreach(logger.removeHandler) 
     logger.setUseParentHandlers(false) 
     logger.addHandler(new SLF4JBridgeHandler) 
    } 

だから、寄木細工の7月のロギングとSLF4Jブリッジ間のブリッジは、この警告が表示されるように引き起こしていることを主張する私には合理的であると思われます。私はそれがブリッジを初期化し、適切なStatic Loggerバインダーをロードできない場所で何か起こると思います。 Sparkのコードにもう少し詳しく掘り下げて調べる必要がありますが、それは少なくとも原因となっています。時間が許せば、私は試してみるつもりです。

最後に、警告をローカルで再生するためのコードサンプルを示します。

scala> sc.setLogLevel("WARN") 

scala> val d = sc.parallelize(Array[Int](1,2,3,4,5)) 
d: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at parallelize at <console>:21 

scala> val ddf = d.toDF() 
ddf: org.apache.spark.sql.DataFrame = [_1: int] 

scala> ddf.write.parquet("/home/scarman/data/test.parquet") 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
0

はおそらく、あなたはあなたのプロジェクトの依存関係にorg.slf4j.slf4j-simpleが欠落しています。

+1

投稿を読む、私はそれを追加しました。 –