Spark'da INFO günlüğü nasıl kapatılır?


144

Spark'ı AWS EC2 kılavuzunu kullanarak yükledim bin/pysparkve kıvılcım komut istemine ulaşmak için komut dosyasını kullanarak programı iyi başlatabilirim ve ayrıca Hızlı Başlangıç ​​işlemini başarılı bir şekilde yapabilirim.

Ancak, hayatım boyunca INFOher komuttan sonra tüm ayrıntılı günlük kaydını nasıl durduracağımı anlayamıyorum .

Ben her uygulamayı yanı sıra her düğüm üzerinde uygulamayı başlatmak klasöründe benim log4j.propertiesdosya içinde aşağıdaki kod (yorum yapma, KAPALI ayarı) hemen hemen her olası senaryo denedim confve hiçbir şey bir şey yapmıyor. INFOHer deyimi yürüttükten sonra hala günlük ifadeleri yazdırılıyor.

Bunun nasıl çalışması gerektiği konusunda çok kafam karıştı.

#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

İşte benim tam sınıf yolu kullandığım zaman SPARK_PRINT_LAUNCH_COMMAND:

Kıvılcım Komutu: /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 kıvılcım kabuğu - sınıf org.apache.spark. repl.Main

içeriği 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"

Oturum oluşturduktan sonra Spark programında, Java SparkSession spark = SparkSession.builder (). Master ("local") için Günlük düzeyini aşağıda verildiği şekilde ayarlayabilirsiniz. GetOrCreate (); spark.sparkContext () setLogLevel ( "Bilgi.");
IKING

Yanıtlar:


158

Bu komutu kıvılcım dizininde yürütün:

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

Log4j.properties dosyasını düzenleyin:

# 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

İlk satırda değiştirin:

log4j.rootCategory=INFO, console

tarafından:

log4j.rootCategory=WARN, console

Kabuğunuzu kaydedin ve yeniden başlatın. OS X'de Spark 1.1.0 ve Spark 1.5.1 için çalışıyor.


1
Bu, log4j.properties öğesinin siz oluşturmadığınız sürece varolmadığını fark etmek önemlidir. Ubuntu'da, bu değişikliklerin etkili olması için yeniden başlatmam gerekmiyordu.
yıkıcı

Benim için çalışmadı. Kıvılcım 1.5. RHEL 6. CDH 5.5. /Opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties adlı yeni dosya oluşturmayı ve yukarıda açıklandığı gibi değiştirmeyi denedi. Ayrıca mevcut dosya /etc/spark/conf/log4j.properties dosyasını düzenlemeyi de denedi. Pyspark kabuğu veya pyspark kabuğu için bir etkisi yoktur.
Tagar

kıvılcım kümesindeki tüm düğümler için bunu yapmamız gerekir mi?
bulut

54

Pyspark / tests.py'dan ilham aldım

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'i oluşturduktan hemen sonra çağırmak, testim için kaydedilen stderr satırlarını 2647'den 163'e düşürdü. Ancak SparkContext'i oluşturmak, 163'e kadar günlüğe kaydediyor

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

ve bunları programlı olarak nasıl ayarlayacağım açık değil.


2
bu çizgileri nasıl ayarlayacağınız konusunda herhangi bir fikriniz varsa lütfen paylaşın
Irene

SparkContext başlayana kadar PySpark varsayılan hata ayıklama seviyesini değiştirmek için doğrudan bir çözüm olduğunu düşünüyorum. Çünkü sc._jvm sadece SC oluşturulduktan sonra oluşturulur. Diğer yanıtlarda tartışıldığı gibi yine de log4j.properies dosyası aracılığıyla değiştirebilirsiniz. Spark, varsayılan Kök Kaydedici düzeyini geçersiz kılma seçeneği olarak SparkConf'a iletilebilen spark.default.logging değişkeni oluşturmalıdır.
Tagar

37

Spark 2.0'da setLogLevel kullanarak uygulamanız için dinamik olarak da yapılandırabilirsiniz :

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

In pyspark konsolu varsayılan bir sparkoturum zaten mevcut olacaktır.


Sadece günlük mesajlarını bastırdınız. Ancak gerçek kod arka planda çalışıyor. CPU kullanımını görüyorsanız. Boştayken bile çok fazla CPU kullanın.
hurelhuyag

Bu tam olarak erişilemeyen PySpark çalışmaları için bir çözümdü log4j.
yeliabsalohcin

35

Conf / log4j.properties dosyanızı düzenleyin ve aşağıdaki satırı değiştirin:

   log4j.rootCategory=INFO, console

için

    log4j.rootCategory=ERROR, console

Başka bir yaklaşım:

Ateşleme kıvılcım kabuğu ve aşağıdakileri yazın:

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

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

Bundan sonra herhangi bir günlük görmeyeceksiniz.


3
sonraki seçenek kıvılcım kabuğu (scala) için çalışır, ancak log4j dosyasını değiştirmeden pyspark durumunda ne yapmalısınız?
hmi2015 9:15

"Uyarmak" için log4j özellikleri dosya değiştirme tercih edilebilir, fakat başka şekilde Wannik tarafından bu yanıt pyspark için konsola günlük düzeyini değiştirmek için çalışır ediyorum stackoverflow.com/a/34487962/127971
michael

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

Bunu pyspark için kullandım. Tek katmanlı bir hack olarak harika çalışıyor. Hala aptal YarnExecutor hata olmamalı mesajlar alıyorum imho. Ve böylece gidiyor ...
04'te

2
Bu, yürütüldükten sonra günlüğe kaydetmeyi bastırır, ancak maalesef bu noktadan önce birçok INFO günlüğü vardır.
DavidJ

28

PySpark için, komut dosyalarınızdaki günlük düzeyini ile de ayarlayabilirsiniz sc.setLogLevel("FATAL"). Gönderen docs :

LogLevel'imizi kontrol edin. Bu, kullanıcı tanımlı günlük ayarlarını geçersiz kılar. Geçerli günlük seviyeleri şunları içerir: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


Spark'ın 1.4'ten daha yeni sürümleri için harika bir çözüm (2015'in ortasından beri).
Jealie

Bunu Spark 1.6.2 ve Scala ile denedim ve işe yaramıyor
Yeikel

@Yeikel Bu çözüm PySpark içindir. Maalesef anlaşılmadı - Cevabı şimdi düzenleyeceğim.
Galen Long

15

SetLogLevel kullanabilirsiniz

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

spark.sparkContext.setLogLevel("WARN")

14

Bu Spark'ın sınıf yolunu nasıl hesapladığından kaynaklanıyor olabilir. Benim önsezim, Hadoop'un log4j.propertiesdosyasının sınıf yolundaki Spark'ın önünde görünmesi ve değişikliklerinizin etkili olmasını engellemesi.

Eğer koşarsan

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

sonra Spark kabuğu başlatmak için kullanılan tüm sınıfyolunu yazdıracaktır; benim durumumda görüyorum

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

nerede /root/ephemeral-hdfs/confsınıf yolunda başındadır.

Bir sonraki sürümde bunu düzeltmek için bir sorun [SPARK-2913] açtım (yakında bir yama yapmalıyım).

Bu arada, işte birkaç geçici çözüm:

  • Ekle export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"için spark-env.sh.
  • Silin (veya yeniden adlandırın) /root/ephemeral-hdfs/conf/log4j.properties.

Teşekkür ederim. Bunu spark-env.sh dosyama eklemeye çalıştım ve log4j.properties dosyasını silmeye çalıştım ama yine de INFO çıktısını aldım. Soruya tüm sınıfyolumu ekledim.
horatio1701d

Fazladan bilgi için teşekkür ederim. Ayrıca spark-env.sh içeriğini de gönderebilir misiniz (hostnames gibi özel bilgileri yeniden yazabilirsiniz)?
Josh Rosen

teşekkür ederim. yayınlanmıştır spark-env.sh. Temel kurulumun nasıl yapılacağını yanlış anlıyorum. Sadece bazı testleri denemek için her şeyi mümkün olduğunca varsayılan olarak bıraktım.
horatio1701d

9

Kıvılcım 1.6.2:

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

Kıvılcım 2.x:

spark.sparkContext.setLogLevel('WARN')

(kıvılcım Kıvılcımdır)

Alternatif olarak eski yöntemler,

Rename conf/log4j.properties.templateiçin conf/log4j.propertiesSpark Dir içinde.

Olarak log4j.properties, değiştirmek log4j.rootCategory=INFO, consoleiçinlog4j.rootCategory=WARN, console

Farklı günlük seviyeleri mevcuttur:

  • KAPALI (en belirgin, günlük yok)
  • FATAL (en belirgin, küçük veri)
  • HATA - Yalnızca Hata durumunda günlüğe kaydet
  • UYARI - Yalnızca Uyarılar veya Hatalar Durumunda Günlüğe Kaydet
  • INFO (Varsayılan)
  • HATA AYIKLAMA - Ayrıntı ayrıntıları adımları (ve yukarıda belirtilen tüm günlükler)
  • TRACE (en az spesifik, çok fazla veri)
  • TÜMÜ (en az spesifik, tüm veriler)

8

Programlı yol

spark.sparkContext.setLogLevel("WARN")

mevcut seçenekler

ERROR
WARN 
INFO 

5

Bunu 1 master, 2 slave ve Spark 1.2.1 ile Amazon EC2 ile kullandım.

# 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

Kıvılcım gönderme komutunuza aşağıdaki parametreyi ekleyin

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

Bu, yalnızca bu iş için sistem değerini geçici olarak geçersiz kılar. Log4j.properties dosyasından tam özellik adını (log4jspark.root.logger burada) kontrol edin.

Umarım bu yardımcı olur, şerefe!


Yararlı bulduğum başka bir tanesi de log4j.properties dosyasını belirleyebilmenizdir:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

Scala kullanıcıları için aşağıdaki kod snippet'i:

Seçenek 1 :

Snippet'in altına dosya düzeyinde ekleyebilirsiniz

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

Seçenek 2 :

Not: kıvılcım oturumu kullanan tüm uygulamalar için geçerli olacaktır.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Seçenek 3:

Not: Bu yapılandırma, değiştirdiğinizden beri log4j.properties'e (/etc/spark/conf/log4j.properties (kıvılcım yüklemesinin olduğu yerde) veya proje klasör düzeyi log4j.properties gibi) eklenmelidir. modül seviyesi. Bu, tüm uygulama için geçerli olacaktır.

log4j.rootCategory=ERROR, console

IMHO, Seçenek 1 akıllıca bir yöntemdir çünkü dosya seviyesinde kapatılabilir.


1

Bunu yapmamın yolu:

spark-submitbetiği çalıştırdığım konumda

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

INFOistediğiniz günlük kaydı düzeyine değiştirin ve ardındanspark-submit


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

0

Günlüğe kaydetmeyi (Python için günlük kaydı olanağı) kullanmaya devam etmek istiyorsanız, uygulamanız ve Spark için yapılandırmaları bölmeyi deneyebilirsiniz:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.