PySpark Logging?

Я хочу, чтобы моя программа драйвера Spark, написанная на Python, выводила некоторую базовую информацию о протоколировании. Есть три способа сделать это:

  1. Использование моста PySpark py4j для получения доступа к средству ведения журнала Java log4j, используемому Spark.

log4jLogger = sc._jvm.org.apache.log4j LOGGER = log4jLogger.LogManager.getLogger(__name__) LOGGER.info("pyspark script logger initialized")

  1. Просто используйте стандартную консольную печать.

  2. logging стандартной библиотеки Python. Это кажется идеальным и наиболее питонским подходом, однако, по крайней мере из коробки, он не работает, и зарегистрированные сообщения не кажутся восстанавливаемыми. Конечно, это можно настроить для входа в систему py4j-> log4j и/или в консоль.

Итак, официальное руководство по программированию (https://spark.apache.org/docs/1.6.1/programming-guide.html) вообще не упоминает ведение журнала. Это разочаровывает. Должен быть стандартный документированный рекомендуемый способ входа из программы драйвера Spark.

искал эту проблему и обнаружил следующее: как мне войти из моего скрипта Python Spark

Но содержание этой темы было неудовлетворительным.

В частности, у меня есть следующие вопросы:

  • Я скучаю по стандартному способу входа из программы драйвера PySpark?
  • Есть ли плюсы/минусы при входе в py4j-> log4j против консоли?

Ответ 1

Более чистое решение состоит в том, чтобы использовать стандартный модуль регистрации Python с настраиваемым распределенным обработчиком для сбора сообщений журнала со всех узлов искрового кластера.

См. "Вход в PySpark" этой Gist.

Ответ 2

В моей среде python dev (установка одиночной машины Spark) я использую это:

import logging


def do_my_logging(log_msg):

    logger = logging.getLogger('__FILE__')
    logger.warning('log_msg = {}'.format(log_msg))

do_my_logging('Some log message')

который работает с использованием spark-submit script.