Como desativar o registro INFO no Spark?

144

Instalei o Spark usando o guia da AWS EC2 e posso iniciar o programa com bin/pysparkprecisão usando o script para acessar o prompt do spark e também posso executar o Quick Start com êxito.

No entanto, durante toda a minha vida, não consigo descobrir como interromper todo o INFOlog detalhado após cada comando.

Eu tentei quase todos os cenários possíveis no código abaixo (comentando, configurando como OFF) dentro do meu log4j.propertiesarquivo na confpasta em que inicio o aplicativo e em cada nó e nada está fazendo nada. Ainda recebo as INFOinstruções de log impressas após a execução de cada instrução.

Estou muito confuso com a forma como isso deve funcionar.

#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

Aqui está o meu caminho de classe completo quando eu uso SPARK_PRINT_LAUNCH_COMMAND:

Comando 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. repl.Main

conteúdo de 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"
horatio1701d
fonte
No programa Spark, após a criação da sessão, é possível definir o nível de Log, conforme indicado abaixo, para Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing 28/01

Respostas:

158

Basta executar este comando no diretório spark:

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

Edite 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

Substitua na primeira linha:

log4j.rootCategory=INFO, console

de:

log4j.rootCategory=WARN, console

Salve e reinicie seu shell. Funciona para mim no Spark 1.1.0 e no 1.5.1 no OS X.

poiuytrez
fonte
1
Isso ajudou, é importante perceber que o log4j.properties não existe, a menos que você o crie. No ubuntu, não precisei reiniciar para que essas alterações entrassem em vigor.
disruptive
não funcionou para mim. Spark 1.5. RHEL 6. CDH 5.5. Tentei criar o novo arquivo /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties e mudar como explicado acima. E também tentou editar o arquivo existente /etc/spark/conf/log4j.properties. Nenhum efeito para o shell pyspark nem para o shell pyspark.
Tagar
precisamos fazer isso para todos os nós no cluster spark?
cloud
54

Inspirado pelo pyspark / tests.py que fiz

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 )

Chamar isso logo após criar o SparkContext reduziu as linhas stderr registradas no meu teste de 2647 para 163. No entanto, a criação do próprio SparkContext registra 163, até

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

e não está claro para mim como ajustá-los programaticamente.

FDS
fonte
2
se você tem alguma idéia sobre como ajustar essas linhas, por favor partilhe
Irene
Eu acho que não há solução direta para alterar o nível de depuração padrão no PySpark ... até o SparkContext iniciar. Porque sc._jvm é criado somente após a criação do SC. Ainda é possível alterar isso através do arquivo log4j.properies, conforme discutido em outras respostas. O Spark deve criar, por exemplo, a variável spark.default.logging que pode ser transmitida ao SparkConf como uma opção para substituir o nível padrão do Registrador Raiz.
Tagar 13/09/16
37

No Spark 2.0, você também pode configurá-lo dinamicamente para seu aplicativo usando setLogLevel :

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

No console do pyspark , uma sparksessão padrão já estará disponível.

mdh
fonte
Você acabou de suprimir as mensagens de log. Mas o código real está sendo executado em segundo plano. Se você vir o uso da CPU. Faísca usando muita CPU, mesmo quando ocioso.
hurelhuyag
Essa era exatamente a solução para o trabalho do PySpark, onde log4jnão é acessível.
yeliabsalohcin 31/01
35

Edite seu arquivo conf / log4j.properties e altere a seguinte linha:

   log4j.rootCategory=INFO, console

para

    log4j.rootCategory=ERROR, console

Outra abordagem seria:

Sparkup de inicialização e digite o seguinte:

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

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

Você não verá nenhum registro depois disso.

AkhlD
fonte
3
a opção posterior funciona para o spark-shell (scala), mas o que você deve fazer no caso do pyspark sem alterar o arquivo log4j?
hmi2015
Alterar o arquivo de propriedades log4j para "avisar" seria preferível, mas caso contrário esta resposta por wannik funciona para alterar o nível de log para o console para pyspark stackoverflow.com/a/34487962/127971
michael
32
>>> log4j = sc._jvm.org.apache.log4j
>>> log4j.LogManager.getRootLogger().setLevel(log4j.Level.ERROR)
wannik
fonte
Eu usei isso para o pyspark. Funciona muito bem como um truque de uma linha. Ainda recebo as mensagens bobas do YarnExecutor que morreram, o que não deve ser um erro, imho. E assim vai ...
jatal 12/16/16
2
Isso suprime o log após a execução, mas há muitos logs INFO anteriores a esse ponto, infelizmente.
precisa saber é o seguinte
28

Para o PySpark, você também pode definir o nível de log em seus scripts com sc.setLogLevel("FATAL"). Dos documentos :

Controle nosso logLevel. Isso substitui todas as configurações de log definidas pelo usuário. Os níveis de log válidos incluem: ALL, DEBUG, ERRO, FATAL, INFO, OFF, TRACE, WARN

Galen Long
fonte
Ótima solução que funciona para versões do Spark mais recentes que 1,4 (desde meados de 2015).
Jealie
Eu tentei isso com faísca 1.6.2 e Scala e não parecem funcionar
Yeikel
@Yeikel Esta solução é para o PySpark. Desculpe, isso não foi esclarecido - editarei a resposta agora.
Galen Long
15

Você pode usar setLogLevel

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

spark.sparkContext.setLogLevel("WARN")
Unmesha SreeVeni
fonte
14

Isso pode ser devido à forma como o Spark calcula seu caminho de classe. Meu palpite é que o log4j.propertiesarquivo do Hadoop está aparecendo à frente do Spark no caminho de classe, impedindo que suas alterações entrem em vigor.

Se você correr

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

o Spark imprimirá o caminho de classe completo usado para iniciar o shell; no meu caso, eu vejo

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

onde /root/ephemeral-hdfs/confestá no início do caminho da classe.

Eu abri um problema [SPARK-2913] para corrigir isso no próximo lançamento (eu devo ter um patch em breve).

Enquanto isso, aqui estão algumas soluções alternativas:

  • Adicionar export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"a spark-env.sh.
  • Excluir (ou renomear) /root/ephemeral-hdfs/conf/log4j.properties.
Josh Rosen
fonte
Obrigado. Tentei adicionar isso ao meu arquivo spark-env.sh e também tentei excluir o arquivo log4j.properties, mas ainda obtendo a saída INFO. Eu adicionei meu caminho de classe completo à pergunta.
horatio1701d
Obrigado pela informação extra. Você também pode publicar o conteúdo do spark-env.sh (você pode redigir informações privadas, como nomes de host)?
Josh Rosen
obrigado. postou spark-env.sh. Desculpe se estou entendendo como obter uma configuração básica. Acabei de deixar tudo o mais padrão possível por enquanto, apenas para tentar alguns testes.
precisa saber é o seguinte
9

Spark 1.6.2:

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

Spark 2.x:

spark.sparkContext.setLogLevel('WARN')

(faísca sendo a SparkSession)

Alternativamente, os métodos antigos,

Renomeie conf/log4j.properties.templateparaconf/log4j.properties no Spark Dir.

No log4j.properties, mude log4j.rootCategory=INFO, consoleparalog4j.rootCategory=WARN, console

Diferentes níveis de log disponíveis:

  • DESLIGADO (mais específico, sem registro)
  • FATAL (mais específicos, poucos dados)
  • ERRO - Registrar apenas em caso de erros
  • AVISO - Registrar apenas em caso de avisos ou erros
  • INFO (padrão)
  • DEBUG - Etapas dos detalhes do log (e todos os logs mencionados acima)
  • TRACE (menos específico, muitos dados)
  • TUDO (menos específico, todos os dados)
Ani Menon
fonte
8

Maneira programática

spark.sparkContext.setLogLevel("WARN")

Opções disponíveis

ERROR
WARN 
INFO 
estrela Solitária
fonte
5

Eu usei isso com o Amazon EC2 com 1 mestre e 2 escravos e Spark 1.2.1.

# 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/
oleksii
fonte
4

Basta adicionar abaixo do parâmetro ao seu comando de envio de spark

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

Isso substitui o valor do sistema temporariamente apenas para esse trabalho. Verifique o nome exato da propriedade (log4jspark.root.logger aqui) no arquivo log4j.properties.

Espero que isso ajude, felicidades!

Gaurav Adurkar
fonte
Outro que eu achei útil é que você pode especificar o arquivo log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle
2

Este trecho de código abaixo para usuários do scala:

Opção 1 :

Abaixo do snippet, você pode adicionar no nível do arquivo

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

Opção 2 :

Nota: que será aplicável a todo o aplicativo que estiver usando a sessão spark.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Opção 3:

Nota: Essa configuração deve ser adicionada ao seu log4j.properties .. (pode ser como /etc/spark/conf/log4j.properties (onde a instalação do spark está lá) ou no nível da pasta do projeto log4j.properties), pois você está mudando em nível do módulo. Isso será aplicável a todos os aplicativos.

log4j.rootCategory=ERROR, console

IMHO, a opção 1 é uma maneira inteligente, pois pode ser desativada no nível do arquivo.

Ram Ghadiyaram
fonte
1

O jeito que eu faço é:

no local eu corro o spark-submitscript fazer

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

mude INFOpara o nível de registro que você deseja e execute o seuspark-submit

user3827333
fonte
cp /etc/spark/conf/log4j.properties.template .
deepelement
0

Se você deseja continuar usando o log (facilidade de log para Python), pode tentar dividir as configurações do seu aplicativo e do Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Santifinland
fonte