我想停止那些对火花外壳到来的各种消息。
我尝试过编辑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
如何阻止这些?
Answer 1:
编辑你conf/log4j.properties
文件,并更改以下行:
log4j.rootCategory=INFO, console
至
log4j.rootCategory=ERROR, console
另一种方法是:
开始在下面的火花外壳和类型:
import org.apache.log4j.Logger
import org.apache.log4j.Level
Logger.getLogger("org").setLevel(Level.OFF)
Logger.getLogger("akka").setLevel(Level.OFF)
你不会看到后,任何日志。
对于级别其他选项包括: all
, debug
, error
, fatal
, info
, off
, trace
, trace_int
, warn
关于每个细节可以在文档中找到。
Answer 2:
右键启动后spark-shell
型;
sc.setLogLevel("ERROR")
在星火2.0:
spark = SparkSession.builder.getOrCreate()
spark.sparkContext.setLogLevel("ERROR")
Answer 3:
感谢@AkhlD和@Sachin贾纳尼的建议在变化.conf
文件。
下面的代码解决了我的问题:
1)增加import org.apache.log4j.{Level, Logger}
进口节
2)添加下列行火花上下文对象的创建之后,即后val sc = new SparkContext(conf)
val rootLogger = Logger.getRootLogger()
rootLogger.setLevel(Level.ERROR)
Answer 4:
使用下面的命令来更改日志级别,而使用递交申请火花提交或火花-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
配置文件被存储。
Log4j.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>
如果你想要写日志文件,而不是控制台切换到FileAppender中的log4j.xml。 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>
了解这里另一个重要的事情是,当作业在分布式模式下启动(部署模式集群和主纱或mesos)log4j的配置文件应在驱动程序和工作节点(存在log4j.configuration=file:<file path>/log4j.xml
)其他log4j的init将complain-
log4j的:错误无法读取配置文件[log4j.properties。 java.io.FileNotFoundException:log4j.properties(没有这样的文件或目录)
提示解决这个problem-
保持log4j的配置文件在分布式文件系统(HDFS或mesos),并使用添加外部配置的log4j PropertyConfigurator 。 或使用sparkContext addFile以使其可再使用的log4j PropertyConfigurator重新加载配置每个节点上。
Answer 5:
您可以设置通过如下其级别设置为OFF禁用日志:
Logger.getLogger("org").setLevel(Level.OFF);
Logger.getLogger("akka").setLevel(Level.OFF);
或编辑日志文件,并通过只是改变了以下属性设置日志级别为关:
log4j.rootCategory=OFF, console
Answer 6:
我只是这行添加到我的所有pyspark脚本顶部略低于import语句。
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
我pyspark脚本示例联箱
from pyspark.sql import SparkSession, functions as fs
SparkSession.builder.getOrCreate().sparkContext.setLogLevel("ERROR")
Answer 7:
以上的答案是正确的,但并没有完全帮助我,因为是我所需要的附加信息。
我刚刚建立星火所以log4j的文件仍然有“.template后缀,并没有被读取。 我相信,登录然后默认星火核心日志的conf。
所以,如果你和我一样,发现上面的答案没有帮助,那么也许你也有完美您的log4j的conf文件中删除了“.template后缀,然后上述作品!
http://apache-spark-user-list.1001560.n3.nabble.com/disable-log4j-for-spark-shell-td11278.html
Answer 8:
TL;博士
火花上下文你可以使用:
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
。 使用conf/log4j.properties.template
为出发点。
在星火应用程序设置日志级别
在独立星火应用程序或在星火壳牌会议同时,使用以下命令:
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
参考:由亚采郭先生掌握的火花。
Answer 9:
在Python /星火,我们可以这样做:
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)
Answer 10:
一个有趣的想法是使用RollingAppender如下建议: http://shzhangji.com/blog/2015/05/31/spark-streaming-logging-configuration/让你不“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
Answer 11:
下面简单PARAM添加到您的火花壳或火花提交命令
--conf "spark.driver.extraJavaOptions=-Dlog4jspark.root.logger=WARN,console"
检查从log4j.properties文件确切的属性名(log4jspark.root.logger这里)。 希望这有助于,干杯!
Answer 12:
简单的命令行上做...
spark2-submit --driver-java-options="-Droot.logger=ERROR,console"
..other选项..
Answer 13:
举例收集到的所有方法
介绍
其实, 有很多方法可以做到这一点 。 有些是从别人更难,但它是由你哪一个最适合你的。 我会尽量展示它们。
#1编程方式在您的应用程序
似乎是最简单的,但你将需要重新编译应用程序来更改这些设置。 就个人而言,我不喜欢它,但它工作正常。
例:
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配置文件 ,配置部分]
#2遍log4j.properties
期间spark-submit
这是一个非常棘手,但并非不可能。 而我最喜欢的。
应用程序启动时的Log4J一直在寻找和加载log4j.properties
从类路径文件。
然而,当使用spark-submit
星火集群的类路径中优先于应用程序的类路径! 这就是为什么在你的脂肪-JAR将不会覆盖集群的设置,把这个文件!
添加-Dlog4j.configuration=<location of configuration file>
到spark.driver.extraJavaOptions
(驱动程序)或
spark.executor.extraJavaOptions
(对于执行器)。
请注意,如果使用的文件,该file:
协议应明确规定, 并且该文件需要的所有节点上本地存在 。
为了满足最后一个条件,你可以上传文件的位置可用于节点(如hdfs
)或本地驱动程序访问它,如果使用deploy-mode client
。 除此以外:
上传自定义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
模式。 星火文档,运行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
将可在根目录,所以没有必要添加任何路径file:log4j.properties
。 - 在列出的文件
--files
必须提供绝对路径! -
file:
前缀配置URI是强制性的。
#3编辑集群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覆盖配置目录
如果你喜欢的解决方案#3,但想自定义每个应用程序,你其实可以复制conf
文件夹,编辑内容,并指定为在根配置spark-submit
。
要指定默认值以外不同的配置目录“SPARK_HOME/conf”
,你可以设置SPARK_CONF_DIR
。 星火将使用配置文件( spark-defaults.conf
, spark-env.sh
, log4j.properties
从这个目录, 等等 )。
来源: 星火文档,配置
脚步:
- 复制集群
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"
结论
我不知道是否有任何其他方法,但我希望这涵盖了从一个话题到Z.如果不是,请随时来ping我的意见!
享受你的路!
Answer 14:
- 调整CONF / log4j.properties由其他log4j.rootCategory = ERROR,控制台描述
- 确保在执行您的火花的工作你通过--file国旗log4j.properties文件路径
- 如果仍然不工作,你可能有一个具有正被新log4j.properties之前调用log4j.properties一个罐子。 取下罐子是log4j.properties(如适用)
Answer 15:
sparkContext.setLogLevel("OFF")
Answer 16:
除了上述所有的帖子,这里是解决这个问题对我来说。
星火使用SLF4J绑定到记录器。 如果log4j的是不是第一个绑定发现,你可以编辑log4j.properties文件中的所有你想要的,记录器甚至没有使用。 例如,这可能是一个可能的SLF4J输出:
SLF4J:类路径中包含多个SLF4J绑定。 SLF4J:文件:在[罐子找到绑定/ C:/Users/~/.m2/repository/org/slf4j/slf4j-simple/1.6.6/slf4j-simple-1.6.6.jar /组织/ SLF4J / IMPL / StaticLoggerBinder.class] SLF4J:文件:在[罐子发现结合/ 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,简单的包
<dependency>
...
<exclusions>
...
<exclusion>
<artifactId>slf4j-simple</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
解决了这个问题,像现在使用log4j的记录器结合在log4j.properties任何设置遵守。 FYI我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
希望这可以帮助!
Answer 17:
这一次为我工作。 对于要显示为唯一的错误消息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
,然后继续用上面说的变化。
Answer 18:
如果你没有编辑java代码插入的能力.setLogLevel()
语句,你不想还更多的外部文件来部署,您可以使用蛮力的方式来解决这个问题。 只是筛选出用grep的INFO线。
spark-submit --deploy-mode client --master local <rest-of-cmd> | grep -v -F "INFO"
文章来源: How to stop INFO messages displaying on spark console?