PySpark日志记录?

36
我希望我的用Python编写的Spark驱动程序能够输出一些基本的日志信息,现在我看到有三种方法可以实现:
  1. 使用PySpark py4j桥接获取Spark使用的Java log4j日志记录工具。

log4jLogger = sc._jvm.org.apache.log4j LOGGER = log4jLogger.LogManager.getLogger(__name__) LOGGER.info("pyspark脚本日志记录器已初始化")

  1. 直接使用标准的控制台打印。

  2. 使用 Python 标准库模块 logging。这似乎是理想和最符合 Python 规范的方法,但至少在默认情况下,它不起作用,日志消息似乎无法被恢复。当然,可以将其配置为记录到py4j->log4j和/或控制台。

因此,官方编程指南 (https://spark.apache.org/docs/1.6.1/programming-guide.html) 并没有提及日志记录。这令人失望。应该有标准的文档推荐方式从 Spark 驱动程序中记录日志。

我搜索了这个问题,并找到了这篇文章: How do I log from my Python Spark script

但是,该主题的内容令人不满意。

具体而言,我有以下问题:

  • 我是否遗漏了从 PySpark 驱动程序中记录日志的标准方式?
  • 记录到 py4j->log4j 与控制台相比,有哪些优缺点?

2
你有没有得到这个问题的答案?在我看来,1是唯一的解决方案。2对我没用(我很惊讶)。看了你链接的另一个问题,我认为 logging.getLogger('py4j') 不起作用,因为 py4j 不使用 log4j 记录器,而是使用 java.utils.logger。 - dragonx
1
我得出的结论是,Spark基本上不打算让自定义Spark作业自己记录日志。通常,您编写一个驱动程序来编码相当简单的工作流程,而Spark本身则承担了大部分工作,并提供各种监视和诊断工具供使用。 - clay
1
你是将你的 .py 提交到集群还是独立机器?你想要记录每个工作进程的事件还是仅在客户端记录? - Jocer
4个回答

6

更加简洁的解决方案是使用标准的Python日志模块,并使用自定义分布式处理程序从Spark集群的所有节点收集日志消息。

请参阅此Gist中的"PySpark日志记录"


1
忘了提一下:这是如何完成的示例 https://github.com/zillow/sqs-log4j-handler - user1944010
当然,你可以使用同样的技巧将消息转发到 Spark 下的 log4j: https://gist.github.com/thsutton/65f0ec3cf132495ef91dc22b9bc38aec - user156548

0

似乎没有一种标准的方法可以从PySpark驱动程序记录日志,但是建议通过PySpark py4j桥使用log4j工具。将日志记录到控制台很简单,但log4j提供了更高级的日志记录功能,并且被Spark使用。您还可以设置它同时记录到两个位置,这对于调试非常有帮助。


0
下面是我在Azure Databricks上使用的pyspark日志记录的一个工作示例。
import logging

# Initializing Logging  
logging.basicConfig(filename=os.path.join(outdest+f'your_program_name_{daydate}_{Weekno}.log'),format=">{%(asctime)s} [TID:%(thread)d]  -%(threadName)s- (%(name)s) [%(funcName)s():%(lineno)s] >>%(levelname)s: %(message)s", datefmt='%d-%b-%y %H:%M:%S', filemode = 'w+',force=True, level=logging.DEBUG)
logging.getLogger("py4j").setLevel(logging.ERROR)
logger=logging.getLogger(f'your_program_name_{daydate}_{Weekno}')
logger.setLevel(logging.DEBUG)
logging.captureWarnings(True)
logger.info("********************************Execution started**************************************")

-2
在我的Python开发环境中(单机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 脚本来运行该程序。


2
如果您对此进行-1操作,最好在评论中说明原因...如果这是不合适的答案,那么我会将其删除。 - Ytsen de Boer
你的意思是在集群上的多台机器上吗?OP询问如何从驱动程序记录日志。不要使用此设置来记录集群上的日志。 - Ytsen de Boer
找不到与记录器 __FILE__ 匹配的处理程序。 - hoaphumanoid
你应该去掉撇号。现在它将寻找一个确切名称为该字符串的记录器。也许还可以尝试用小写的“name”替换“FILE”(虽然不确定是否有影响)。 - Ytsen de Boer
@YtsendeBoer能否解释一下您所说的“不要在集群上使用此设置”是什么意思?该问题是与Spark有关的。如果您想记录转储到Hive的数据框架,这是否是一个好的解决方案,还是因为并行性而不是一个好的解决方案? - monkey intern
是的,只有在同一台机器上完成所有操作才有效。在开发阶段进行调试非常有用。 - Ytsen de Boer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接