Spark에서 정보 로깅을 해제하는 방법은 무엇입니까?


144

AWS EC2 안내서를 사용하여 Spark를 설치했으며 bin/pyspark스크립트를 사용하여 프로그램을 시작 하여 Spark 프롬프트를 표시하고 Quick Start 종료를 성공적으로 수행 할 수 있습니다.

그러나 필자의 삶에서는 INFO각 명령 후에 모든 자세한 로깅 을 중지하는 방법을 알 수 없습니다 .

응용 프로그램을 시작하는 폴더와 각 노드 에서 내 log4j.properties파일 의 아래 코드 (댓글 작성, OFF로 설정)에서 거의 모든 가능한 시나리오를 시도했지만 conf아무것도 수행하지 않습니다. INFO각 문을 실행 한 후에도 여전히 로깅 문이 인쇄됩니다.

이것이 어떻게 작동해야하는지 매우 혼란스러워합니다.

#Set everything to be logged to the console log4j.rootCategory=INFO, 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.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO

내가 사용할 때 내 전체 클래스 경로는 다음과 같습니다 SPARK_PRINT_LAUNCH_COMMAND.

Spark 명령 : /Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home/bin/java -cp : /root/spark-1.0.1-bin-hadoop2/conf : /root/spark-1.0.1 -bin-hadoop2 / conf : /root/spark-1.0.1-bin-hadoop2/lib/spark-assembly-1.0.1-hadoop2.2.0.jar : /root/spark-1.0.1-bin-hadoop2/lib /datanucleus-api-jdo-3.2.1.jar:/root/spark-1.0.1-bin-hadoop2/lib/datanucleus-core-3.2.2.jar:/root/spark-1.0.1-bin-hadoop2 /lib/datanucleus-rdbms-3.2.1.jar -XX : MaxPermSize = 128m -Djava.library.path = -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark. 메인

내용 spark-env.sh:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
# Copy it as spark-env.sh and edit that to configure Spark for your site.

# Options read when launching programs locally with 
# ./bin/run-example or ./bin/spark-submit
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public dns name of the driver program
# - SPARK_CLASSPATH=/root/spark-1.0.1-bin-hadoop2/conf/

# Options read by executors and drivers running inside the cluster
# - SPARK_LOCAL_IP, to set the IP address Spark binds to on this node
# - SPARK_PUBLIC_DNS, to set the public DNS name of the driver program
# - SPARK_CLASSPATH, default classpath entries to append
# - SPARK_LOCAL_DIRS, storage directories to use on this node for shuffle and RDD data
# - MESOS_NATIVE_LIBRARY, to point to your libmesos.so if you use Mesos

# Options read in YARN client mode
# - HADOOP_CONF_DIR, to point Spark towards Hadoop configuration files
# - SPARK_EXECUTOR_INSTANCES, Number of workers to start (Default: 2)
# - SPARK_EXECUTOR_CORES, Number of cores for the workers (Default: 1).
# - SPARK_EXECUTOR_MEMORY, Memory per Worker (e.g. 1000M, 2G) (Default: 1G)
# - SPARK_DRIVER_MEMORY, Memory for Master (e.g. 1000M, 2G) (Default: 512 Mb)
# - SPARK_YARN_APP_NAME, The name of your application (Default: Spark)
# - SPARK_YARN_QUEUE, The hadoop queue to use for allocation requests (Default: ‘default’)
# - SPARK_YARN_DIST_FILES, Comma separated list of files to be distributed with the job.
# - SPARK_YARN_DIST_ARCHIVES, Comma separated list of archives to be distributed with the job.

# Options for the daemons used in the standalone deploy mode:
# - SPARK_MASTER_IP, to bind the master to a different IP address or hostname
# - SPARK_MASTER_PORT / SPARK_MASTER_WEBUI_PORT, to use non-default ports for the master
# - SPARK_MASTER_OPTS, to set config properties only for the master (e.g. "-Dx=y")
# - SPARK_WORKER_CORES, to set the number of cores to use on this machine
# - SPARK_WORKER_MEMORY, to set how much total memory workers have to give executors (e.g. 1000m, 2g)
# - SPARK_WORKER_PORT / SPARK_WORKER_WEBUI_PORT, to use non-default ports for the worker
# - SPARK_WORKER_INSTANCES, to set the number of worker processes per node
# - SPARK_WORKER_DIR, to set the working directory of worker processes
# - SPARK_WORKER_OPTS, to set config properties only for the worker (e.g. "-Dx=y")
# - SPARK_HISTORY_OPTS, to set config properties only for the history server (e.g. "-Dx=y")
# - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (e.g. "-Dx=y")
# - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers

export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"

세션을 작성한 후 Spark 프로그램에서 Java SparkSession에 대해 아래와 같이 로그 레벨을 설정할 수 있습니다. Spark = SparkSession.builder (). master ( "local"). getOrCreate (); spark.sparkContext (). setLogLevel ( "INFO");
iKing

답변:


158

spark 디렉토리에서이 명령을 실행하십시오.

cp conf/log4j.properties.template conf/log4j.properties

log4j.properties를 편집하십시오.

# Set everything to be logged to the console
log4j.rootCategory=INFO, 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

첫 번째 줄에서 교체하십시오.

log4j.rootCategory=INFO, console

으로:

log4j.rootCategory=WARN, console

쉘을 저장하고 다시 시작하십시오. OS X의 Spark 1.1.0 및 Spark 1.5.1에서 작동합니다.


1
이것은 log4j.properties를 작성하지 않으면 존재하지 않는다는 것을 인식하는 데 도움이되었습니다. 우분투에서는 이러한 변경 사항을 적용하기 위해 다시 시작할 필요가 없었습니다.
파괴적인

나를 위해 일하지 않았다. 스파크 1.5. RHEL 6. CDH 5.5. 새 파일 /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties를 작성하고 위에서 설명한대로 변경을 시도했습니다. 또한 기존 파일 /etc/spark/conf/log4j.properties를 편집 해 보았습니다. pyspark shell이나 pyspark-shell에는 영향을 미치지 않습니다.
Tagar

Spark 클러스터의 모든 노드에 대해이 작업을 수행해야합니까?
클라우드

54

내가 한 pyspark / tests.py에서 영감을 얻었습니다.

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 )

SparkContext를 만든 직후 이것을 호출하면 테스트에 기록 된 stderr 줄이 2647에서 163으로 줄어 들었습니다. 그러나 SparkContext 자체를 만들면 163까지 기록됩니다.

15/08/25 10:14:16 INFO SparkDeploySchedulerBackend: SchedulerBackend is ready for scheduling beginning after reached minRegisteredResourcesRatio: 0.0

프로그래밍 방식으로 조정하는 방법이 명확하지 않습니다.


2
이러한 라인을 조정하는 방법에 대한 아이디어가 있으면 공유하십시오
Irene

SparkContext가 시작될 때까지 PySpark에서 기본 디버깅 수준을 변경하는 직접적인 해결책은 없다고 생각합니다. sc._jvm은 SC가 생성 된 후에 만 ​​생성되므로 다른 답변에서 논의 된 것처럼 여전히 log4j.properies 파일을 통해 파일을 변경할 수 있습니다. Spark는 기본 Root Logger 수준을 재정의하는 옵션으로 SparkConf에 전달할 수있는 spark.default.logging 변수를 만들어야합니다.
Tagar

37

Spark 2.0에서는 setLogLevel을 사용하여 애플리케이션에 맞게 동적으로 구성 할 수도 있습니다 .

    from pyspark.sql import SparkSession
    spark = SparkSession.builder.\
        master('local').\
        appName('foo').\
        getOrCreate()
    spark.sparkContext.setLogLevel('WARN')

에서 pyspark의 콘솔, 기본 spark세션은 이미 사용할 수 있습니다.


방금 로그 메시지를 표시하지 않았습니다. 그러나 실제 코드는 백그라운드에서 실행 중입니다. CPU 사용량이 표시되는 경우 유휴 상태 일 때에도 많은 CPU를 사용하여 불꽃을 일으 킵니다.
hurelhuyag '11

이것은 log4j액세스 할 수없는 PySpark 작업을위한 솔루션이었습니다 .
yeliabsalohcin

35

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

   log4j.rootCategory=INFO, console

    log4j.rootCategory=ERROR, console

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

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

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

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

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


3
나중 옵션은 spark-shell (scala)에서 작동하지만 pyspark의 경우 log4j 파일을 변경하지 않고 어떻게해야합니까?
hmi2015

"경고"에의 log4j 프로퍼티 파일을 변경하는 것은 바람직하지만, 그 wannik하여이 대답은 pyspark에 대한 콘솔에 로그 레벨을 변경하기위한 작업을 수행 할 stackoverflow.com/a/34487962/127971
마이클

32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

나는 이것을 pyspark에 사용했습니다. 한 줄짜리 핵으로 잘 작동합니다. 나는 여전히 바보 같은 YarnExecutor가 죽었다는 메시지를 받는다. 그리고 그렇게 간다 ...
jatal

2
이렇게하면 실행 후 로깅이 억제되지만 그 시점 이전에는 불행히도 많은 INFO 로그가 있습니다.
DavidJ

28

PySpark의 경우을 사용하여 스크립트에서 로그 수준을 설정할 수도 있습니다 sc.setLogLevel("FATAL"). 로부터 문서 :

logLevel을 제어하십시오. 이는 사용자 정의 로그 설정보다 우선합니다. 유효한 로그 수준에는 ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN이 포함됩니다.


1.4 버전 이후의 Spark 버전에서 작동하는 훌륭한 솔루션입니다 (2015 년 중반 이후).
Jealie

나는 스파크 1.6.2와 스칼라와 함께이 시도하고 그것은 작동하지 않는 것
Yeikel

@Yeikel이 솔루션은 PySpark를위한 것입니다. 명확하지 않아 죄송합니다. 지금 답변을 수정하겠습니다.
Galen Long

15

setLogLevel을 사용할 수 있습니다

val spark = SparkSession
      .builder()
      .config("spark.master", "local[1]")
      .appName("TestLog")
      .getOrCreate()

spark.sparkContext.setLogLevel("WARN")

14

Spark가 클래스 경로를 계산하는 방법 때문일 수 있습니다. 필자의 직감은 Hadoop의 log4j.properties파일이 클래스 경로에서 Spark 파일보다 먼저 나타나 변경 사항이 적용되지 않는 것입니다.

당신이 실행하는 경우

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

그러면 Spark는 셸을 시작하는 데 사용 된 전체 클래스 경로를 인쇄합니다. 내 경우에는

Spark Command: /usr/lib/jvm/java/bin/java -cp :::/root/ephemeral-hdfs/conf:/root/spark/conf:/root/spark/lib/spark-assembly-1.0.0-hadoop1.0.4.jar:/root/spark/lib/datanucleus-api-jdo-3.2.1.jar:/root/spark/lib/datanucleus-core-3.2.2.jar:/root/spark/lib/datanucleus-rdbms-3.2.1.jar -XX:MaxPermSize=128m -Djava.library.path=:/root/ephemeral-hdfs/lib/native/ -Xms512m -Xmx512m org.apache.spark.deploy.SparkSubmit spark-shell --class org.apache.spark.repl.Main

어디는 /root/ephemeral-hdfs/conf클래스 패스의 머리에있다.

다음 릴리스에서이 문제를 해결하기 위해 [SPARK-2913] 문제를 열었습니다 (곧 패치가 필요합니다).

그 동안 몇 가지 해결 방법이 있습니다.

  • 추가 export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"spark-env.sh.
  • 삭제 (또는 이름 바꾸기) /root/ephemeral-hdfs/conf/log4j.properties.

감사합니다. 나는 그것을 spark-env.sh 파일에 추가하려고 시도하고 log4j.properties 파일을 삭제하려고 시도했지만 여전히 INFO 출력을 얻었습니다. 질문에 전체 클래스 경로를 추가했습니다.
horatio1701d

추가 정보 감사합니다. spark-env.sh의 내용도 게시 할 수 있습니까 (호스트 이름과 같은 개인 정보를 수정할 수 있음)?
Josh Rosen

감사합니다. spark-env.sh를 게시했습니다. 기본 설정을 얻는 방법을 잘못 이해하면 죄송합니다. 나는 단지 테스트를 시도하기 위해 모든 것을 가능한 한 기본값으로 두었습니다.
horatio1701d

9

스파크 1.6.2 :

log4j = sc._jvm.org.apache.log4j
log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)

스파크 2.x :

spark.sparkContext.setLogLevel('WARN')

(스파크 세션 인 스파크)

다른 방법으로는

Spark Dir로 이름 conf/log4j.properties.template을 바꿉니다 conf/log4j.properties.

에서 log4j.properties, 변경 log4j.rootCategory=INFO, consolelog4j.rootCategory=WARN, console

사용 가능한 다른 로그 레벨 :

  • OFF (가장 구체적이며 로깅 없음)
  • 치명적 (가장 구체적이고 적은 데이터)
  • ERROR-오류가 발생한 경우에만 기록
  • 경고-경고 또는 오류가 발생한 경우에만 기록
  • 정보 (기본값)
  • 디버그-로그 세부 사항 단계 (및 위에서 언급 한 모든 로그)
  • TRACE (최소, 특정 데이터)
  • ALL (최소, 모든 데이터)

8

프로그래밍 방식

spark.sparkContext.setLogLevel("WARN")

사용 가능한 옵션

ERROR
WARN 
INFO 

5

마스터 1 개와 슬레이브 2 개, Spark 1.2.1이 포함 된 Amazon EC2에서이를 사용했습니다.

# Step 1. Change config file on the master node
nano /root/ephemeral-hdfs/conf/log4j.properties

# Before
hadoop.root.logger=INFO,console
# After
hadoop.root.logger=WARN,console

# Step 2. Replicate this change to slaves
~/spark-ec2/copy-dir /root/ephemeral-hdfs/conf/

4

spark-submit 명령에 param 아래를 추가하기 만하면됩니다.

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

이는 해당 작업에 대해서만 시스템 값을 일시적으로 대체합니다. log4j.properties 파일에서 정확한 특성 이름 (여기서는 log4jspark.root.logger)을 확인하십시오.

이것이 도움이 되길 바랍니다.


내가 찾은 또 다른 하나는 log4j.properties 파일을 지정할 수 있다는 것입니다.--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

아래는 스칼라 사용자를위한 코드 스 니펫입니다.

옵션 1 :

스 니펫 아래에서 파일 수준에서 추가 할 수 있습니다

import org.apache.log4j.{Level, Logger}
Logger.getLogger("org").setLevel(Level.WARN)

옵션 2 :

참고 : Spark 세션을 사용하는 모든 응용 프로그램에 적용됩니다.

import org.apache.spark.sql.SparkSession

  private[this] implicit val spark = SparkSession.builder().master("local[*]").getOrCreate()

spark.sparkContext.setLogLevel("WARN")

옵션 3 :

참고 :이 구성은 다음을 변경할 때 log4j.properties. (스파크 설치가있는 /etc/spark/conf/log4j.properties 또는 프로젝트 폴더 레벨 log4j.properties와 유사)에 추가해야합니다. 모듈 수준. 이것은 모든 응용 프로그램에 적용됩니다.

log4j.rootCategory=ERROR, console

IMHO, 옵션 1은 파일 수준에서 끌 수 있으므로 현명한 방법입니다.


1

내가하는 방법은 다음과 같습니다.

내가 spark-submit스크립트를 실행하는 위치에서

$ cp /etc/spark/conf/log4j.properties .
$ nano log4j.properties

INFO원하는 로깅 수준으로 변경 한 다음spark-submit


cp /etc/spark/conf/log4j.properties.template .
deepelement

0

로깅 (Python의 로깅 기능)을 계속 사용하고 싶습니다. 응용 프로그램 및 Spark의 구성을 분할 할 수 있습니다.

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.