Wie deaktiviere ich die INFO-Anmeldung in Spark?


143

Ich habe Spark mithilfe des AWS EC2-Handbuchs installiert und kann das Programm mithilfe des bin/pysparkSkripts problemlos starten, um zur Spark-Eingabeaufforderung zu gelangen. Außerdem kann ich den Schnellstart erfolgreich ausführen.

Ich kann jedoch für mein ganzes Leben nicht herausfinden, wie die gesamte ausführliche INFOProtokollierung nach jedem Befehl gestoppt werden kann .

Ich habe fast jedes mögliche Szenario im folgenden Code (Auskommentieren, Ausstellen auf AUS) in meiner log4j.propertiesDatei in dem confOrdner ausprobiert, in dem ich die Anwendung starte, sowie auf jedem Knoten, und nichts tut etwas. INFONach Ausführung jeder Anweisung werden die Protokollierungsanweisungen immer noch gedruckt.

Ich bin sehr verwirrt darüber, wie das funktionieren soll.

#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

Hier ist mein vollständiger Klassenpfad, wenn ich benutze SPARK_PRINT_LAUNCH_COMMAND:

Spark-Befehl: /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

Inhalt von 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"

Im Spark-Programm können Sie nach dem Erstellen der Sitzung die unten angegebene Protokollstufe für Java SparkSession spark = SparkSession.builder (). Master ("local"). GetOrCreate () festlegen. spark.sparkContext (). setLogLevel ("INFO");
iKing

Antworten:


158

Führen Sie einfach diesen Befehl im Spark-Verzeichnis aus:

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

Bearbeiten Sie 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

In der ersten Zeile ersetzen:

log4j.rootCategory=INFO, console

durch:

log4j.rootCategory=WARN, console

Speichern Sie Ihre Shell und starten Sie sie neu. Es funktioniert für mich unter Spark 1.1.0 und Spark 1.5.1 unter OS X.


1
Dies hat geholfen, wichtig zu erkennen, dass log4j.properties nur vorhanden ist, wenn Sie es erstellen. Unter Ubuntu musste ich nicht neu starten, damit diese Änderungen wirksam wurden.
störend

Hat bei mir nicht funktioniert. Funke 1.5. RHEL 6. CDH 5.5. Es wurde versucht, eine neue Datei /opt/cloudera/parcels/CDH/etc/spark/conf.dist/log4j.properties zu erstellen und wie oben erläutert zu ändern. Außerdem wurde versucht, die vorhandene Datei /etc/spark/conf/log4j.properties zu bearbeiten. Kein Effekt für die Pyspark-Shell oder für die Pyspark-Shell.
Tagar

Müssen wir dies für alle Knoten im Funkencluster tun?
Wolke

54

Inspiriert von dem pyspark / tests.py, den ich gemacht habe

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 )

Wenn Sie dies direkt nach dem Erstellen von SparkContext aufrufen, werden die für meinen Test protokollierten stderr-Zeilen von 2647 auf 163 reduziert. Das Erstellen des SparkContext selbst protokolliert jedoch 163 bis zu

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

und mir ist nicht klar, wie ich diese programmgesteuert anpassen soll.


2
Wenn Sie Ideen zum Anpassen dieser Linien haben, teilen Sie diese bitte mit
Irene

Ich denke, es gibt keine direkte Lösung, um die Standard-Debugging-Stufe in PySpark zu ändern. Bis SparkContext startet. Weil sc._jvm erst erstellt wird, nachdem SC erstellt wurde. Sie können dies jedoch weiterhin über die Datei log4j.properies ändern, wie in anderen Antworten beschrieben. Spark sollte beispielsweise die Variable spark.default.logging erstellen, die als Option zum Überschreiben der Standard-Root-Logger-Ebene an SparkConf übergeben werden kann.
Tagar

37

In Spark 2.0 können Sie es mit setLogLevel auch dynamisch für Ihre Anwendung konfigurieren :

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

In der pyspark- Konsole ist bereits eine Standardsitzung sparkverfügbar.


Sie haben gerade Protokollnachrichten unterdrückt. Der eigentliche Code läuft jedoch im Hintergrund. Wenn Sie die CPU-Auslastung sehen. Funken mit viel CPU auch im Leerlauf.
Hurelhuyag

Dies war genau die Lösung für PySpark-Arbeiten, bei denen das log4jnicht zugänglich ist.
Yeliabsalohcin

35

Bearbeiten Sie Ihre Datei conf / log4j.properties und ändern Sie die folgende Zeile:

   log4j.rootCategory=INFO, console

zu

    log4j.rootCategory=ERROR, console

Ein anderer Ansatz wäre:

Zünden Sie die Funkenschale an und geben Sie Folgendes ein:

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

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

Danach werden keine Protokolle mehr angezeigt.


3
Die spätere Option funktioniert für Spark-Shell (Scala). Was sollten Sie jedoch bei Pyspark tun, ohne die log4j-Datei zu ändern?
hmi2015

Das Ändern der log4j-Eigenschaftendatei in "warn" wäre vorzuziehen, aber ansonsten funktioniert diese Antwort von wannik zum Ändern der Protokollstufe in die Konsole für pyspark stackoverflow.com/a/34487962/127971
michael

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

Ich habe das für pyspark benutzt. Funktioniert hervorragend als Einzeiler-Hack. Ich bekomme immer noch die dummen YarnExecutor gestorbenen Nachrichten, was kein Fehler sein sollte, imho. Und so geht es weiter ...
12.

2
Dies unterdrückt die Protokollierung nach der Ausführung, aber leider gibt es vor diesem Zeitpunkt viele INFO-Protokolle.
DavidJ

28

Für PySpark können Sie auch die Protokollebene in Ihren Skripten mit festlegen sc.setLogLevel("FATAL"). Aus den Dokumenten :

Kontrollieren Sie unser logLevel. Dies überschreibt alle benutzerdefinierten Protokolleinstellungen. Gültige Protokollebenen sind: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN


Tolle Lösung, die für Versionen von Spark funktioniert, die neuer als 1.4 sind (also seit Mitte 2015).
Jealie

Ich habe dies mit Spark 1.6.2 und Scala versucht und es scheint nicht zu funktionieren
Yeikel

@ Yeikel Diese Lösung ist für PySpark. Entschuldigung, das wurde nicht klargestellt - ich werde die Antwort jetzt bearbeiten.
Galen Long

15

Sie können setLogLevel verwenden

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

spark.sparkContext.setLogLevel("WARN")

14

Dies kann daran liegen, wie Spark seinen Klassenpfad berechnet. Meine Vermutung ist die von Hadooplog4j.properties Datei von im Klassenpfad vor der von Spark Ihre Änderungen nicht wirksam werden.

Wenn du läufst

SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell

Dann druckt Spark den vollständigen Klassenpfad, der zum Starten der Shell verwendet wird. in meinem Fall verstehe ich

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

wo /root/ephemeral-hdfs/conf ist an der Spitze des Klassenpfades.

Ich habe eine Ausgabe geöffnet [SPARK-2913] , um dieses in der nächsten Version zu beheben (ich sollte bald einen Patch veröffentlichen).

In der Zwischenzeit finden Sie hier einige Problemumgehungen:

  • Hinzufügen export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf"zuspark-env.sh .
  • Löschen (oder umbenennen) /root/ephemeral-hdfs/conf/log4j.properties.

Danke dir. Ich habe versucht, das zu meiner spark-env.sh-Datei hinzuzufügen und habe auch versucht, die Datei log4j.properties zu löschen, aber immer noch die INFO-Ausgabe zu erhalten. Ich habe meinen vollständigen Klassenpfad zur Frage hinzugefügt.
horatio1701d

Danke für die zusätzlichen Infos. Könnten Sie auch den Inhalt von spark-env.sh posten (Sie können private Informationen wie Hostnamen redigieren)?
Josh Rosen

Danke. hat spark-env.sh gepostet. Es tut mir leid, wenn ich nicht verstehe, wie ich ein Basis-Setup in Gang bringen kann. Ich habe vorerst alles so standardmäßig wie möglich belassen, nur um ein paar Tests zu versuchen.
horatio1701d

9

Funke 1.6.2:

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

Spark 2.x:

spark.sparkContext.setLogLevel('WARN')

(Funke ist die SparkSession)

Alternativ die alten Methoden,

Benennen Sie conf/log4j.properties.templatezu conf/log4j.propertiesSpark Dir.

In der log4j.propertieswechseln Sie log4j.rootCategory=INFO, consolezulog4j.rootCategory=WARN, console

Verschiedene Protokollebenen verfügbar:

  • AUS (am spezifischsten, keine Protokollierung)
  • FATAL (spezifischste, wenig Daten)
  • FEHLER - Protokollieren Sie nur bei Fehlern
  • WARNUNG - Protokollieren Sie nur bei Warnungen oder Fehlern
  • INFO (Standard)
  • DEBUG - Protokolldetailschritte (und alle oben angegebenen Protokolle)
  • TRACE (am wenigsten spezifisch, viele Daten)
  • ALL (am wenigsten spezifisch, alle Daten)

8

Programmatischer Weg

spark.sparkContext.setLogLevel("WARN")

Verfügbare Optionen

ERROR
WARN 
INFO 

5

Ich habe dies mit Amazon EC2 mit 1 Master und 2 Slaves und Spark 1.2.1 verwendet.

# 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

Fügen Sie einfach den folgenden Parameter zu Ihrem Spark-Submit-Befehl hinzu

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

Dadurch wird der Systemwert nur für diesen Job vorübergehend überschrieben. Überprüfen Sie den genauen Eigenschaftsnamen (log4jspark.root.logger hier) aus der Datei log4j.properties.

Hoffe das hilft, Prost!


Eine andere, die ich nützlich fand, ist, dass Sie die Datei log4j.properties angeben können:--conf spark.driver.extraJavaOptions='-Dlog4j.configuration=file:/home/foobar/log4j.properties
selle

2

Das folgende Code-Snippet für Scala-Benutzer:

Option 1 :

Unterhalb des Snippets können Sie auf Dateiebene hinzufügen

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

Option 2 :

Hinweis: Dies gilt für alle Anwendungen, die eine Spark-Sitzung verwenden.

import org.apache.spark.sql.SparkSession

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

spark.sparkContext.setLogLevel("WARN")

Option 3:

Hinweis: Diese Konfiguration sollte zu Ihren log4j.properties hinzugefügt werden Modulebene. Dies gilt für alle Anwendungen.

log4j.rootCategory=ERROR, console

IMHO, Option 1 ist sinnvoll, da es auf Dateiebene ausgeschaltet werden kann.


1

Ich mache es so:

an dem Ort, an dem ich das spark-submitSkript ausführe, tun

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

Wechseln INFOSie zu der gewünschten Protokollierungsstufe und führen Sie dann Ihre ausspark-submit


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

0

Wenn Sie weiterhin die Protokollierung (Protokollierungsfunktion für Python) verwenden möchten, können Sie versuchen, Konfigurationen für Ihre Anwendung und für Spark aufzuteilen:

LoggerManager()
logger = logging.getLogger(__name__)
loggerSpark = logging.getLogger('py4j')
loggerSpark.setLevel('WARNING')
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.