2017-12-18 19 views
0

私はsparkストリーミングでloggerにlogbackを使用しようとしています。私がspark-submitを使って仕事を提出しようとしている間、私は以下のように例外を受け取ります。 org.slf4j.impl.Log4jLoggerFactoryが consumer.spark.LogBackConfigLoaderで ch.qos.logback.classic.LoggerContextにキャストすることはできません(LogBackConfigLoader:スレッド "メイン" とjava.lang.ClassCastExceptionでSpark 2.1.1 Log4jLoggerFactoryをLoggerContextにキャストすることはできません

例外(NativeMethodAccessorImpl.java:62) のの場合、 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(M (sparkSubmit.scala:743) org.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ SparkSubmit $$ runMain(SparkSubmit.scala:743) at org.apache.spark.deploy.SparkSubmit $$ anon $ 1.run(SparkSubmit.scala:169) org.apache.spark.deploy.SparkSubmit $$ anon $ 1.run(SparkSubmit.scala:167) at java.security.AccessController.doPrivileged(ネイティブメソッド) でのorg.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1656)ののjavax.security.auth.Subject.doAs(Subject.java:422) org.apache.spark.deploy。 SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:167) at org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:212)org.apache.spark.deploy.SparkSubmit.mainで (SparkSubmit.scala)

私のpom.xmlがある:org.apache.spark.deploy.SparkSubmit $ .main(126 SparkSubmit.scala)で:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <slf4j.version>1.6.1</slf4j.version> 
    <logback.version>1.2.3</logback.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

私のlogbackのコードは次のとおりです。

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
JoranConfigurator configurator = new JoranConfigurator(); 
configurator.setContext(lc); 
configurator.doConfigure(externalConfigFileLocation); 

私の火花提出するコマンドは次のとおりです。

〜/ spark-2.1.1-bin-hadoop2.6/bin/spark-submit - マスター糸 --deploy-mode client --driver-memory 4g --executor-memory 2g --executor-core 4 --class consumer.spark.Sample〜/ SparkStreamingJob/log_testing.jar 〜/ SparkStreamingJob /火花ジョブ/ configに/ confに/ logback.xml

+0

ログバックコードのインポートパッケージは何ですか?どの実装が正確に使用されているかを確認するのが難しくなります。具体的には、 'LoggerFactory'はどのパッケージから来ますか? –

答えて

0

それはだ、ここで二つの問題があります表示されます。

SLF4Jは、基本的にコード変更なしでロギングフレームワークの間で変更できることを意味する実装のロギングのファサードです。それぞれのロギング実装のコアクラスを使用しないでください。 SLF4J自体がロギング実装を解決し、SLF4jによって提供される「ロガー」または「ファクトリ」オブジェクトがその実装にバインドされます(あなたの場合はログバック)。これは、SLF4jによって提供される「ロガー」オブジェクトまたは「ファクトリ」をログバックAPIタイプに明示的にキャストできないことを意味します。

また、LogbackLoggerFactoryの代わりにlog4jLoggerFactoryを解決するSLF4Jが表示されます。私は、SLF4JとLogbackのブリッジングはうまくいかないと信じています。

関連する問題