我想停止火花壳上的各种消息。
我试图编辑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
实际上,有很多方法可以做到这一点。有些人比其他人更难,但是由你决定哪一个最适合你。我会尽力展示它们。
似乎是最简单的,但您需要重新编译您的应用程序才能更改这些设置。就个人而言,我不喜欢它,但它工作正常。
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,配置部分]
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
文件列表中。
示例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"
spark-cluster
上传到--files
的文件将在root目录中提供,因此无需在file:log4j.properties
中添加任何路径。--files
中列出的文件必须提供绝对路径!file:
前缀是必需的。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中的示例),您的所有应用程序都将共享此配置。
如果你喜欢解决方案#3,但想要为每个应用程序自定义它,你可以实际复制conf
文件夹,编辑它的内容并在spark-submit
期间指定为root配置。
要指定除默认
“SPARK_HOME/conf”
之外的其他配置目录,可以设置SPARK_CONF_DIR
。 Spark将使用此目录中的配置文件(spark-defaults.conf
,spark-env.sh
,log4j.properties
等)。
资料来源:Spark docs, Configuration
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"
我不确定是否还有其他方法,但我希望这涵盖从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"
..其他选择..
sparkContext.setLogLevel("OFF")
除了以上所有帖子之外,以下是解决这个问题的方法。
Spark使用slf4j绑定到记录器。如果log4j不是第一个找到的绑定,您可以编辑所有想要的log4j.properties文件,甚至不使用记录器。例如,这可能是一个可能的SLF4J输出:
SLF4J:类路径包含多个SLF4J绑定。 SLF4J:在[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:在[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:有关解释,请参阅http://www.slf4j.org/codes.html#multiple_bindings。 SLF4J:实际绑定的类型为[org.slf4j.impl.SimpleLoggerFactory]
所以这里使用了SimpleLoggerFactory,它不关心log4j设置。
通过我的项目排除slf4j-simple软件包
<dependency>
...
<exclusions>
...
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
解决了这个问题,因为现在使用了log4j logger绑定并且遵守了log4j.properties中的任何设置。 F.Y.I.我的log4j属性文件包含(除正常配置外)
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
希望这可以帮助!
这个对我有用。仅将ERROR消息显示为stdout
,log4j.properties
文件可能如下所示:
# Root logger option
log4j.rootLogger=ERROR, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
注意:将
log4j.properties
文件放在src/main/resources
文件夹中才有效。如果log4j.properties
不存在(意思是spark
正在使用log4j-defaults.properties
文件),那么您可以通过转到SPARK_HOME/conf
然后mv log4j.properties.template log4j.properties
创建它,然后继续上述所述更改。
如果您无法编辑Java代码以插入.setLogLevel()
语句,并且您不希望部署更多外部文件,则可以使用强力方法来解决此问题。只需使用grep过滤出INFO行。
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
在启动spark-shell
类型之后;
sc.setLogLevel("ERROR")
在Spark 2.0中:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
感谢@AkhlD和@Sachin Janani建议更改.conf
文件。
以下代码解决了我的问题:
1)在导入部分添加了import org.apache.log4j.{Level, Logger}
2)在创建spark上下文对象后添加以下行,即在val sc = new SparkContext(conf)
之后:
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
使用spark-submit或spark-sql在提交应用程序时使用以下命令更改日志级别:
spark-submit \
--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml" \
--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:<file path>/log4j.xml"
注意:替换存储<file path>
配置文件的log4j
。
log4就.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
<?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>
如果要将日志写入文件而不是控制台,请在log4j.xml中切换到FileAppender。 LOG_DIR
是日志目录的变量,您可以使用spark-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>
这里要理解的另一个重要事项是,当作业以分布式模式启动时(部署模式集群和master作为yarn或mesos),log4j配置文件应该存在于驱动程序和工作节点(log4j.configuration=file:<file path>/log4j.xml
)上,否则log4j init会抱怨 -
log4j:ERROR无法读取配置文件[log4j.properties]。 java.io.FileNotFoundException:log4j.properties(没有这样的文件或目录)
提示解决这个问题 -
将log4j配置文件保存在分布式文件系统(HDFS或mesos)中,并使用log4j PropertyConfigurator添加外部配置。或者使用sparkContext addFile使其在每个节点上可用,然后使用log4j PropertyConfigurator重新加载配置。
您可以通过将其级别设置为OFF来禁用日志,如下所示:
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
或者通过更改以下属性来编辑日志文件并将日志级别设置为off:
log4j.rootCategory=OFF, console
我只是将这一行添加到导入语句下面的所有pyspark脚本中。
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
我的pyspark脚本的示例标题
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
上面的答案是正确的,但并没有完全帮助我,因为我需要其他信息。
我刚刚设置了Spark,因此log4j文件仍然具有'.template'后缀并且未被读取。我相信日志记录默认为Spark核心日志配置。
所以,如果你像我一样发现上面的答案没有帮助,那么也许你也必须从你的log4j conf文件中删除'.template'后缀,然后上面的工作完美!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
对于Spark Context,您可以使用:
sc.setLogLevel(<logLevel>)
其中
loglevel
可以是ALL,DEBUG,ERROR,FATAL,INFO,OFF,TRACE或WARN。
在内部,setLogLevel
称org.apache.log4j.Level.toLevel(logLevel)
然后使用org.apache.log4j.LogManager.getRootLogger().setLevel(level)
设置。
您可以使用以下命令直接将日志记录级别设置为
OFF
:LogManager.getLogger("org").setLevel(Level.OFF)
您可以在conf/log4j.properties
中设置Spark shell的默认日志记录。使用conf/log4j.properties.template
作为起点。
在独立Spark应用程序中或在Spark Shell会话中,使用以下命令:
import org.apache.log4j.{Level, Logger}
Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
在conf/log4j.properties
中使用以下命令来完全禁用日志记录:
log4j.logger.org=OFF
参考:Jacek Laskowski掌握Spark。
在Python / Spark中我们可以做到:
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 )
定义Sparkcontaxt'sc'之后调用此函数:quiet_logs(sc)