Wie deaktiviere ich die INFO-Anmeldung in Spark?

Ich habe Spark mithilfe des AWS EC2-Handbuchs installiert und kann das Programm mit dem Script bin/pyspark , um zur Spark-Eingabeaufforderung zu gelangen und die Schnellstart-function erfolgreich auszuführen.

Jedoch kann ich für das Leben von mir nicht herausfinden, wie man die ausführliche INFO Protokollierung nach jedem Befehl stoppt.

Ich habe fast jedes mögliche Szenario im folgenden Code ( log4j.properties , Einstellung auf OFF) in meiner log4j.properties Datei im conf Ordner conf in dem ich die Anwendung sowohl von als auch auf jedem Knoten conf und nichts tut. Ich bekomme immer noch die protokollierenden INFO statementen nach dem Ausführen jeder statement.

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 classnpfad, wenn ich 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 (eg 1000M, 2G) (Default: 1G) # - SPARK_DRIVER_MEMORY, Memory for Master (eg 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 (eg "-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 (eg 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 (eg "-Dx=y") # - SPARK_HISTORY_OPTS, to set config properties only for the history server (eg "-Dx=y") # - SPARK_DAEMON_JAVA_OPTS, to set config properties for all daemons (eg "-Dx=y") # - SPARK_PUBLIC_DNS, to set the public dns name of the master or workers export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf" 

   

Führen Sie diesen Befehl einfach im Verzeichnis “spark” 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 

Ersetzen Sie in der ersten Zeile:

 log4j.rootCategory=INFO, console 

durch:

 log4j.rootCategory=WARN, console 

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

Inspiriert von der pyspark / tests.py tat ich es

 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 den 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 es ist mir nicht klar, wie man diese programmatisch einstellt.

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:

Fireup Funkenschale 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.

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

Sie können die Protokollstufe in Ihren Skripten auch mit sc.setLogLevel("FATAL") . Aus den Dokumenten :

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

In Spark 2.0 können Sie es auch dynamisch für Ihre Anwendung mit setLogLevel 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 Standard- spark Sitzung verfügbar.

Dies kann daran liegen, wie Spark seinen classnpfad berechnet. Meine Vermutung ist, dass die Datei log4j.properties Hadoop im log4j.properties vor Sparks erscheint und verhindert, dass Ihre Änderungen wirksam werden.

Wenn du läufst

 SPARK_PRINT_LAUNCH_COMMAND=1 bin/spark-shell 

Dann druckt Spark den vollständigen classnpfad, der zum Starten der Shell verwendet wird. in meinem Fall sehe 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 

Dabei steht /root/ephemeral-hdfs/conf an der Spitze des classnpfads.

Ich habe ein Problem [SPARK-2913] geöffnet, um dies in der nächsten Version zu beheben (ich sollte bald ein Patch haben).

In der Zwischenzeit finden Sie hier einige Problemumgehungen:

  • Fügen Sie export SPARK_SUBMIT_CLASSPATH="$FWDIR/conf" zu spark-env.sh .
  • Löschen Sie (oder benennen Sie) /root/ephemeral-hdfs/conf/log4j.properties .

Ich benutzte dies mit Amazon EC2 mit 1 Master und 2 Slaves und 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/ 

Spark 1.6.2:

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

Spark 2.x:

 spark.sparkContext.setLogLevel('WARN') 

(Funken ist die SparkSession)

Alternativ die alten Methoden,

conf/log4j.properties.template conf/log4j.properties in conf/log4j.properties in Spark Dir. conf/log4j.properties .

Ändern log4j.rootCategory=INFO, console in der log4j.properties log4j.rootCategory=INFO, console to log4j.rootCategory=WARN, console

Verschiedene Protokollebenen verfügbar:

  • AUS (am spezifischsten, keine Protokollierung)
  • FATAL (am spezifischsten, wenig Daten)
  • FEHLER – Log nur bei Fehlern
  • WARN – Log nur bei Warnungen oder Fehlern
  • INFO (Standard)
  • DEBUG – Protokolldetails (und alle oben genannten Protokolle)
  • TRACE (am wenigsten spezifisch, viele Daten)
  • ALL (am wenigsten spezifisch, alle Daten)

So wie ich es mache ist:

An dem Ort, an dem ich das spark-submit Skript ausführe spark-submit mache ich

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

Ändern Sie INFO auf die von Ihnen gewünschte Protokollierungsstufe und führen Sie dann Ihre spark-submit

Wenn Sie die Protokollierung (Protokollierungsfunktion für Python) weiterhin 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') 

Fügen Sie einfach folgenden Parameter zu Ihrem Befehl zum Senden von Funken hinzu

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

Dies überschreibt den Systemwert vorübergehend nur für diesen Job. Überprüfen Sie den genauen Namen der Eigenschaft (log4jspark.root.logger hier) aus der Datei log4j.properties.

Hoffe, das hilft, Prost!