当前位置: 首页 > 知识库问答 >
问题:

如何从Python Spark脚本登录

韦思淼
2023-03-14

我有一个Python Spark程序,我使用Spark submit运行该程序。我想把日志记录语句放进去。

logging.info("This is an informative message.")
logging.debug("This is a debug message.")

我想使用Spark使用的相同记录器,以便日志消息以相同的格式显示,并且级别由相同的配置文件控制。我该怎么做?

我尝试将日志记录语句放入代码中,并从日志记录开始。getLogger()。在这两种情况下,我都能看到Spark的日志消息,但我看不到。我一直在看Python日志文档,但没有从中找到答案。

不确定这是否是特定于提交给Spark的脚本,或者只是我不了解日志如何工作。

共有3个答案

夏新翰
2023-03-14

我们需要从执行程序登录,而不是从驱动程序节点。所以我们做了以下工作:

>

  • 我们创建了一个/etc/rsyslog。d/火花。所有节点上的conf(使用Amazon Elastic Map Reduce的引导方法,以便核心节点将sysloglocal1`消息转发到主节点。

    在主节点上,我们启用了UDP和TCP系统日志侦听器,并将其设置为所有local消息都记录到/var/log/local1。日志

    我们在map函数中创建了一个Pythonlogging模块Syslog记录器。

    现在我们可以使用日志记录进行日志记录。info()。。。

    我们发现,同一分区在多个执行器上同时处理。显然,Spark在拥有额外资源的情况下一直在这样做。这可以处理执行人神秘延迟或失败的情况。

    登录map函数让我们了解了很多Spark的工作原理。

  • 苏彭薄
    2023-03-14

    您需要为spark本身获取记录器,默认情况下,getLogger()将为您自己的模块返回记录器。尝试以下方法:

    logger = logging.getLogger('py4j')
    logger.info("My test info statement")
    

    它也可能是'pyspark'而不是'py4j'

    如果您在spark程序中使用的函数(并执行一些日志记录)与主函数定义在同一个模块中,则会出现一些序列化错误。

    这里解释了这一点,并给出了同一个人的示例

    我还在火花1.3.1上测试了这个

    编辑:

    要将日志记录从STDERR更改为STDOUT,您必须删除当前的StreamHandler并添加一个新的。

    查找现有的流处理程序(完成后可以删除此行)

    print(logger.handlers)
    # will look like [<logging.StreamHandler object at 0x7fd8f4b00208>]
    

    可能只有一个,但如果没有,你将不得不更新位置。

    logger.removeHandler(logger.handlers[0])
    

    sys添加新的处理程序。标准输出

    import sys # Put at top if not already there
    sh = logging.StreamHandler(sys.stdout)
    sh.setLevel(logging.DEBUG)
    logger.addHandler(sh)
    
    萧凡
    2023-03-14

    您可以从SparkContext对象获取记录器:

    log4jLogger = sc._jvm.org.apache.log4j
    LOGGER = log4jLogger.LogManager.getLogger(__name__)
    LOGGER.info("pyspark script logger initialized")
    
     类似资料:
    • 我有一个基本的Groovy脚本,我希望尽可能简单地创建日志。我希望消息转到标准输出,以及一个日志文件,日志文件中的每个条目都有一个时间戳。 我不能使用@Log符号,因为它是一个脚本,我没有要注入的类。否则我认为这将是理想的。

    • 问题内容: 如何从“脚本” 执行PowerShell ps1脚本? 我知道如何在package.json“ scripts”中设置基本脚本。例如,使用以下配置,我可以执行该命令,该命令将向控制台输出“这仅仅是测试”: 但是,我有一个更高级的场景,我想执行一个PowerShell脚本。像这样: 我可以通过scripts对象执行这样的ps1脚本吗?是否需要任何特殊的设置/配置?还有其他限制吗? 问题答

    • 问题内容: 我知道我曾经知道如何执行此操作,但是…在UNIX上登录时如何运行脚本(bash正常)? 问题答案: 来自维基百科 当Bash启动时,它将以各种不同的脚本执行命令。 当Bash作为交互式登录Shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .p

    • 问题内容: 我很确定答案是否定的,但是我想我还是会问。 如果我的站点引用了名为“ whatever.js”的脚本,是否可以从该脚本中获取“ whatever.js”?喜欢: 麻烦多于依赖检查所值得的,但是这真是麻烦。 问题答案: var scripts = document.getElementsByTagName(‘script’); var lastScript = scripts[scrip

    • 问题内容: 我能运行Linux命令状或从Java没有问题,但不能得到执行的Python脚本。 这是我的代码: 什么都没有发生。它到达了SEND,但之后就停止了… 我正在尝试执行需要root权限的脚本,因为它使用串行端口。另外,我还必须传递带有一些参数的字符串(数据包)。 问题答案: 您不能像在示例中那样在内部使用PIPE 。PIPE是shell的一部分。 你可以做 将命令放入shell脚本并使用或

    • 问题内容: 之前曾在不同程度上提出过这样的问题,但我觉得还没有以简明的方式回答,因此我再次提出。 我想在Python中运行脚本。可以说是这样的: 它获取文件位置,读取它,然后打印其内容。没那么复杂。 好吧,那我该如何在C#中运行它呢? 这就是我现在所拥有的: 当我传递位置和位置无效时。有人告诉我,我应该通过的,然后作为。 我已经寻找了一段时间,只能找到建议使用IronPython或类似工具的人。但