2017-12-18 5 views
0

스파크 스트리밍에서 logger에 logback을 사용하려고합니다. spark-submit을 통해 작업을 제출하려고 시도하는 동안 나는 예외가 발생합니다. 스레드에서Spark 2.1.1 Log4jLoggerFactory를 LoggerContext에 캐스팅 할 수 없습니다.

예외 "주요"java.lang.ClassCastException가 :. org.slf4j.impl.Log4jLoggerFactory가 consumer.spark.LogBackConfigLoader에서 ch.qos.logback.classic.LoggerContext 캐스트 할 수없는 (LogBackConfigLoader 된 .java : 18) consumer.spark.Sample.main (Sample.java:18) sun.reflect.NativeMethodAccessorImpl.invoke에서 sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법)에서 에서 (NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke (M org.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ SparkSubmit $$ runMain (SparkSubmit.scala : 743) 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.security.auth.Subject.doAs (Subject.java:422)에서 org.apache.hadoop.security.UserGroupInformation.doAs (UserGroupInformation.java:1656) 에서 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 : 126) org.apache.spark.deploy.SparkSubmit.main에서 (SparkSubmit.scala)

내 pom.xml 파일이 :

<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 - 마스터 사 - 배포 모드 클라이언트 - 드라이버 메모리 4g --executor-memory 2g --executor-core 4 --class consumer.spark.Sample ~/SparkStreamingJob/log_testing.jar ~/SparkStreamingJob/스파크 작업/설정/conf의 그것은이다

+0

로깅 코드의 가져온 패키지는 무엇입니까? 정확히 어떤 구현을 사용하는지 확인하기가 어렵습니다.구체적으로 어떤 패키지가'LoggerFactory'를 가져 왔습니까? –

답변

0

여기에 두 가지 문제가 나타납니다/logback.xml :

SLF4J는 기본적으로 코드 변경없이 로깅 프레임 워크간에 변경할 수 있음을 의미하는 구현 로깅을위한 외관입니다. 이것은 또한 각각의 로깅 구현 핵심 클래스를 사용해서는 안된다는 것을 의미합니다. SLF4J는 자체적으로 로깅 구현을 해결하고 SLF4j에서 제공하는 "로거"또는 "팩토리"객체는 해당 구현에 바인딩됩니다 (사용자의 경우 logback). 즉, SLF4j에서 제공하는 "logger"객체 또는 "factory"를 logback API 유형에 명시 적으로 캐스트 할 수 없습니다.

Log4LoggerFactory 대신 Log4JLoggerFactory를 해석하는 SLF4J가 나타납니다. 나는 SLF4J와 Logback의 연결이 성공적이지 못하다고 믿는다.

관련 문제