Bagaimana cara mematikan info INFO di Spark?


144

Saya menginstal Spark menggunakan panduan AWS EC2 dan saya dapat meluncurkan program dengan baik menggunakan bin/pysparkscript untuk sampai ke percikan percikan dan juga dapat melakukan Quick Start quide berhasil.

Namun, saya tidak bisa selama hidup saya mencari cara untuk menghentikan semua INFOlogging verbose setelah setiap perintah.

Saya telah mencoba hampir setiap skenario yang mungkin dalam kode di bawah ini (mengomentari, mengatur ke OFF) dalam log4j.propertiesfile saya di conffolder di mana saya meluncurkan aplikasi dari serta pada setiap node dan tidak ada yang melakukan apa-apa. Saya masih mendapatkan INFOpencetakan laporan logging setelah mengeksekusi setiap pernyataan.

Saya sangat bingung dengan bagaimana ini seharusnya bekerja.

#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

Ini classpath penuh saya ketika saya menggunakan SPARK_PRINT_LAUNCH_COMMAND:

Spark Command: /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. Utama

isi dari 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"

Dalam program Spark setelah membuat sesi Anda dapat mengatur level Log seperti yang diberikan di bawah ini untuk Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate (); spark.sparkContext (). setLogLevel ("INFO");
iKing

Jawaban:


158

Cukup jalankan perintah ini di direktori percikan:

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

Edit 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

Ganti di baris pertama:

log4j.rootCategory=INFO, console

oleh:

log4j.rootCategory=WARN, console

Simpan dan mulai ulang shell Anda. Ini berfungsi untuk saya untuk Spark 1.1.0 dan Spark 1.5.1 di OS X.


1
Ini membantu, penting untuk menyadari bahwa log4j.properties tidak ada kecuali Anda membuatnya. Di ubuntu, saya tidak perlu memulai ulang agar perubahan ini dapat berpengaruh.
Mengganggu

Tidak bekerja untuk saya. Spark 1.5. RHEL 6. CDH 5.5. Mencoba membuat file baru /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties dan mengubah seperti dijelaskan di atas. Dan juga mencoba mengedit file /etc/spark/conf/log4j.properties yang sudah ada. Tidak ada efek untuk shell pyspark atau untuk pyspark-shell.
Tagar

Apakah kita perlu melakukan ini untuk semua node di cluster percikan?
cloud

54

Terinspirasi oleh pyspark / tests.py yang saya lakukan

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 )

Memanggil ini hanya setelah membuat SparkContext mengurangi garis stderr yang dicatat untuk pengujian saya dari 2647 menjadi 163. Namun membuat SparkContext sendiri mencatat 163, hingga

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

dan tidak jelas bagi saya bagaimana mengaturnya secara terprogram.


2
jika Anda punya ide tentang cara menyesuaikan garis-garis itu, silakan bagikan
Irene

Saya pikir tidak ada solusi langsung untuk mengubah level debugging default di PySpark .. sampai SparkContext dimulai. Karena sc._jvm dibuat hanya setelah SC dibuat. Anda masih dapat mengubahnya melalui file log4j.properies meskipun seperti yang dibahas dalam jawaban lain. Spark harus membuat misalnya variabel spark.default.logging yang dapat diteruskan ke SparkConf sebagai opsi untuk mengganti tingkat Root Logger standar.
Tagar

37

Di Spark 2.0 Anda juga dapat mengonfigurasinya secara dinamis untuk aplikasi Anda menggunakan setLogLevel :

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

Di konsol pyspark , sparksesi default sudah tersedia.


Anda baru saja menekan pesan log. Tetapi kode aktual sedang berjalan di latar belakang. Jika Anda melihat penggunaan CPU. Spark menggunakan banyak CPU bahkan saat idle.
hurelhuyag

Ini adalah solusi tepat untuk pekerjaan PySpark di mana yang log4jtidak dapat diakses.
yeliabsalohcin

35

Edit file conf / log4j.properties Anda dan Ubah baris berikut:

   log4j.rootCategory=INFO, console

untuk

    log4j.rootCategory=ERROR, console

Pendekatan lain adalah:

Fire-spark-shell dan ketik berikut ini:

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

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

Anda tidak akan melihat log apa pun setelah itu.


3
opsi selanjutnya berfungsi untuk spark-shell (scala) tetapi apa yang harus Anda lakukan jika pyspark tanpa mengubah file log4j?
hmi2015

Mengubah file properti log4j menjadi "warn" akan lebih disukai, tetapi sebaliknya jawaban oleh wannik ini bekerja untuk mengubah level log menjadi konsol untuk pyspark stackoverflow.com/a/34487962/127971
michael

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

Saya menggunakan ini untuk pyspark. Berfungsi bagus sebagai retasan satu baris. Saya masih mendapatkan pesan YarnExecutor yang konyol, yang seharusnya tidak menjadi kesalahan, imho. Dan begitu seterusnya ...
jatal

2
Sayangnya, ini menekan logging setelah dieksekusi, tetapi ada banyak log INFO sebelum titik itu, sayangnya.
DavidJ

28

Untuk PySpark, Anda juga dapat mengatur level log dalam skrip Anda sc.setLogLevel("FATAL"). Dari dokumen :

Kontrol logLevel kami. Ini menimpa pengaturan log yang ditetapkan pengguna. Level log yang valid meliputi: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, PERINGATAN


Solusi hebat yang berfungsi untuk versi Spark yang lebih baru dari 1.4 (jadi, sejak pertengahan 2015).
Jealie

Saya mencoba ini dengan Spark 1.6.2 dan Scala dan sepertinya tidak berhasil
Yeikel

@Yeikel Solusi ini untuk PySpark. Maaf itu tidak dijelaskan - saya akan mengedit jawabannya sekarang.
Galen Long

15

Anda dapat menggunakan setLogLevel

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

spark.sparkContext.setLogLevel("WARN")

14

Ini mungkin karena bagaimana Spark menghitung classpath-nya. Firasat saya adalah bahwa log4j.propertiesfile Hadoop muncul di depan Spark di classpath, mencegah perubahan Anda dari efek.

Jika Anda berlari

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

kemudian Spark akan mencetak classpath penuh yang digunakan untuk meluncurkan shell; dalam kasus saya, saya mengerti

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

di mana /root/ephemeral-hdfs/confadalah di kepala classpath.

Saya telah membuka masalah [SPARK-2913] untuk memperbaikinya di rilis berikutnya (saya harus segera tambalan).

Sementara itu, inilah beberapa solusi:

  • Tambahkan export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"ke spark-env.sh.
  • Hapus (atau ganti nama) /root/ephemeral-hdfs/conf/log4j.properties.

Terima kasih. Saya mencoba menambahkan itu ke file spark-env.sh saya dan juga mencoba menghapus file log4j.properties tetapi masih mendapatkan output INFO. Saya telah menambahkan classpath penuh saya ke pertanyaan.
horatio1701d

Terima kasih atas info tambahannya. Bisakah Anda juga memposting konten spark-env.sh (Anda dapat menghapus informasi pribadi, seperti nama host)?
Josh Rosen

Terima kasih. memposting spark-env.sh. Maaf jika saya salah memahami cara menjalankan pengaturan basis. Saya baru saja membiarkan semuanya sebagai standar mungkin untuk saat ini hanya untuk mencoba beberapa pengujian.
horatio1701d

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')

(percikan menjadi SparkSession)

Atau metode lama,

Ganti nama conf/log4j.properties.templatemenjadi conf/log4j.propertiesdi Spark Dir.

Di log4j.properties, ubah log4j.rootCategory=INFO, consolekelog4j.rootCategory=WARN, console

Tingkat log yang berbeda tersedia:

  • OFF (paling spesifik, tanpa logging)
  • FATAL (paling spesifik, sedikit data)
  • GALAT - Masuk hanya jika terjadi Kesalahan
  • PERINGATAN - Hanya login jika Peringatan atau Kesalahan
  • INFO (Default)
  • DEBUG - Langkah-langkah detail log (dan semua log dinyatakan di atas)
  • TRACE (paling tidak spesifik, banyak data)
  • ALL (paling tidak spesifik, semua data)

8

Cara terprogram

spark.sparkContext.setLogLevel("WARN")

pilihan yang tersedia

ERROR
WARN 
INFO 

5

Saya menggunakan ini dengan Amazon EC2 dengan 1 master dan 2 budak dan 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/

4

Cukup tambahkan param di bawah ini ke perintah percikan-kirim Anda

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

Ini mengesampingkan nilai sistem sementara hanya untuk pekerjaan itu. Periksa nama properti yang tepat (log4jspark.root.logger di sini) dari file log4j.properties.

Semoga ini bisa membantu, tepuk tangan!


Satu lagi saya menemukan berguna adalah bahwa Anda dapat menentukan file log4j.properties:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

Cuplikan kode di bawah ini untuk pengguna scala:

Pilihan 1 :

Di bawah cuplikan Anda dapat menambahkan di tingkat file

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

Pilihan 2 :

Catatan: yang akan berlaku untuk semua aplikasi yang menggunakan sesi percikan.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Opsi 3:

Catatan: Konfigurasi ini harus ditambahkan ke log4j.properties Anda .. (bisa seperti /etc/spark/conf/log4j.properties (di mana instalasi percikan ada) atau log4j.properties tingkat folder proyek Anda karena Anda berubah pada tingkat modul. Ini akan berlaku untuk semua aplikasi.

log4j.rootCategory=ERROR, console

IMHO, Opsi 1 adalah cara yang bijak karena dapat dimatikan pada tingkat file.


1

Cara saya melakukannya adalah:

di lokasi saya menjalankan spark-submitskrip lakukan

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

ubah INFOke level apa saja dari logging yang Anda inginkan dan kemudian jalankanspark-submit


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

0

Saya ingin tetap menggunakan pencatatan (Fasilitas pencatatan untuk Python) Anda dapat mencoba memisahkan konfigurasi untuk aplikasi Anda dan untuk Spark:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.