스파크 콘솔에서 정보 메시지 표시를 중지하는 방법은 무엇입니까?


181

스파크 셸에서 오는 다양한 메시지를 중지하고 싶습니다.

log4j.properties이 메시지를 멈추기 위해 파일 을 편집하려고했습니다 .

내용은 다음과 같습니다 log4j.properties

# Define the root logger with appender file
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Settings to quiet third party logs that are too verbose
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

그러나 메시지는 여전히 콘솔에 표시됩니다.

다음은 예시 메시지입니다.

15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star

이것들을 어떻게 막을 수 있습니까?

답변:


168

conf/log4j.properties파일을 편집 하고 다음 줄을 변경하십시오.

log4j.rootCategory=INFO, console

log4j.rootCategory=ERROR, console

또 다른 방법은 다음과 같습니다.

spark-shell을 시작하고 다음을 입력하십시오.

import org.apache.log4j.Logger
import org.apache.log4j.Level

Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

그 후에는 로그가 표시되지 않습니다.

레벨에 대한 다른 옵션은 다음과 같습니다 : all, debug, error, fatal, info, off, trace, trace_int,warn

각각에 대한 자세한 내용은 설명서를 참조하십시오.


15
나는 OFF가 너무 제한적이라고 생각합니다. 여기에 경고 또는 오류가 더 적합 할 수 있습니다.
snowindy

2
프로젝트 메인 클래스에 추가하십시오.
AkhlD

2
좋은 대답입니다. 프로그래밍 방식으로 PySpark에서 동일한 작업을 수행하는 방법이 있습니까?
Tagar

2
이것의 프로그래밍 부분이 작동하지 않습니다. 대신 @cantdutchthis의 답을보십시오 stackoverflow.com/a/37836847/1056563
javadba

1
이 @AkhlD는 누구입니까?
Aviad Klein

151

spark-shell타입 을 시작한 직후 ;

sc.setLogLevel("ERROR")

Spark 2.0 (Scala)에서 :

spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")

API 문서 : https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession

Java의 경우 :

spark = SparkSession.builder.getOrCreate();
spark.sparkContext().setLogLevel("ERROR");

프로그램에서이 속성을 어떻게 설정 하시겠습니까?
Alex Raj Kaliamoorthy

이것은 spark.sql.SparkSession에 대한 avaibale이거나 JavaSparkContext에 대한 avaibale입니까?
SharpLu

예, JavaSparkContext에 사용할 수 있습니다 . 감사합니다, @cantdutchthis. 이것은 잠시 동안 귀찮게했습니다.
alan

1
이것은 별도의 log4j를 만들지 않고 나를 위해 일한 유일한 대답입니다. 감사!
abhihello123

2
그것은 나를 위해 작동하지만 테스트를 시작할 때 여전히 몇 가지 메시지가 나타납니다. 어떤 생각?

46

.conf파일 변경을 제안한 @AkhlD 및 @Sachin Janani에게 감사 합니다.

다음 코드는 내 문제를 해결했습니다.

1) import org.apache.log4j.{Level, Logger}가져 오기 섹션에 추가

2) 스파크 컨텍스트 객체 생성 후 다음 라인을 추가했습니다 val sc = new SparkContext(conf).

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

12
이것을 시도했지만 여전히 로깅 출력을 얻습니다.
horatio1701d 2016 년

1
이 솔루션이 conf /에 액세스 할 수있는 권한이 없음을 좋아합니다
Jim Ho

31

spark-submit 또는 spark-sql을 사용하여 응용 프로그램을 제출하는 동안 아래 명령을 사용하여 로그 수준을 변경하십시오.

spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"

참고 : 구성 파일이 저장된 <file path>위치를 바꾸십시오 log4j.

Log4j.properties :

log4j.rootLogger=ERROR, console

# set the log level for these components
log4j.logger.com.test=DEBUG
log4j.logger.org=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.org.spark-project=ERROR
log4j.logger.org.apache.hadoop=ERROR
log4j.logger.io.netty=ERROR
log4j.logger.org.apache.zookeeper=ERROR

# add a ConsoleAppender to the logger stdout to write to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
# use a simple message format
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
   <appender name="console" class="org.apache.log4j.ConsoleAppender">
    <param name="Target" value="System.out"/>
    <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" />
    </layout>
  </appender>
    <logger name="org.apache.spark">
        <level value="error" />
    </logger>
    <logger name="org.spark-project">
        <level value="error" />
    </logger>
    <logger name="org.apache.hadoop">
        <level value="error" />
    </logger>
    <logger name="io.netty">
        <level value="error" />
    </logger>
    <logger name="org.apache.zookeeper">
        <level value="error" />
    </logger>
   <logger name="org">
        <level value="error" />
    </logger>
    <root>
        <priority value ="ERROR" />
        <appender-ref ref="console" />
    </root>
</log4j:configuration>

콘솔 대신 파일에 로그를 쓰려면 log4j.xml에서 FileAppender로 전환하십시오. LOG_DIR를 사용하여 제공 할 수있는 logs 디렉토리의 변수입니다 spark-submit --conf "spark.driver.extraJavaOptions=-D.

<appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="${LOG_DIR}"/>
        <param name="datePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>

여기서 이해해야 할 또 다른 중요한 점은 작업이 분산 모드 (배치 모드 클러스터 및 마스터 또는 얀 또는 메소)에서 시작될 때 log4j 구성 파일이 드라이버 및 작업자 노드 ( log4j.configuration=file:<file path>/log4j.xml) 에 존재해야합니다.

log4j : ERROR 구성 파일 [log4j.properties]를 읽을 수 없습니다. java.io.FileNotFoundException : log4j.properties (파일 또는 디렉토리가 없음)

이 문제를 해결하기위한 힌트

분산 파일 시스템 (HDFS 또는 mesos)에 log4j 구성 파일을 유지하고 log4j PropertyConfigurator를 사용하여 외부 구성을 추가하십시오 . 또는 sparkContext addFile 을 사용하여 각 노드에서 사용할 수있게 한 다음 log4j PropertyConfigurator를 사용하여 구성을 다시로드하십시오.


2
이것은 org기본적으로 기본 로거의 모든 로그를 지우지 않는 몇 가지 예 중 하나입니다 .
deepelement

1
이것은 잘 작동하지만 Log4j.properties파일은 무엇입니까? 사용되지 않는 것 같습니다. XML 파일에 설정된 속성을 문서화하고 있습니까?
vy32

1
둘 중 하나를 사용할 수 있습니다.
Rahul Sharma

3
위와 같은 성공을 거두었습니다 --files. 모든 노드에서 log4j.properties를 사용할 수 있도록 spark-submit 명령을 사용합니다.
벤 왓슨

1
이것은 나를 위해 일한 유일한 솔루션이며 코드 변경과 관련이 없습니다. 파일을 만들고 Log4.properties아래에 main/resources존재하지 않는 경우
Yeikel

30

예제로 수집 된 모든 방법

소개

실제로 는 여러 가지 방법이 있습니다 . 어떤 사람들은 다른 사람들로부터 더 힘들지만, 당신에게 가장 적합한 것은 당신에게 달려 있습니다. 나는 그들 모두를 보여 주려고 노력할 것이다.


앱에서 프로그래밍 방식으로 # 1

가장 쉬운 것처럼 보이지만 해당 설정을 변경하려면 앱을 다시 컴파일해야합니다. 개인적으로, 나는 그것을 좋아하지 않지만 잘 작동합니다.

예:

import org.apache.log4j.{Level, Logger}

val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)

log4jAPI를 사용하여 훨씬 더 많은 것을 얻을 수 있습니다 .
출처 : [ Log4J 구성 문서 , 구성 섹션]


# 2 패스 log4j.propertiesspark-submit

이것은 매우 까다 롭지 만 불가능하지는 않습니다. 그리고 내가 가장 좋아하는 것.

앱 시작 중 Log4J는 항상 log4j.properties클래스 경로에서 파일을 찾고로드 합니다.

그러나 spark-submitSpark Cluster를 사용할 때 클래스 경로가 앱의 클래스 경로보다 우선합니다! 그렇기 때문에이 파일을 fat-jar에 넣으면 클러스터 설정이 무시되지 않습니다!

추가 -Dlog4j.configuration=<location of configuration file>spark.driver.extraJavaOptions (드라이버 용) 또는
spark.executor.extraJavaOptions (집행에 대한) .

파일을 사용하는 경우 file:프로토콜이 명시 적으로 제공되어야하며 파일은 모든 노드에 로컬로 존재해야합니다 .

마지막 조건을 만족 시키려면 파일을 노드에 사용 가능한 위치 (예 :)에 업로드하거나을 hdfs사용하는 경우 드라이버를 사용하여 로컬로 액세스 할 수 있습니다 deploy-mode client. 그렇지 않으면:

애플리케이션과 함께 업로드 할 파일 목록 log4j.properties에 추가하여 spark-submit을 사용하여 사용자 정의 를 --files업로드하십시오.

출처 : Spark 문서, 디버깅

단계 :

log4j.properties:

# Blacklist all to warn level
log4j.rootCategory=WARN, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO

spark-submit클러스터 모드에서 실행 중 :

spark-submit \
    --master yarn \
    --deploy-mode cluster \
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

모드를 사용하는 --driver-java-options경우 사용해야 client합니다. 스파크 문서, 런타임 환경

spark-submit클라이언트 모드에서 실행 중 :

spark-submit \
    --master yarn \
    --deploy-mode client \
    --driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties \
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" \
    --files "/absolute/path/to/your/log4j.properties" \
    --class com.github.atais.Main \
    "SparkApp.jar"

노트:

  1. 파일 업로드 spark-cluster--files정도면 어떤 경로를 추가 할 필요가 없습니다 루트 디렉토리에서 사용할 수 있습니다 file:log4j.properties.
  2. 에 나열된 파일 --files에는 절대 경로가 제공되어야합니다!
  3. file: 구성 URI의 접두사는 필수입니다.

# 3 클러스터 편집 conf/log4j.properties

이것은 전역 로깅 구성 파일을 변경 합니다 .

$SPARK_CONF_DIR/log4j.properties파일을 업데이트하면 다른 구성과 함께 자동으로 업로드됩니다.

출처 : Spark 문서, 디버깅

SPARK_CONF_DIR당신 을 찾을 수 있습니다 spark-shell:

atais@cluster:~$ spark-shell 
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.1.1
      /_/   

scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf

이제 /var/lib/spark/latest/conf/log4j.properties방법 # 2의 예제와 같이 편집 하면 모든 앱이이 구성을 공유합니다.


# 4 구성 디렉토리 무시

솔루션 # 3이 마음에 들지만 응용 프로그램별로 사용자 정의하려는 경우 실제로 conf폴더를 복사 하고 내용을 편집하고 루트 구성으로 지정할 수 있습니다 spark-submit.

기본값 이외의 다른 구성 디렉토리를 지정하려면 “SPARK_HOME/conf”설정할 수 있습니다 SPARK_CONF_DIR. 스파크는 구성 파일 (사용 spark-defaults.conf, spark-env.sh, log4j.properties, 이 디렉토리에서).

출처 : Spark 문서, 구성

단계 :

  1. 클러스터 conf폴더 복사 (자세한 정보, 방법 # 3)
  2. log4j.properties해당 폴더에서 편집 (방법 # 2의 예)
  3. 설정 SPARK_CONF_DIR실행하기 전에,이 폴더에 spark-submit,
    예를 들면 :

    export SPARK_CONF_DIR=/absolute/path/to/custom/conf
    
    spark-submit \
        --master yarn \
        --deploy-mode cluster \
        --class com.github.atais.Main \
        "SparkApp.jar"
    

결론

다른 방법이 있는지 확실하지 않지만 A에서 Z까지의 주제를 다루기를 바랍니다. 그렇지 않은 경우 의견에 저를 ping하십시오.

당신의 방법을 즐기십시오!


이것이 정답입니다. 그것은 많은 세부 사항을 제공하고 다른 것보다 훨씬 더 많은 사용 사례를 요약합니다. (로그 비활성화를 장려하지 않고.)
벨기에

@Atais-아래에 추가해야하므로 위와 같은 답변이 도움이되지 않는 경우 log4j conf 파일에서 '.template'접미사를 제거해야하며 위의 작업이 완벽하게 작동합니다!
일일

1
프로그래밍 방식에 대한 추가 참고 사항-SparkContext를 만들기 전에 수준을 설정해야합니다.
Arunraj Nair

로깅은 SparkContext에 연결되지 않은 별도의 기능이므로 @ArunrajNair는 그렇지 않습니다.
Atais

19

다음과 같이 로그 수준을 OFF로 설정하여 로그 비활성화를 설정합니다.

Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);

또는 다음 속성을 변경하여 로그 파일을 편집하고 로그 수준을 해제로 설정하십시오.

log4j.rootCategory=OFF, console

어떤 파일에서 위의 속성을 설정합니까 ??
Vishwas

드라이버 프로그램 @Vishwas
Sachin Janani에서

나는 동일하게 추가했지만 여전히 로그가 콘솔에 나타납니다
Vishwas

log4j.rootCategory = OFF 특성을 변경 했습니까? 나는 이것을 끝까지 테스트했고 잘 작동했다
Sachin Janani

3
이것은 Spark 2.3.1에서 나에게 전혀 차이가 없다
Toby Eggitt

15

수입 명세서 바로 아래에있는 모든 pyspark 스크립트 에이 줄을 추가하십시오.

SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

내 pyspark 스크립트의 예제 헤더

from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")

13
이것은 작동하지만 Spark 컨텍스트를 만드는 동안 나타나는 58 줄의 INFO 메시지를 멈추지 않습니다.
vy32

1
이것은 Spark 2.x
Yeikel

13

위의 답변은 정확하지만 필요한 추가 정보가 있으므로 정확하게 도움이되지 않았습니다.

방금 Spark를 설정하여 log4j 파일에 여전히 '.template'접미사가 있고 읽을 수 없었습니다. 로깅이 Spark 코어 로깅 conf로 기본 설정되어 있다고 생각합니다.

따라서 나와 같은데 위의 답변이 도움이되지 않으면 log4j conf 파일에서 '.template'접미사를 제거해야하며 위의 내용이 완벽하게 작동합니다!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html


이 답변을 확인하십시오. stackoverflow.com/a/51554118/2094086 동일한 결과를 얻으시기 바랍니다.
Gaurav Adurkar

5

Python / Spark에서는 다음을 수행 할 수 있습니다.

def quiet_logs( sc ):
  logger = sc._jvm.org.apache.log4j
  logger.LogManager.getLogger("org"). setLevel( logger.Level.ERROR )
  logger.LogManager.getLogger("akka").setLevel( logger.Level.ERROR )

Sparkcontaxt 'sc'를 정의한 후 다음과 같이이 함수를 호출하십시오. quiet_logs (sc)


log4j 파일을 망치지 않고 작동하는 프로그래밍 방식을 찾고 싶습니다.하지만 시도해도 WARN org.apache.spark.scheduler.TaskSetManager : Lost task 612.1 in stage 0.0 (TID 2570)과 같은 경고 메시지가 계속 나타납니다. ..., executor 15) : TaskKilled (또 다른
천체

5

tl; dr

Spark 컨텍스트의 경우 다음을 사용할 수 있습니다.

sc.setLogLevel(<logLevel>)

여기서 loglevelALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE 또는 WARN이 될 수 있습니다.


세부-

내부적으로, setLogLevel통화는 org.apache.log4j.Level.toLevel(logLevel)그 다음 사용하여 설정하는 데 사용 org.apache.log4j.LogManager.getRootLogger().setLevel(level).

다음을 OFF사용하여 로깅 레벨을 직접 설정할 수 있습니다 .

LogManager.getLogger("org").setLevel(Level.OFF)

에서 Spark 쉘의 기본 로깅을 설정할 수 있습니다 conf/log4j.properties. conf/log4j.properties.template출발점으로 사용하십시오 .

Spark 응용 프로그램에서 로그 수준 설정

독립형 Spark 애플리케이션 또는 Spark Shell 세션에서 다음을 사용하십시오.

import org.apache.log4j.{Level, Logger}

Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)

로깅 비활성화 (log4j) :

conf/log4j.properties로깅을 완전히 비활성화 하려면 다음 을 사용하십시오.

log4j.logger.org=OFF

참조 : Jacek Laskowski의 마스터 링 스파크.


3

명령 행에서 간단하게 ...

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..다른 옵션..


무엇 spark2-submit입니까?
vy32

spark2-submit은 Spark2에 사용됩니다.
Nephilim

3

spark-shell 또는 spark-submit 명령에 간단히 param을 추가하십시오.

--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"

log4j.properties 파일에서 정확한 특성 이름 (여기서는 log4jspark.root.logger)을 확인하십시오. 이것이 도움이 되길 바랍니다.


1
이것을 명령 줄에서 설정하는 것이 좋을 것입니다. 그러나 이것은 나를 위해 작동하지 않았습니다.
swdev

2

흥미로운 아이디어는 여기에 제안 된대로 RollingAppender를 사용하는 것입니다 : http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ 콘솔 공간을 "오염시키지"않지만 여전히 $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log에서 결과를 볼 수 있습니다.

    log4j.rootLogger=INFO, rolling

log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n
log4j.appender.rolling.maxFileSize=50MB
log4j.appender.rolling.maxBackupIndex=5
log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log
log4j.appender.rolling.encoding=UTF-8

원인을 해결하는 또 다른 방법은 일반적으로 어떤 종류의 로깅이 있는지 (다른 모듈 및 종속성에서 제공) 관찰하고 로깅에 대한 세분성을 설정하고 너무 자세한 제 3 자 로그를 "조용하게"설정하는 것입니다.

예를 들어

    # Silence akka remoting
log4j.logger.Remoting=ERROR
log4j.logger.akka.event.slf4j=ERROR
log4j.logger.org.spark-project.jetty.server=ERROR
log4j.logger.org.apache.spark=ERROR
log4j.logger.com.anjuke.dm=${dm.logging.level}
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

0
  1. 다른 log4j.rootCategory = ERROR, 콘솔에 설명 된대로 conf / log4j.properties를 조정하십시오.
  2. 스파크 작업을 실행하는 동안 log4j.properties 파일 경로와 함께 --file 플래그를 전달하십시오.
  3. 여전히 작동하지 않으면 새 log4j.properties 전에 호출되는 log4j.properties가있는 jar이있을 수 있습니다. jar에서 해당 log4j.properties를 제거하십시오 (적절한 경우).

0
sparkContext.setLogLevel("OFF")

1
log4j.properties에서 .template 접미사를 모두 제거하고 레벨을 ERROR로 설정 val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) 했으며 작동했습니다.
Sam-T

0

위의 모든 게시물 외에도 다음과 같은 문제가 해결되었습니다.

Spark는 slf4j를 사용하여 로거에 바인딩합니다. log4j가 첫 번째로 발견 된 바인딩이 아닌 경우, 원하는 모든 log4j.properties 파일을 편집 할 수 있으며 로거도 사용되지 않습니다. 예를 들어, 이것은 가능한 SLF4J 출력 일 수 있습니다.

SLF4J : 클래스 경로는 여러 SLF4J 바인딩을 포함합니다. SLF4J : [jar : file : / C : /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar! / org / slf4j /에서 바인딩이 발견되었습니다. impl / StaticLoggerBinder.class] SLF4J : [jar : file : / C : /Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar에서 바인딩 발견 ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J : 설명 은 http://www.slf4j.org/codes.html#multiple_bindings 를 참조 하십시오 . SLF4J : 실제 바인딩의 유형은 [org.slf4j.impl.SimpleLoggerFactory]입니다.

여기에서 log4j 설정에 신경 쓰지 않는 SimpleLoggerFactory가 사용되었습니다.

내 프로젝트에서 slf4j-simple 패키지 제외

<dependency>
        ...
        <exclusions>
            ...
            <exclusion>
                <artifactId>slf4j-simple</artifactId>
                <groupId>org.slf4j</groupId>
            </exclusion>
        </exclusions>
    </dependency>

이제 log4j 로거 바인딩이 사용되고 log4j.properties의 모든 설정이 준수되어 문제가 해결되었습니다. 참고로 log4j 속성 파일에 일반 구성 외에

log4j.rootLogger=WARN, stdout
...
log4j.category.org.apache.spark = WARN
log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL
log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false
log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF

도움이 되었기를 바랍니다!


0

이것은 나를 위해 일했습니다. ERROR 메시지 만로 표시되는 stdout경우 log4j.properties파일은 다음과 같습니다.

# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

참고 : log4j.properties파일을 src/main/resources폴더에 넣으면 효과적입니다. 그리고 log4j.properties존재하지 않는 경우 (즉, 파일을 spark사용 log4j-defaults.properties하고 있음) 이동하여 SPARK_HOME/conf다음 mv log4j.properties.template log4j.properties위의 변경 사항으로 진행 하여 파일을 만들 수 있습니다 .


0

.setLogLevel()명령문 을 삽입하기 위해 Java 코드를 편집 할 수없고 아직 더 많은 외부 파일을 배치하지 않으려는 경우 무차별 강제 방법을 사용하여이를 해결할 수 있습니다. grep을 사용하여 INFO 라인을 필터링하면됩니다.

spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"

0

다른 사람이 이것에 붙어 있다면

위의 어느 것도 나를 위해 일하지 않았습니다. 나는 제거했다

implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'

내 build.gradle에서 로그가 사라집니다. TLDR : 다른 로깅 프레임 워크를 가져 오지 마십시오.org.apache.log4j.Logger


0

로그를 완전히 중지하는 다른 방법은 다음과 같습니다.

    import org.apache.log4j.Appender;
    import org.apache.log4j.BasicConfigurator;
    import org.apache.log4j.varia.NullAppender;

    public class SomeClass {

        public static void main(String[] args) {
            Appender nullAppender = new NullAppender();
            BasicConfigurator.configure(nullAppender);

            {...more code here...}

        }
    }

이것은 나를 위해 일했습니다. NullAppender는

로그 이벤트를 무시하는 Appender ( https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/NullAppender.html )

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.