如何停止在火花控制台上显示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的其他选项包括:all
,debug
,error
,fatal
,info
,off
,trace
,trace_int
,warn
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
文件列表中。
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
模式,则必须使用client
。 Spark 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:
- 使用
spark-cluster
上传到--files
的文件将在root目录中提供,因此无需在file:log4j.properties
中添加任何路径。 --files
中列出的文件必须提供绝对路径!- 配置URI中的
file:
前缀是必需的。
#3 Edit cluster's conf/log4j.properties
这会更改全局日志配置文件。
更新
$SPARK_CONF_DIR/log4j.properties
文件,它将与其他配置一起自动上传。
要找到你的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.conf
,spark-env.sh
,log4j.properties
等)。
资料来源:Spark docs, Configuration
Steps:
- 复制群集的
conf
文件夹(更多信息,方法#3) - 在该文件夹中编辑
log4j.properties
(方法#2中的示例) - 在执行
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"
..其他选择..