Ich möchte verschiedene Nachrichten stoppen, die auf Spark Shell kommen.
Ich habe versucht, die log4j.properties
Datei zu bearbeiten , um diese Nachricht zu stoppen.
Hier sind die Inhalte von log4j.properties
# Define the root logger with appender file
log4j.rootCategory=WARN, 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
Es werden jedoch weiterhin Nachrichten auf der Konsole angezeigt.
Hier sind einige Beispielnachrichten
15/01/05 15:11:45 INFO SparkEnv: Registering BlockManagerMaster
15/01/05 15:11:45 INFO DiskBlockManager: Created local directory at /tmp/spark-local-20150105151145-b1ba
15/01/05 15:11:45 INFO MemoryStore: MemoryStore started with capacity 0.0 B.
15/01/05 15:11:45 INFO ConnectionManager: Bound socket to port 44728 with id = ConnectionManagerId(192.168.100.85,44728)
15/01/05 15:11:45 INFO BlockManagerMaster: Trying to register BlockManager
15/01/05 15:11:45 INFO BlockManagerMasterActor$BlockManagerInfo: Registering block manager 192.168.100.85:44728 with 0.0 B RAM
15/01/05 15:11:45 INFO BlockManagerMaster: Registered BlockManager
15/01/05 15:11:45 INFO HttpServer: Starting HTTP Server
15/01/05 15:11:45 INFO HttpBroadcast: Broadcast server star
Wie stoppe ich diese?
apache-spark
log4j
spark-submit
Vishwas
quelle
quelle
Gleich nach dem Start
spark-shell
Typ;In Spark 2.0 (Scala):
API-Dokumente: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession
Für Java:
quelle
Vielen Dank an @AkhlD und @Sachin Janani, dass sie Änderungen in der
.conf
Datei vorgeschlagen haben.Der folgende Code hat mein Problem gelöst:
1)
import org.apache.log4j.{Level, Logger}
Im Importbereich hinzugefügt2) Folgende Zeile nach dem Erstellen des Spark-Kontextobjekts hinzugefügt, dh nach
val sc = new SparkContext(conf)
:quelle
Verwenden Sie den folgenden Befehl, um die Protokollstufe zu ändern, während Sie die Anwendung mit spark-submit oder spark-sql senden:
Hinweis: Ersetzen Sie,
<file path>
wo dielog4j
Konfigurationsdatei gespeichert ist.Log4j.properties:
log4j.xml
Wechseln Sie in log4j.xml zu FileAppender, wenn Sie Protokolle anstelle der Konsole in eine Datei schreiben möchten.
LOG_DIR
ist eine Variable für das Protokollverzeichnis, mit der Sie angeben könnenspark-submit --conf "spark.driver.extraJavaOptions=-D
.Eine weitere wichtige Sache, die Sie hier verstehen sollten, ist, dass beim Starten des Jobs im verteilten Modus (Cluster im Bereitstellungsmodus und Master als Garn oder Mesos) die log4j-Konfigurationsdatei auf Treiber- und Arbeiterknoten (
log4j.configuration=file:<file path>/log4j.xml
) vorhanden sein sollte, da sich sonst log4j init beschwert.Hinweis zur Lösung dieses Problems-
Behalten Sie die log4j-Konfigurationsdatei im verteilten Dateisystem (HDFS oder Mesos) bei und fügen Sie mithilfe des log4j PropertyConfigurator eine externe Konfiguration hinzu . Oder verwenden Sie sparkContext addFile , um es auf jedem Knoten verfügbar zu machen, und verwenden Sie dann log4j PropertyConfigurator, um die Konfiguration neu zu laden.
quelle
org
Protokolle blockiert werden , die traditionell vom Standardprotokollierer stammen.Log4j.properties
Datei? Es scheint nicht benutzt zu werden. Dokumentieren Sie einfach die in der XML-Datei festgelegten Eigenschaften?--files
den Befehl spark-submit, um log4j.properties auf allen Knoten verfügbar zu machen.Log4.properties
untermain/resources
für den Fall, dass es nicht existiertAlle Methoden mit Beispielen gesammelt
Intro
Tatsächlich gibt es viele Möglichkeiten, dies zu tun . Einige sind schwerer als andere, aber es liegt an Ihnen, welches am besten zu Ihnen passt. Ich werde versuchen, sie alle zu präsentieren.
# 1 Programmatisch in Ihrer App
Scheint am einfachsten zu sein, aber Sie müssen Ihre App neu kompilieren, um diese Einstellungen zu ändern. Persönlich mag ich es nicht, aber es funktioniert gut.
Beispiel:
Mit der
log4j
API können Sie viel mehr erreichen .Quelle: [ Log4J-Konfigurationsdokumente , Konfigurationsabschnitt]
# 2 Pass
log4j.properties
währendspark-submit
Dieser ist sehr knifflig, aber nicht unmöglich. Und mein Favorit.
Log4J sucht und lädt beim Starten der App immer eine
log4j.properties
Datei aus dem Klassenpfad.Bei Verwendung von
spark-submit
Spark Cluster hat der Klassenpfad jedoch Vorrang vor dem Klassenpfad der App! Aus diesem Grund überschreibt das Einfügen dieser Datei in Ihr Fat-Jar die Einstellungen des Clusters nicht!Um die letzte Bedingung zu erfüllen, können Sie die Datei entweder an den für die Knoten verfügbaren Speicherort (wie
hdfs
) hochladen oder bei Verwendung lokal mit dem Treiber darauf zugreifendeploy-mode client
. Andernfalls:Quelle: Spark-Dokumente, Debugging
Schritte:
Beispiel
log4j.properties
:Ausführen
spark-submit
für den Cluster-Modus:Beachten Sie, dass Sie verwenden müssen,
--driver-java-options
wenn Sie denclient
Modus verwenden. Spark-Dokumente, Runtime envAusführen
spark-submit
für den Client-Modus:Anmerkungen:
spark-cluster
mit hochgeladen wurden,--files
sind im Stammverzeichnis verfügbar, sodass kein Pfad hinzugefügt werden mussfile:log4j.properties
.--files
müssen mit einem absoluten Pfad versehen sein!file:
Das Präfix im Konfigurations-URI ist obligatorisch.# 3 Cluster bearbeiten
conf/log4j.properties
Dadurch wird die Konfigurationsdatei für die globale Protokollierung geändert .
Quelle: Spark-Dokumente, Debugging
Um Ihre zu finden, können
SPARK_CONF_DIR
Sie verwendenspark-shell
:Bearbeiten Sie jetzt einfach
/var/lib/spark/latest/conf/log4j.properties
(mit Beispiel aus Methode 2) und alle Ihre Apps teilen diese Konfiguration.# 4 Konfigurationsverzeichnis überschreiben
Wenn Ihnen die Lösung Nr. 3 gefällt, Sie sie jedoch pro Anwendung anpassen möchten, können Sie den
conf
Ordner tatsächlich kopieren , den Inhalt bearbeiten und währenddessen die Stammkonfiguration angebenspark-submit
.Quelle: Spark-Dokumente, Konfiguration
Schritte:
conf
Ordner des Clusters (weitere Informationen, Methode 3).log4j.properties
In diesem Ordner bearbeiten (Beispiel in Methode 2)Stellen Sie
SPARK_CONF_DIR
in diesem Ordner, vor der Ausführungspark-submit
,zB:
Fazit
Ich bin mir nicht sicher, ob es eine andere Methode gibt, aber ich hoffe, dass dies das Thema von A bis Z abdeckt. Wenn nicht, können Sie mich gerne in den Kommentaren anpingen!
Genieße deinen Weg!
quelle
Sie deaktivieren die Protokolle, indem Sie den Pegel wie folgt auf AUS setzen:
oder bearbeiten Sie die Protokolldatei und setzen Sie die Protokollstufe auf Aus, indem Sie einfach die folgende Eigenschaft ändern:
quelle
Ich füge diese Zeile einfach allen meinen Pyspark-Skripten oben direkt unter den Importanweisungen hinzu.
Beispiel-Header meiner Pyspark-Skripte
quelle
Die obigen Antworten sind korrekt, haben mir aber nicht gerade geholfen, da ich zusätzliche Informationen benötigte.
Ich habe gerade Spark eingerichtet, sodass die log4j-Datei immer noch das Suffix '.template' hatte und nicht gelesen wurde. Ich glaube, dass die Protokollierung dann standardmäßig Spark Core Logging Conf ist.
Wenn Sie also wie ich sind und feststellen, dass die obigen Antworten nicht geholfen haben, müssen Sie möglicherweise auch das Suffix '.template' aus Ihrer log4j conf-Datei entfernen, und dann funktioniert das oben Gesagte einwandfrei!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
quelle
In Python / Spark können wir:
Die nach der Definition von Sparkcontaxt 'sc' rufen diese Funktion auf von: quiet_logs (sc)
quelle
tl; dr
Einzelheiten-
Intern werden
setLogLevel
Aufrufe verwendetorg.apache.log4j.Level.toLevel(logLevel)
, die dann zum Festlegen von using verwendet werdenorg.apache.log4j.LogManager.getRootLogger().setLevel(level)
.Sie können die Standardprotokollierung für die Spark-Shell einrichten
conf/log4j.properties
. Verwenden Sieconf/log4j.properties.template
als Ausgangspunkt.Festlegen von Protokollebenen in Spark-Anwendungen
Verwenden Sie in eigenständigen Spark-Anwendungen oder während einer Spark Shell-Sitzung Folgendes:
Deaktivieren der Protokollierung (in log4j):
Verwenden Sie Folgendes
conf/log4j.properties
, um die Protokollierung vollständig zu deaktivieren:Referenz: Mastering Spark von Jacek Laskowski.
quelle
Fügen Sie einfach den folgenden Parameter zu Ihrem Spark-Shell- ODER Spark-Submit-Befehl hinzu
Überprüfen Sie den genauen Eigenschaftsnamen (log4jspark.root.logger hier) aus der Datei log4j.properties. Hoffe das hilft, Prost!
quelle
Eine interessante Idee ist es, den RollingAppender wie hier vorgeschlagen zu verwenden: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/, damit Sie den Konsolenbereich nicht "verschmutzen", sondern Die Ergebnisse können weiterhin unter $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log angezeigt werden.
Eine andere Methode, die die Ursache behebt, besteht darin, zu beobachten, welche Art von Protokollierungen Sie normalerweise haben (die aus verschiedenen Modulen und Abhängigkeiten stammen), und für jede die Granularität für die Protokollierung festzulegen, während Sie "leise" Protokolle von Drittanbietern erstellen, die zu ausführlich sind:
Zum Beispiel,
quelle
Einfach in der Kommandozeile zu machen ...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..andere Optionen..quelle
spark2-submit
?quelle
quelle
val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR)
es hat funktioniertZusätzlich zu all den oben genannten Beiträgen hat hier das Problem für mich gelöst.
Spark verwendet slf4j, um sich an Logger zu binden. Wenn log4j nicht die erste gefundene Bindung ist, können Sie die Dateien log4j.properties nach Belieben bearbeiten. Die Logger werden nicht einmal verwendet. Dies könnte beispielsweise eine mögliche SLF4J-Ausgabe sein:
Hier wurde also die SimpleLoggerFactory verwendet, die sich nicht um die log4j-Einstellungen kümmert.
Ausschluss des slf4j-simple Pakets aus meinem Projekt über
Das Problem wurde behoben, da jetzt die log4j-Logger-Bindung verwendet wird und alle Einstellungen in log4j.properties eingehalten werden. Zu Ihrer Information, meine log4j-Eigenschaftendatei enthält (neben der normalen Konfiguration)
Hoffe das hilft!
quelle
Dieser hat für mich gearbeitet. Damit nur FEHLER-Meldungen als angezeigt werden
stdout
,log4j.properties
sieht die Datei möglicherweise folgendermaßen aus:quelle
Wenn Sie nicht in der Lage sind, den Java-Code zum Einfügen der
.setLogLevel()
Anweisungen zu bearbeiten und noch keine weiteren externen Dateien bereitstellen möchten, können Sie dies mithilfe einer Brute-Force-Methode lösen. Filtern Sie einfach die INFO-Zeilen mit grep heraus.quelle
Wenn jemand anderes daran festhält,
Nichts davon hat bei mir funktioniert. Ich musste entfernen
von meinem build.gradle, damit die Protokolle verschwinden. TLDR: Importieren Sie keine anderen Protokollierungsframeworks. Sie sollten nur diese verwenden
org.apache.log4j.Logger
quelle
Eine andere Möglichkeit, Protokolle vollständig zu stoppen, ist:
Das hat bei mir funktioniert. Ein NullAppender ist
quelle