Comment arrêter les messages INFO affichés sur la console à étincelles?

Je voudrais arrêter divers messages qui arrivent sur spark shell.

J’ai essayé de modifier le fichier log4j.properties pour arrêter ces messages.

Voici le contenu de 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 

Mais les messages sont toujours affichés sur la console.

Voici quelques exemples de messages

 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 

Comment puis-je les arrêter?

Modifiez votre fichier conf/log4j.properties et modifiez la ligne suivante:

 log4j.rootCategory=INFO, console 

à

 log4j.rootCategory=ERROR, console 

Une autre approche serait de:

Démarrez spark-shell et tapez ce qui suit:

 import org.apache.log4j.Logger import org.apache.log4j.Level Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) 

Vous ne verrez aucun journal après cela.

Les autres options pour Level incluent: all , debug , error , fatal , info , off , trace , trace_int , warn

Des détails sur chacun d’eux peuvent être trouvés dans la documentation.

Juste après avoir commencé le type à spark-shell ;

 sc.setLogLevel("ERROR") 

Dans Spark 2.0:

 spark = SparkSession.builder.getOrCreate() spark.sparkContext.setLogLevel("ERROR") 

Merci @AkhlD et @Sachin Janani pour avoir suggéré des modifications dans le fichier .conf .

Le code suivant a résolu mon problème:

1) Ajout de la commande import org.apache.log4j.{Level, Logger} dans la section import

2) Ajout de la ligne suivante après la création de l’object contexte spark, c.-à-d. Après val sc = new SparkContext(conf) :

 val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR) 

Vous définissez désactiver les journaux en définissant son niveau sur OFF comme suit:

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

ou modifiez le fichier journal et définissez le niveau de journalisation sur désactivé en modifiant simplement la propriété suivante:

 log4j.rootCategory=OFF, console 

Utilisez la commande ci-dessous pour modifier le niveau de journalisation lors de la soumission de l’application à l’aide de spark-submit ou spark-sql:

 spark-submit \ --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" \ --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/log4j.xml" 

Remarque: remplacez /log4j.xml par le chemin d’access relatif où le fichier log4j.xml (ci-dessous) est stocké.

Log4j.properties:

 log4j.rootLogger=ERROR, console # set the log level for these components log4j.logger.com.test=DEBUG log4j.logger.org=ERROR log4j.logger.org.apache.spark=ERROR log4j.logger.org.spark-project=ERROR log4j.logger.org.apache.hadoop=ERROR log4j.logger.io.netty=ERROR log4j.logger.org.apache.zookeeper=ERROR # add a ConsoleAppender to the logger stdout to write to the console log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout # use a simple message format log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

log4j.xml

                                 

Les réponses ci-dessus sont correctes mais ne m’ont pas aidé car il y avait des informations supplémentaires dont j’avais besoin.

Je viens de configurer Spark pour que le fichier log4j contienne toujours le suffixe ‘.template’ et ne soit pas lu. Je pense que la journalisation par défaut est celle de la journalisation de base Spark.

Donc, si vous êtes comme moi et que vous trouvez que les réponses ci-dessus ne vous ont pas aidé, alors vous devez peut-être supprimer le suffixe ‘.template’ de votre fichier de configuration log4j, et cela fonctionne parfaitement!

http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html

Je viens d’append cette ligne à tous mes scripts pyspark situés juste en dessous des instructions d’importation.

 SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR") 

exemple d’en-tête de mes scripts pyspark

 from pyspark.sql import SparkSession, functions as fs SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR") 

tl; dr

Pour Spark Context, vous pouvez utiliser:

 sc.setLogLevel() 

loglevel peut être ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE ou WARN.


Détails-

En interne, setLogLevel appelle org.apache.log4j.Level.toLevel(logLevel) qu’il utilise ensuite pour définir en utilisant org.apache.log4j.LogManager.getRootLogger().setLevel(level) .

Vous pouvez directement définir les niveaux de journalisation sur OFF utilisant:

 LogManager.getLogger("org").setLevel(Level.OFF) 

Vous pouvez configurer la journalisation par défaut pour le shell Spark dans conf/log4j.properties . Utilisez conf/log4j.properties.template comme sharepoint départ.

Définition des niveaux de journal dans les applications Spark

Dans les applications Spark autonomes ou en session Spark Shell, utilisez les éléments suivants:

 import org.apache.log4j.{Level, Logger} Logger.getLogger(classOf[RackResolver]).getLevel Logger.getLogger("org").setLevel(Level.OFF) Logger.getLogger("akka").setLevel(Level.OFF) 

Désactiver la journalisation (dans log4j):

Utilisez ce qui suit dans conf/log4j.properties pour désactiver complètement la journalisation:

 log4j.logger.org=OFF 

Référence: Mastering Spark par Jacek Laskowski.

En Python / Spark, nous pouvons faire:

 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 ) 

L’après définition Sparkcontaxt ‘sc’ appelle cette fonction par: quiet_logs (sc)

Une idée intéressante est d’utiliser RollingAppender comme suggéré ici: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/ afin de ne pas “poluer” l’espace de la console, mais être toujours en mesure de voir les résultats sous $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.

  log4j.rootLogger=INFO, rolling log4j.appender.rolling=org.apache.log4j.RollingFileAppender log4j.appender.rolling.layout=org.apache.log4j.PatternLayout log4j.appender.rolling.layout.conversionPattern=[%d] %p %m (%c)%n log4j.appender.rolling.maxFileSize=50MB log4j.appender.rolling.maxBackupIndex=5 log4j.appender.rolling.file=$YOUR_LOG_PATH_HERE/${dm.logging.name}.log log4j.appender.rolling.encoding=UTF-8 

Une autre méthode qui résout la cause est d’observer quel type de journalisation vous avez habituellement (provenant de différents modules et dépendances) et de définir pour chacun la granularité de la journalisation, tout en convertissant les journaux tiers “silencieux” trop verbeux:

Par exemple,

  # Silence akka remoting log4j.logger.Remoting=ERROR log4j.logger.akka.event.slf4j=ERROR log4j.logger.org.spark-project.jetty.server=ERROR log4j.logger.org.apache.spark=ERROR log4j.logger.com.anjuke.dm=${dm.logging.level} 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 

Simple à faire sur la ligne de commande …

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..autres options ..

  1. Ajustez conf / log4j.properties comme décrit par d’autres log4j.rootCategory = ERROR, console
  2. Assurez-vous lors de l’exécution de votre job spark que vous passez un indicateur –file avec le chemin du fichier log4j.properties
  3. Si cela ne fonctionne toujours pas, vous pouvez avoir un fichier jar contenant log4j.properties appelé avant votre nouveau fichier log4j.properties. Supprimez ce log4j.properties de jar (le cas échéant)
 sparkContext.setLogLevel("OFF") 

En plus de tous les messages ci-dessus, voici ce qui a résolu le problème pour moi.

Spark utilise slf4j pour se connecter aux enregistreurs. Si log4j n’est pas la première liaison trouvée, vous pouvez éditer les fichiers log4j.properties à volonté, les enregistreurs ne sont même pas utilisés. Par exemple, cela pourrait être une sortie possible de SLF4J:

SLF4J: le chemin de la classe contient plusieurs liaisons SLF4J. SLF4J: liaison trouvée dans [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar! / Org / slf4j / impl / StaticLoggerBinder.class] SLF4J: liaison trouvée dans [jar: file: / C: /Users/~/.m2/repository/org/slf4j/slf4j-log4j12/1.7.19/slf4j-log4j12-1.7.19.jar ! /org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Voir http://www.slf4j.org/codes.html#multiple_bindings pour une explication. SLF4J: la liaison réelle est de type [org.slf4j.impl.SimpleLoggerFactory]

Donc, ici, SimpleLoggerFactory a été utilisé, ce qui ne concerne pas les parameters de log4j.

En excluant le package slf4j-simple de mon projet via

  ...  ...  slf4j-simple org.slf4j    

résolu le problème, car maintenant la liaison logger log4j est utilisée et tout paramètre dans log4j.properties est respecté. FYI mon fichier de propriétés log4j contient (en plus de la configuration normale)

 log4j.rootLogger=WARN, stdout ... log4j.category.org.apache.spark = WARN log4j.category.org.apache.parquet.hadoop.ParquetRecordReader = FATAL log4j.additivity.org.apache.parquet.hadoop.ParquetRecordReader=false log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF 

J’espère que cela t’aides!

Ajoutez simplement le paramètre ci-dessous à votre commande spark-submit

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

Vérifiez le nom exact de la propriété (log4jspark.root.logger ici) à partir du fichier log4j.properties. J’espère que ça aide, bravo!