如何停止在火花控制台上显示INFO消息?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何停止在火花控制台上显示INFO消息?相关的知识,希望对你有一定的参考价值。

我想停止火花壳上的各种消息。

我试图编辑log4j.properties文件以阻止这些消息。

以下是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

但是消息仍在控制台上显示。

以下是一些示例消息

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

我该如何阻止这些?

答案

编辑您的conf/log4j.properties文件并更改以下行:

log4j.rootCategory=INFO, console

log4j.rootCategory=ERROR, console

另一种方法是:

启动spark-shell并输入以下内容:

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

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

之后你不会看到任何日志。

Level的其他选项包括:alldebugerrorfatalinfoofftracetrace_intwarn

Details about each can be found in the documentation.

另一答案

All the methods collected with examples

Intro

实际上,有很多方法可以做到这一点。有些人比其他人更难,但是由你决定哪一个最适合你。我会尽力展示它们。


#1 Programatically in your app

似乎是最简单的,但您需要重新编译您的应用程序才能更改这些设置。就个人而言,我不喜欢它,但它工作正常。

Example:

import org.apache.log4j.{Level, Logger}

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

Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)

只需使用log4j API即可实现更多功能。 资料来源:[Log4J Configuration Docs,配置部分]


#2 Pass log4j.properties during spark-submit

这个非常棘手,但并非不可能。而我最喜欢的。

应用程序启动期间的Log4J始终在查找并从类路径加载log4j.properties文件。

但是,使用spark-submit时,Spark Cluster的类路径优先于app的类路径!这就是为什么把这个文件放在你的fat-jar中不会覆盖集群的设置!

-Dlog4j.configuration=<location of configuration file>添加到spark.driver.extraJavaOptions(为司机)或 spark.executor.extraJavaOptions(执行人)。

请注意,如果使用文件,则应明确提供file:协议,并且该文件需要在所有节点上本地存在。

要满足最后一个条件,您可以将文件上传到节点可用的位置(如hdfs),或者如果使用deploy-mode client则使用驱动程序在本地访问它。除此以外:

使用spark-submit上传自定义log4j.properties,将其添加到要与应用程序一起上传的--files文件列表中。

资料来源:Spark docs, Debugging

Steps:

示例log4j.properties

# Blacklist all to warn level
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

# Whitelist our app to info :)
log4j.logger.com.github.atais=INFO

执行spark-submit,用于集群模式:

spark-submit 
    --master yarn 
    --deploy-mode cluster 
    --conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" 
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" 
    --files "/absolute/path/to/your/log4j.properties" 
    --class com.github.atais.Main 
    "SparkApp.jar"

请注意,如果使用--driver-java-options模式,则必须使用clientSpark docs, Runtime env

执行spark-submit,用于客户端模式:

spark-submit 
    --master yarn 
    --deploy-mode cluster 
    --driver-java-options "-Dlog4j.configuration=file:/absolute/path/to/your/log4j.properties 
    --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:log4j.properties" 
    --files "/absolute/path/to/your/log4j.properties" 
    --class com.github.atais.Main 
    "SparkApp.jar"

Notes:

  1. 使用spark-cluster上传到--files的文件将在root目录中提供,因此无需在file:log4j.properties中添加任何路径。
  2. --files中列出的文件必须提供绝对路径!
  3. 配置URI中的file:前缀是必需的。

#3 Edit cluster's conf/log4j.properties

这会更改全局日志配置文件。

更新$SPARK_CONF_DIR/log4j.properties文件,它将与其他配置一起自动上传。

资料来源:Spark docs, Debugging

要找到你的SPARK_CONF_DIR,你可以使用spark-shell

atais@cluster:~$ spark-shell 
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _ / _ / _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_   version 2.1.1
      /_/   

scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf

现在只需编辑/var/lib/spark/latest/conf/log4j.properties(使用方法#2中的示例),您的所有应用程序都将共享此配置。


#4 Override configuration directory

如果你喜欢解决方案#3,但想要为每个应用程序自定义它,你可以实际复制conf文件夹,编辑它的内容并在spark-submit期间指定为root配置。

要指定除默认“SPARK_HOME/conf”之外的其他配置目录,可以设置SPARK_CONF_DIR。 Spark将使用此目录中的配置文件(spark-defaults.confspark-env.shlog4j.properties等)。

资料来源:Spark docs, Configuration

Steps:

  1. 复制群集的conf文件夹(更多信息,方法#3)
  2. 在该文件夹中编辑log4j.properties(方法#2中的示例)
  3. 在执行SPARK_CONF_DIR之前,将spark-submit设置为此文件夹, 例: export SPARK_CONF_DIR=/absolute/path/to/custom/conf spark-submit --master yarn --deploy-mode cluster --class com.github.atais.Main "SparkApp.jar"

Conclusion

我不确定是否还有其他方法,但我希望这涵盖从A到Z的主题。如果没有,请随时在评论中ping我!

享受你的方式!

另一答案

一个有趣的想法是使用这里建议的RollingAppender:http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/,这样你就不会“控制”控制台空间,但仍然能够在$ 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

解决问题的另一种方法是观察您通常具有哪种记录(来自不同的模块和依赖项),并为每个记录的粒度设置,同时转换过于冗长的“安静”第三方日志:

例如,

    # 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
另一答案

只需在您的spark-shell OR spark-submit命令中添加以下参数即可

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

从log4j.properties文件中检查确切的属性名称(log4jspark.root.logger)。希望这会有所帮助,欢呼!

另一答案

在命令行上很简单......

spark2-submit --driver-java-options="-Droot.logger=ERROR,console" ..其他选择..