

# 记录 Athena 中的 Spark 应用程序事件
<a name="notebooks-spark-logging"></a>

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

## 将 Spark 应用程序事件记录到 Amazon CloudWatch
<a name="notebooks-spark-logging-logging-spark-application-events-to-amazon-cloudwatch"></a>

Athena 会话还可以将日志写入您正在使用的账户中的 [Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html)。

### 了解日志流和日志组
<a name="notebooks-spark-logging-understanding-log-streams-and-log-groups"></a>

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

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

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

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

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

```
/aws-athena/workgroup-name
```

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

有关 CloudWatch 日志组和日志流的更多信息，请参阅《Amazon CloudWatch Logs 用户指南》中的[使用日志组和日志流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

### 在 Athena for Spark 中使用标准记录器对象
<a name="notebooks-spark-logging-using-standard-logger-objects-in-athena-for-spark"></a>

在 Athena for Spark 会话中，您可以使用以下两个全局标准记录程序对象，将日志写入 Amazon CloudWatch：
+ **athena\$1user\$1logger** – 仅向 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\$1shared\$1logger** – 出于支持目的，向 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 共享计算代码和结果。确保您对 `athena_shared_logger` 的调用只会写入您希望对 支持 可见的信息。

提供的记录程序将通过 [Apache Log4j](https://logging.apache.org/log4j/) 写入事件，并继承此接口的日志记录级别。可能的日志级别值包括 `DEBUG`、`ERROR`、`FATAL`、`INFO` 以及 `WARN` 或 `WARNING`。您可以使用记录程序上相应的命名函数来生成这些值。

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

### 示例：将笔记本事件记录到 CloudWatch
<a name="notebooks-spark-logging-example-logging-notebook-events-to-cloudwatch"></a>

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

**将 Athena 笔记本事件记录到 Amazon CloudWatch Logs**

1. 按照 [Amazon Athena 上的 Apache Spark 入门](notebooks-spark-getting-started.md)，在 Athena 中创建具有唯一名称的启用 Spark 的工作组。本教程使用工作组名称 `athena-spark-example`。

1. 按照 [步骤 7：创建自己的笔记本](notebooks-spark-getting-started.md#notebooks-spark-getting-started-creating-your-own-notebook) 中的步骤创建笔记本并启动新会话。

1. 在 Athena 笔记本编辑器的新笔记本单元格中，输入以下命令：

   ```
   athena_user_logger.info("Hello world.")         
   ```

1. 运行单元格。

1. 执行以下操作之一，以检索当前会话 ID：
   + 查看单元格输出（例如 `... session=72c24e73-2c24-8b22-14bd-443bdcd72de4`）。
   + 在新单元格中，运行[魔术](notebooks-spark-magics.md)命令 `%session_id`。

1. 保存会话 ID。

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

1. 在 CloudWatch 控制台导航窗格中，选择 **Log groups**（日志组）。

1. 在日志组列表中，选择具有启用 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
   ```

1. 为会话选择日志流链接。

1. 在 **Log events**（日志事件）页面上，查看 **Message**（消息）列。

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

   ```
   AthenaForApacheSpark: 2022-01-01 12:00:00,000 INFO builtins: Hello world.
   ```

1. 返回到 Athena 笔记本编辑器。

1. 在新单元格中，输入以下代码。代码会将变量记录到 CloudWatch：

   ```
   x = 6
   athena_user_logger.warn(x)
   ```

1. 运行单元格。

1. 返回 CloudWatch 控制台的 **Log events**（日志事件）页面，可查看同一日志流。

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

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