Je voudrais arrêter divers messages qui arrivent sur Spark Shell.
J'ai essayé de modifier le log4j.properties
fichier afin d'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 les arrêter?
apache-spark
log4j
spark-submit
Vishwas
la source
la source
Juste après le début du
spark-shell
type;Dans Spark 2.0 (Scala):
Documents de l'API: https://spark.apache.org/docs/2.2.0/api/scala/index.html#org.apache.spark.sql.SparkSession
Pour Java:
la source
Merci @AkhlD et @Sachin Janani pour avoir suggéré des changements dans le
.conf
fichier.Le code suivant a résolu mon problème:
1) Ajouté
import org.apache.log4j.{Level, Logger}
dans la section d'importation2) Ajout de la ligne suivante après la création de l'objet de contexte Spark c'est à dire après
val sc = new SparkContext(conf)
:la source
Toutes les méthodes recueillies avec des exemples
Intro
En fait, il existe de nombreuses façons de le faire . Certains sont plus difficiles par rapport aux autres, mais c'est à vous de décider lequel vous convient le mieux. Je vais essayer de tous les présenter.
# 1 par programme dans votre application
Cela semble être le plus simple, mais vous devrez recompiler votre application pour modifier ces paramètres. Personnellement, je n'aime pas ça mais ça marche bien.
Exemple:
Vous pouvez réaliser bien plus simplement en utilisant l'
log4j
API.Source: [ Docs de configuration Log4J , section Configuration]
# 2 Passe
log4j.properties
pendantspark-submit
Celui-ci est très délicat, mais pas impossible. Et mon préféré.
Log4J au démarrage de l'application recherche et charge toujours le
log4j.properties
fichier à partir du chemin de classe.Cependant, lorsque vous utilisez
spark-submit
le chemin de classe de Spark Cluster a la priorité sur le chemin de classe de l'application! C'est pourquoi mettre ce fichier dans votre fat-jar ne remplacera pas les paramètres du cluster!Pour satisfaire la dernière condition, vous pouvez soit télécharger le fichier à l'emplacement disponible pour les nœuds (comme
hdfs
), soit y accéder localement avec le pilote si vous utilisezdeploy-mode client
. Autrement:Source: documentation Spark, débogage
Pas:
Exemple
log4j.properties
:Exécution
spark-submit
, pour le mode cluster:Notez que vous devez utiliser
--driver-java-options
si vous utilisezclient
mode. Documents Spark, environnement d'exécutionExécution
spark-submit
, pour le mode client:Remarques:
spark-cluster
avec--files
seront disponibles dans le répertoire racine, il n'est donc pas nécessaire d'ajouter un chemin dansfile:log4j.properties
.--files
doivent être fournis avec un chemin absolu!file:
le préfixe dans l'URI de configuration est obligatoire.# 3 Modifier les clusters
conf/log4j.properties
Cela modifie le fichier de configuration de la journalisation globale .
Source: documentation Spark, débogage
Pour trouver votre,
SPARK_CONF_DIR
vous pouvez utiliserspark-shell
:Maintenant, modifiez simplement
/var/lib/spark/latest/conf/log4j.properties
(avec l'exemple de la méthode n ° 2) et toutes vos applications partageront cette configuration.# 4 Remplacer le répertoire de configuration
Si vous aimez la solution n ° 3, mais que vous souhaitez la personnaliser par application, vous pouvez en fait copier le
conf
dossier, en modifier le contenu et le spécifier comme configuration racine pendantspark-submit
.Source: documentation Spark, configuration
Pas:
conf
dossier du cluster (plus d'informations, méthode n ° 3)log4j.properties
dans ce dossier (exemple dans la méthode n ° 2)Définissez
SPARK_CONF_DIR
ce dossier, avant d'exécuterspark-submit
, parexemple:
Conclusion
Je ne sais pas s'il existe une autre méthode, mais j'espère que cela couvre le sujet de A à Z. Sinon, n'hésitez pas à me cingler dans les commentaires!
Profitez de votre chemin!
la source
Utilisez la commande ci-dessous pour modifier le niveau de journal lors de la soumission de l'application à l'aide de spark-submit ou spark-sql:
Remarque: remplacez l'
<file path>
emplacement delog4j
stockage du fichier de configuration.Log4j.properties:
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <logger name="org.apache.spark"> <level value="error" /> </logger> <logger name="org.spark-project"> <level value="error" /> </logger> <logger name="org.apache.hadoop"> <level value="error" /> </logger> <logger name="io.netty"> <level value="error" /> </logger> <logger name="org.apache.zookeeper"> <level value="error" /> </logger> <logger name="org"> <level value="error" /> </logger> <root> <priority value ="ERROR" /> <appender-ref ref="console" /> </root> </log4j:configuration>
Basculez vers FileAppender dans log4j.xml si vous souhaitez écrire des journaux dans un fichier au lieu de la console.
LOG_DIR
est une variable pour le répertoire des journaux que vous pouvez fournir en utilisantspark-submit --conf "spark.driver.extraJavaOptions=-D
.<appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> <param name="file" value="${LOG_DIR}"/> <param name="datePattern" value="'.'yyyy-MM-dd"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %c %x - %m%n"/> </layout> </appender>
Une autre chose importante à comprendre ici est que lorsque le travail est lancé en mode distribué (cluster en mode déploiement et maître en tant que fil ou mesos), le fichier de configuration log4j doit exister sur les nœuds pilote et worker (
log4j.configuration=file:<file path>/log4j.xml
) sinon log4j init se plaindra-Astuce pour résoudre ce problème
Conservez le fichier de configuration log4j dans le système de fichiers distribué (HDFS ou mesos) et ajoutez une configuration externe à l'aide de log4j PropertyConfigurator . ou utilisez sparkContext addFile pour le rendre disponible sur chaque nœud, puis utilisez log4j PropertyConfigurator pour recharger la configuration.
la source
org
journaux qui proviennent traditionnellement de l'enregistreur par défaut.Log4j.properties
fichier? Cela ne semble pas être utilisé. Documentez-vous simplement les propriétés définies dans le fichier XML?--files
dans la commande spark-submit pour rendre log4j.properties disponible sur tous les nœuds.Log4.properties
sousmain/resources
au cas où il n'existerait pasVous définissez désactiver les journaux en définissant son niveau sur OFF comme suit:
ou modifiez le fichier journal et désactivez le niveau de journalisation en modifiant simplement la propriété suivante:
la source
J'ajoute simplement cette ligne à tous mes scripts pyspark en haut juste en dessous des instructions d'importation.
exemple d'en-tête de mes scripts pyspark
la source
Les réponses ci-dessus sont correctes mais ne m'ont pas vraiment aidé car j'avais besoin d'informations supplémentaires.
Je viens de configurer Spark pour que le fichier log4j ait toujours le suffixe «.template» et ne soit pas lu. Je crois que la journalisation est ensuite définie par défaut sur Spark core logging conf.
Donc, si vous êtes comme moi et trouvez que les réponses ci-dessus n'ont pas aidé, alors peut-être que vous devez aussi supprimer le suffixe '.template' de votre fichier de configuration log4j et que ce qui précède fonctionne parfaitement!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
la source
En Python / Spark, nous pouvons faire:
Après avoir défini Sparkcontaxt 'sc', appelez cette fonction par: quiet_logs (sc)
la source
tl; dr
Détails-
En interne,
setLogLevel
appelsorg.apache.log4j.Level.toLevel(logLevel)
qu'il utilise ensuite pour définir en utilisantorg.apache.log4j.LogManager.getRootLogger().setLevel(level)
.Vous pouvez configurer la journalisation par défaut pour Spark Shell dans
conf/log4j.properties
. Utilisezconf/log4j.properties.template
comme point de départ.Définition des niveaux de journal dans les applications Spark
Dans les applications Spark autonomes ou pendant la session Spark Shell, utilisez ce qui suit:
Désactivation de la journalisation (dans log4j):
Utilisez ce qui suit
conf/log4j.properties
pour désactiver complètement la journalisation:Référence: Mastering Spark par Jacek Laskowski.
la source
Ajoutez simplement le paramètre ci-dessous à votre commande spark-shell OU spark-submit
Vérifiez le nom exact de la propriété (log4jspark.root.logger ici) dans le fichier log4j.properties. J'espère que cela aide, bravo!
la source
Simple à faire sur la ligne de commande ...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..autres options..la source
spark2-submit
?Une idée intéressante est d'utiliser le 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 toujours être en mesure de voir les résultats sous $ YOUR_LOG_PATH_HERE / $ {dm.logging.name} .log.
Une autre méthode qui résout la cause est d'observer le type de journalisation que vous avez habituellement (provenant de différents modules et dépendances), et de définir pour chacun la granularité de la journalisation, tout en transformant les journaux tiers "silencieux" qui sont trop détaillés:
Par exemple,
la source
la source
la source
val rootLogger = Logger.getRootLogger() rootLogger.setLevel(Level.ERROR)
cela a fonctionnéEn plus de tous les articles ci-dessus, voici ce qui a résolu le problème pour moi.
Spark utilise slf4j pour se lier aux enregistreurs. Si log4j n'est pas la première liaison trouvée, vous pouvez éditer les fichiers log4j.properties autant que vous le souhaitez, les enregistreurs ne sont même pas utilisés. Par exemple, cela pourrait être une sortie SLF4J possible:
Donc, ici, SimpleLoggerFactory a été utilisé, qui ne se soucie pas des paramètres de log4j.
Exclure le package slf4j-simple de mon projet via
a résolu le problème, car maintenant la liaison de journalisation log4j est utilisée et tout paramètre de log4j.properties est respecté. FYI mon fichier de propriétés log4j contient (en plus de la configuration normale)
J'espère que cela t'aides!
la source
Celui-ci a fonctionné pour moi. Pour que seuls les messages d'ERREUR soient affichés comme
stdout
, lelog4j.properties
fichier peut ressembler à:la source
Si vous n'avez pas la possibilité de modifier le code java pour insérer les
.setLogLevel()
instructions et que vous ne voulez pas encore déployer plus de fichiers externes, vous pouvez utiliser un moyen de force brute pour résoudre ce problème. Filtrez simplement les lignes INFO en utilisant grep.la source
Si quelqu'un d'autre est coincé là-dessus,
rien de ce qui précède n'a fonctionné pour moi. Je devais supprimer
de mon build.gradle pour que les journaux disparaissent. TLDR: N'importez aucun autre framework de journalisation, vous devriez être bien en utilisant
org.apache.log4j.Logger
la source
Une autre façon d'arrêter complètement les journaux est:
Cela a fonctionné pour moi. Un NullAppender est
la source