如何在不更改log4j.properties文件的情况下关闭PySpark日志中的INFO信息?

18

我在一个集群中工作,没有权限更改log4j.properties文件,以便在使用pyspark时停止信息日志记录(如第一个答案这里所述)。以下解决方案如上述问题的第一篇答案中对spark-shell(scala)进行了说明。

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

但对于使用Python的Spark(即Pyspark),它既无法工作,也无法以下操作。

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

我如何在不更改log4j.properties文件的情况下停止pyspark中信息的冗长打印?

3个回答

22

我使用sc.setLogLevel("ERROR"),因为我没有写入我们集群的log4j.properties文件的访问权限。来自文档

控制我们的日志级别。这会覆盖任何用户定义的日志设置。有效的日志级别包括:ALL、DEBUG、ERROR、FATAL、INFO、OFF、TRACE、WARN


9
这似乎并没有影响我的执行者日志记录。 - Taylor D. Edmiston
2
尝试过这个方法,但似乎无法禁用log4j日志记录,即使我将日志级别设置为“OFF”,仍然会看到类似以下内容的信息:Caused by: java.util.NoSuchElementException: None.get at scala.None$.get(Option.scala:347) at scala.None$.get(Option.scala:345) - seiya
@GalenLong 我使用Python 3.4的pyspark。我使用的是Scala实现的dataframe,这就是为什么我看到了这些Scala日志数据。 - seiya
3
对我来说没有影响。 - lfk
1
不起作用。这似乎不是正确的答案。 - James Madison
显示剩余2条评论

6
这对我有帮助:
import logging
s_logger = logging.getLogger('py4j.java_gateway')
s_logger.setLevel(logging.ERROR)
spark_context = SparkContext()   

4

来自https://dev59.com/F18e5IYBdhLWcg3w7-Nz#32208445

logger = sc._jvm.org.apache.log4j
logger.LogManager.getLogger("org").setLevel( logger.Level.OFF )
logger.LogManager.getLogger("akka").setLevel( logger.Level.OFF )

这对我来说很管用。这基本上是在PySpark自己的测试中完成的方法:

class QuietTest(object):
    def __init__(self, sc):
        self.log4j = sc._jvm.org.apache.log4j

    def __enter__(self):
        self.old_level = self.log4j.LogManager.getRootLogger().getLevel()
self.log4j.LogManager.getRootLogger().setLevel(self.log4j.Level.FATAL)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接