Apache spark 如何停止spark控制台上显示的信息消息?
我想停止spark shell上出现的各种消息 我试图编辑Apache spark 如何停止spark控制台上显示的信息消息?,apache-spark,log4j,spark-submit,Apache Spark,Log4j,Spark Submit,我想停止spark shell上出现的各种消息 我试图编辑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 l
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
如何停止这些操作?您可以通过将日志级别设置为OFF来禁用日志,如下所示:
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
或编辑日志文件,只需更改以下属性即可将日志级别设置为“关闭”:
log4j.rootCategory=OFF, console
编辑
conf/log4j.properties文件并更改以下行:
log4j.rootCategory=INFO, 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)
import org.apache.log4j.{Level, Logger}
Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
之后你就看不到任何日志了
级别的其他选项包括:所有
,调试
,错误
,致命
,信息
,关闭
,跟踪
,警告
以上答案是正确的,但对我没有帮助,因为我需要更多的信息
我刚刚设置了Spark,所以log4j文件仍然有“.template”后缀,并且没有被读取。我认为日志记录默认为Spark core logging conf
因此,如果你像我一样,发现上面的答案没有帮助,那么也许你也必须从log4j conf文件中删除“.template”后缀,然后上面的工作就完美了
一个有趣的想法是使用此处建议的RollingAppender:
这样,您就不会“polute”控制台空间,但仍然能够在$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
感谢@AkhlD和@Sachin Janani建议对.conf
文件进行更改
以下代码解决了我的问题:
1) 在导入部分添加了import org.apache.log4j.{Level,Logger}
2) 在创建spark上下文对象后添加了以下行,即在val sc=new SparkContext(conf)
之后:
按照其他说明调整conf/log4j.properties
log4j.rootCategory=错误,控制台
确保在执行spark作业时传递--file标志和log4j.properties文件路径
如果它仍然不起作用,您可能有一个包含log4j.properties的jar,该jar在您的新log4j.properties之前被调用。从jar中删除log4j.properties(如果合适)
在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)type
sc.setLogLevel("ERROR")
在Spark 2.0(Scala)中:
API文档:
对于Java:
spark = SparkSession.builder.getOrCreate();
spark.sparkContext().setLogLevel("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"
log4j.xml
tl;博士
对于Spark上下文,您可以使用:
sc.setLogLevel(<logLevel>)
您可以在conf/log4j.properties
中设置Spark shell的默认日志记录。使用conf/log4j.properties.template
作为起点
在Spark应用程序中设置日志级别
在独立Spark应用程序中或在Spark Shell会话中,使用以下命令:
import org.apache.log4j.Logger
import org.apache.log4j.Level
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
import org.apache.log4j.{Level, Logger}
Logger.getLogger(classOf[RackResolver]).getLevel
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
禁用日志记录(在log4j中):
在conf/log4j.properties
中使用以下命令完全禁用日志记录:
log4j.logger.org=OFF
参考:Jacek Laskowski的Mastering Spark。在命令行上操作简单
spark2 submit--driver java options=“-Droot.logger=ERROR,console”
。其他选项..除了上面所有的帖子,下面是我解决问题的方法
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:有关说明,请参阅。
SLF4J:实际绑定的类型为[org.SLF4J.impl.SimpleLoggerFactory]
所以这里使用的是SimpleLogerFactory,它不关心log4j的设置
通过从我的项目中排除slf4j简单包
<dependency>
...
<exclusions>
...
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
希望这有帮助 我只是将这一行添加到import语句下方的所有pyspark脚本中
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
pyspark脚本的示例头
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
只需将以下参数添加到spark shell或spark submit命令中即可
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
从log4j.properties文件中检查确切的属性名称(此处为log4jspark.root.logger)。
希望这有帮助,干杯 这个对我很有用。
对于仅显示为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()
语句,并且不需要更多的外部
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
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
# 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
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
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)
# 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 \
--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"
spark-submit \
--master yarn \
--deploy-mode client \
--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"
atais@cluster:~$ spark-shell
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/___/ .__/\_,_/_/ /_/\_\ version 2.1.1
/_/
scala> System.getenv("SPARK_CONF_DIR")
res0: String = /var/lib/spark/latest/conf
export SPARK_CONF_DIR=/absolute/path/to/custom/conf
spark-submit \
--master yarn \
--deploy-mode cluster \
--class com.github.atais.Main \
"SparkApp.jar"
implementation group: "ch.qos.logback", name: "logback-classic", version: "1.2.3"
implementation group: 'com.typesafe.scala-logging', name: "scala-logging_$scalaVersion", version: '3.9.2'
import org.apache.log4j.Appender;
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.varia.NullAppender;
public class SomeClass {
public static void main(String[] args) {
Appender nullAppender = new NullAppender();
BasicConfigurator.configure(nullAppender);
{...more code here...}
}
}
self.spark.sparkContext.setLogLevel("ERROR")