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

How to turn off INFO from logs in PySpark with no changes to log4j.properties?

我在一个集群中工作,我无权更改文件 log4j.properties 以在使用 pyspark 时停止信息记录(如第一个答案 here 中所述)以下解决方案如上述问题的第一个答案中所述,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 中详细打印信息?

来自 :

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

对我有用。这基本上就是在 PySpark's own tests:

中完成的方式
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)

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

Control our logLevel. This overrides any user-defined log settings. Valid log levels include: ALL, DEBUG, ERROR, FATAL, INFO, OFF, TRACE, WARN

这对我有帮助:

import logging
s_logger = logging.getLogger('py4j.java_gateway')
s_logger.setLevel(logging.ERROR)
spark_context = SparkContext()