我用spark-submit
运行了一个Python Spark程序,我想在里面放一些日志记录语句。
logging.info("This is an informative message.")
logging.debug("This is a debug message.")
我想使用Spark正在使用的日志记录器,这样日志消息就可以以相同的格式输出,并且级别由相同的配置文件控制。
我试过将logging
语句放入代码中,并从logging.getLogger()
开始。在这两种情况下,我都看到了Spark的日志消息,但没有我的。我一直在查看Python logging documentation,但还没有能够从那里弄清楚它。
不确定这是特定于提交给Spark的脚本的东西,还是只是我不了解日志记录是如何工作的。
8条答案
按热度按时间sf6xfgos1#
您可以从SparkContext对象获取记录器:
uqxowvwt2#
你需要得到spark本身的日志记录器,默认情况下
getLogger()
会返回你自己模块的日志记录器。它也可能是
'pyspark'
而不是'py4j'
。如果你在spark程序中使用的函数(它做一些日志记录)和主函数定义在同一个模块中,那么它会产生一些序列化错误。
这在here中进行了说明,并且给出了同一人的示例here
我还在spark 1.3.1上测试了这个
编辑:
要将日志记录从
STDERR
更改为STDOUT
,您必须删除当前的StreamHandler
并添加一个新的。查找现有的流处理程序(完成后可以删除此行)
可能只会有一个单一的,但如果没有,你将不得不更新的立场。
为
sys.stdout
添加新处理程序wgeznvg73#
我们需要从执行器记录日志,而不是从驱动程序节点记录日志。
1.我们在所有节点上创建了一个
/etc/rsyslog.d/spark.conf
(使用Bootstrap方法,通过Amazon Elastic Map Reduce将so that the Core nodes forwarded syslog
本地1 '消息发送到主节点)。1.在主节点上,我们启用了UDP和TCP syslog侦听器,并对其进行了设置,以便所有
local
消息都记录到/var/log/local1.log
。1.我们在map函数中创建了一个Python
logging
模块Syslog日志记录器。1.现在我们可以使用
logging.info()
进行日志记录....我们发现的一件事是,同一个分区同时在多个执行器上处理,显然Spark在有额外资源的时候一直都是这样做的,它可以处理执行器神秘延迟或失败的情况。
登录
map
函数教会了我们很多关于Spark如何工作的知识。aemubtdh4#
在我的例子中,我只是很高兴将我的日志消息与通常的spark日志消息沿着添加到worker stderr中。
如果这符合您的需要,那么技巧是将特定的Python日志记录器重定向到
stderr
。例如,受this answer启发,下面的代码对我来说很好用:
用法:
输出(加上几行内容):
yc0p9oo05#
最简单的方法从pyspark登录!
kjthegm66#
pyspark和java log4j交互的关键是jvm,下面是python代码,conf缺少url,但这是关于日志的。
snvhrwxg7#
可以在Spark下的类中实现
logging.Handler
接口,将日志消息转发给log4j,然后使用logging.root.addHandler()
(可选地,logging.root.removeHandler()
)安装该处理程序。处理程序应该具有如下所示的方法:
初始化Spark会话后,应立即安装处理程序:
下面是一个更完整的例子:https://gist.github.com/thsutton/65f0ec3cf132495ef91dc22b9bc38aec
xzabzqsa8#
您需要使spark日志对于驱动程序和所有执行器都是可访问的,因此我们创建了日志记录类,并将其作为作业依赖项进行处理,然后将其加载到每个执行器上。