我需要知道,在Pyspark中编程,这是日志级别。
我知道我可以设定,通过做:
# spark is a SparkSession object
spark.sparkContext.setLogLevel(log_level)
但是,没有一种等效的方法来检索日志级别。
有什么想法吗?谢谢!
我需要知道,在Pyspark中编程,这是日志级别。
我知道我可以设定,通过做:
# spark is a SparkSession object
spark.sparkContext.setLogLevel(log_level)
但是,没有一种等效的方法来检索日志级别。
有什么想法吗?谢谢!
通过访问Spark会话的JVM(下面是py4j),我终于想出了一个解决方案:
def get_log_level(spark):
log_manager = spark._jvm.org.apache.log4j.LogManager
trace = spark._jvm.org.apache.log4j.Level.TRACE
debug = spark._jvm.org.apache.log4j.Level.DEBUG
info = spark._jvm.org.apache.log4j.Level.INFO
warn = spark._jvm.org.apache.log4j.Level.WARN
error = spark._jvm.org.apache.log4j.Level.ERROR
fatal = spark._jvm.org.apache.log4j.Level.FATAL
logger = log_manager.getRootLogger()
if logger.isEnabledFor(trace):
return "TRACE"
elif logger.isEnabledFor(debug):
return "DEBUG"
elif logger.isEnabledFor(info):
return "INFO"
elif logger.isEnabledFor(warn):
return "WARN"
elif logger.isEnabledFor(error):
return "ERROR"
elif logger.isEnabledFor(fatal):
return "FATAL"
else:
return None
很可能有更好的方法。
Spark是开源的,对吧?
演示:在Github上浏览Spark项目并搜索setLogLevel。
好吧,Github的内部搜索通常很糟糕,但是对于一个特定的关 key字,它值得一试。实际上,第一个答案给了你这个有趣的片段,来自单元 test(这里重置为分支2.4):
https://github.com/apache/spark/blob/branch-2.4/sql/hive-thriftserver/src/test/scala/org/apache/spark/sql/hive/HiveMetastoreLazyInitializationSuite.scala
val originalLevel = org.apache.log4j.Logger.getRootLogger().getLevel
try {
// Avoid outputting a lot of expected warning logs
spark.sparkContext.setLogLevel("error")
...
} finally {
spark.sparkContext.setLogLevel(originalLevel.toString)
...
}
因此setLogLevel方法似乎是Log4J API的一个(非常)薄的包装器。
这正是:
https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/SparkContext.scala网站
def setLogLevel(logLevel: String) {
...
Utils.setLogLevel(org.apache.log4j.Level.toLevel(upperCased))
}
https://github.com/apache/spark/blob/branch-2.4/core/src/main/scala/org/apache/spark/util/Utils.scala
def setLogLevel(l: org.apache.log4j.Level) {
org.apache.log4j.Logger.getRootLogger().setLevel(l)
}