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"
horatio1701d
sumber
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.

poiuytrez
sumber
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.

FDS
sumber
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.

mdh
sumber
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.

AkhlD
sumber
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)
wannik
sumber
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

Galen Long
sumber
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")
Unmesha SreeVeni
sumber
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.
Josh Rosen
sumber
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)
Ani Menon
sumber
8

Cara terprogram

spark.sparkContext.setLogLevel("WARN")

pilihan yang tersedia

ERROR
WARN 
INFO 
loneStar
sumber
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/
oleksii
sumber
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!

Gaurav Adurkar
sumber
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.

Ram Ghadiyaram
sumber
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

pengguna3827333
sumber
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')
tanah santif
sumber