

# Athena での Spark アプリケーションイベントをログに記録する
<a name="notebooks-spark-logging"></a>

Athena ノートブックエディタでは、Jupyter、Spark、Python の標準ログが可能です。`df.show()` を使用して PySpark DataFrame のコンテンツを表示したり、`print("Output")` を使用してセル出力に値を表示したりできます。計算の `stdout`、`stderr`、および `results` 出力は Amazon S3 のクエリ結果バケットの場所に書き込まれます。

## Amazon CloudWatch への Spark アプリケーションイベントをログに記録する
<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 ログで、ロググループは保持、モニタリング、アクセス制御について同じ設定を共有するログストリーミングのグループです。

1 つのロググループに属することができるログストリーミングの数に制限はありません。

Athena で初めてノートブックセッションを開始すると、次の例のように、Athena は Spark 対応のワークグループの名前を使用して CloudWatch にロググループを作成します。

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

このロググループは、少なくとも 1 つのログイベントを生成するセッションのエグゼキューターごとに 1 つのログストリームを受け取ります。エグゼキューターとは、ノートブックセッションが 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 セッションでは、次の 2 つのグローバルスタンダードロガーオブジェクトを使用して、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 と共有されません。サポート に表示する情報のみを書き込む `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) に従って、一意の名前で Spark 対応のワークグループを Athena に作成します。このチュートリアルでは、ワークグループ名 `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]** (ログストリーム) セクションには、ワークグループの 1 つ以上のログストリームリンクのリストが含まれています。各ログストリーム名には、セッション 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
   ```