Ответ 1
Более чистое решение состоит в том, чтобы использовать стандартный модуль регистрации Python с настраиваемым распределенным обработчиком для сбора сообщений журнала со всех узлов искрового кластера.
Я хочу, чтобы моя программа драйвера Spark, написанная на Python, выводила некоторую базовую информацию о протоколировании. Есть три способа сделать это:
log4jLogger = sc._jvm.org.apache.log4j LOGGER = log4jLogger.LogManager.getLogger(__name__) LOGGER.info("pyspark script logger initialized")
Просто используйте стандартную консольную печать.
logging
стандартной библиотеки Python. Это кажется идеальным и наиболее питонским подходом, однако, по крайней мере из коробки, он не работает, и зарегистрированные сообщения не кажутся восстанавливаемыми. Конечно, это можно настроить для входа в систему py4j-> log4j и/или в консоль.
Итак, официальное руководство по программированию (https://spark.apache.org/docs/1.6.1/programming-guide.html) вообще не упоминает ведение журнала. Это разочаровывает. Должен быть стандартный документированный рекомендуемый способ входа из программы драйвера Spark.
искал эту проблему и обнаружил следующее: как мне войти из моего скрипта Python Spark
Но содержание этой темы было неудовлетворительным.
В частности, у меня есть следующие вопросы:
Более чистое решение состоит в том, чтобы использовать стандартный модуль регистрации Python с настраиваемым распределенным обработчиком для сбора сообщений журнала со всех узлов искрового кластера.
В моей среде 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.