Как программно получить уровень логов в Pyspark - PullRequest
0 голосов
/ 12 марта 2020

Мне нужно знать программно в Pyspark, который является уровнем журнала.

Я знаю, что могу установить его, выполнив:

# spark is a SparkSession object
spark.sparkContext.setLogLevel(log_level)

Но не существует эквивалентного метода для получения уровня журнала.

Есть идеи? Спасибо!

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Я наконец-то нашел решение, получив доступ к JVM сеанса Spark (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

Скорее всего, есть лучший способ сделать это.

0 голосов
/ 12 марта 2020

Spark - это Open Source, верно?
Исходный код покажет вам много вещей, которых нет в документации. И модульные тесты дадут вам подсказки о вещах, не описанных в руководствах.

Демо : просмотрите проект Spark на Github и выполните поиск setLogLevel.

ОК, внутренний поиск в Github обычно отстой, но по одному указанному c ключевому слову стоит попробовать. И действительно, самый первый ответ дает вам этот интересный фрагмент из модульного теста (здесь сброс до ветки 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 представляется (очень) тонкой оболочкой для API Log4J.

И это именно то:

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)
}
...