记录 Athena 中的 Spark 应用程序事件 - Amazon Athena

记录 Athena 中的 Spark 应用程序事件

Athena 笔记本编辑器允许使用标准 Jupyter、Spark 和 Python 日志记录。您可以使用 df.show() 来显示 PySpark DataFrame 内容,也可以使用 print("Output") 来显示单元格输出中的值。stdoutstderrresults 计算输出将写入 Amazon S3 中的查询结果存储桶位置。

将 Spark 应用程序事件记录到 Amazon CloudWatch

Athena 会话还可以将日志写入您正在使用的账户中的 Amazon CloudWatch

了解日志流和日志组

CloudWatch 将日志活动组织到日志流和日志组中。

日志流 – CloudWatch 日志流是共享同一个源的一系列日志事件。CloudWatch Logs 中每个独立的日志源构成一个独立的日志流。

日志组 – 在 CloudWatch Logs 中,日志组是一组具有相同保留、监控和访问控制设置的日志流。

对可属于一个日志组的日志流数没有限制。

在 Athena 中,当您首次启动笔记本会话时,Athena 会在 CloudWatch 中创建日志组,该日志组会使用启用 Spark 的工作组名称,如下例所示。

/aws-athena/workgroup-name

该日志组将为会话中的每个执行程序接收一个日志流,该执行程序至少会产生一个日志事件。执行程序是笔记本会话可以向 Athena 请求的最小计算单位。在 CloudWatch 中,日志流名称以会话 ID 和执行程序 ID 开头。

有关 CloudWatch 日志组和日志流的更多信息,请参阅《Amazon CloudWatch Logs 用户指南》中的使用日志组和日志流

在 Athena for Spark 中使用标准记录程序对象

在 Athena for Spark 会话中,您可以使用以下两个全局标准记录程序对象,将日志写入 Amazon CloudWatch:

  • athena_user_logger – 仅向 CloudWatch 发送日志。如果您想要将 Spark 应用程序的信息直接记录到 CloudWatch,请使用该对象,如下例所示。

    athena_user_logger.info("CloudWatch log line.")

    该示例将日志事件写入 CloudWatch,如下所示:

    AthenaForApacheSpark: 2022-01-01 12:00:00,000 INFO builtins: CloudWatch log line.
  • athena_shared_logger – 出于支持目的,向 CloudWatch 和 AWS 发送相同的日志。您可以使用该对象与 AWS 服务团队共享日志以进行故障排除,如下例所示。

    athena_shared_logger.info("Customer debug line.") var = [...some variable holding customer data...] athena_shared_logger.info(var)

    该示例将 debug 行和 var 变量的值记录到 CloudWatch Logs,并将每行的副本发送到 AWS Support。

    注意

    为保护您的隐私,不会与 AWS 共享计算代码和结果。确保您对 athena_shared_logger 的调用只会写入您希望对 AWS Support 可见的信息。

提供的记录程序将通过 Apache Log4j 写入事件,并继承此接口的日志记录级别。可能的日志级别值包括 DEBUGERRORFATALINFO 以及 WARNWARNING。您可以使用记录程序上相应的命名函数来生成这些值。

注意

请勿重新绑定名称 athena_user_loggerathena_shared_logger。这样做会使日志记录对象无法在会话的剩余时间内写入 CloudWatch。

示例:将笔记本事件记录到 CloudWatch

以下过程显示如何将 Athena 笔记本事件记录到 Amazon CloudWatch Logs。

将 Athena 笔记本事件记录到 Amazon CloudWatch Logs
  1. 按照 Amazon Athena 上的 Apache Spark 入门,在 Athena 中创建具有唯一名称的启用 Spark 的工作组。本教程使用工作组名称 athena-spark-example

  2. 按照 创建您自己的笔记本 中的步骤创建笔记本并启动新会话。

  3. 在 Athena 笔记本编辑器的新笔记本单元格中,输入以下命令:

    athena_user_logger.info("Hello world.")
  4. 运行单元格。

  5. 执行以下操作之一,以检索当前会话 ID:

    • 查看单元格输出(例如 ... session=72c24e73-2c24-8b22-14bd-443bdcd72de4)。

    • 在新单元格中,运行魔术命令 %session_id

  6. 保存会话 ID。

  7. 使用用于运行笔记本会话的同一 AWS 账户,从 https://console.aws.amazon.com/cloudwatch/ 打开 CloudWatch 控制台。

  8. 在 CloudWatch 控制台导航窗格中,选择 Log groups(日志组)。

  9. 在日志组列表中,选择具有启用 Spark 的 Athena 工作组名称的日志组,如下例所示。

    /aws-athena/athena-spark-example

    Log streams(日志流)部分包含工作组的一个或多个日志流链接的列表。每个日志流名称均包含会话 ID、执行程序 ID 以及由正斜杠字符分隔的唯一 UUID。

    例如,如果会话 ID 为 5ac22d11-9fd8-ded7-6542-0412133d3177,执行程序 ID 为 f8c22d11-9fd8-ab13-8aba-c4100bfba7e2,则日志流的名称类似于以下示例。

    5ac22d11-9fd8-ded7-6542-0412133d3177/f8c22d11-9fd8-ab13-8aba-c4100bfba7e2/f012d7cb-cefd-40b1-90b9-67358f003d0b
  10. 为会话选择日志流链接。

  11. Log events(日志事件)页面上,查看 Message(消息)列。

    您运行的单元格的日志事件类似于以下内容:

    AthenaForApacheSpark: 2022-01-01 12:00:00,000 INFO builtins: Hello world.
  12. 返回到 Athena 笔记本编辑器。

  13. 在新单元格中,输入以下代码。代码会将变量记录到 CloudWatch:

    x = 6 athena_user_logger.warn(x)
  14. 运行单元格。

  15. 返回 CloudWatch 控制台的 Log events(日志事件)页面,可查看同一日志流。

  16. 日志流现在包含具有如下消息的日志事件条目:

    AthenaForApacheSpark: 2022-01-01 12:00:00,000 WARN builtins: 6