AWS GlueのJob metricsを確認してみた

# 背景・目的
Glueに、`Job metrics`というチェックボックスがあり、これを有効にすることで、どのようなメトリクスが出力されるのかを確認してみました。

# まとめ
- `Job metrics`を有効にすることで、Driver、Executorごと、または全てのExecutorを集計したメトリクスが確認できます。（無効にすると一切出力されません。）
- 30秒ごとに、GlueからCloudWatchにレポートされます。

# 概要
>メトリクスは 30 秒ごとに AWS Glue から CloudWatch に報告され、CloudWatch メトリクスダッシュボードは 1 分ごとにそれらを表示するように設定されています。AWS Glue メトリクスは、以前に報告された値からデルタ値を表示します。必要に応じて、メトリクスダッシュボードは 30 秒の値を集計 (合計) し、最近 1 分間分の値を取得します。AWS Glue メトリクスは、スクリプトでの GlueContext の初期化時に有効になり、基本的には Apache Spark タスクの終了時にのみ更新されます。また、これまでに完了した Spark タスク全体の集計値を表します。

- 30秒ごとにGlueからCloudWatchにレポートされる。
- メトリクスダッシュボードでは1分ごとに表示されるように設定される。

>すべての AWS Glue メトリクス名の前には、必ず次のいずれかの種類のプレフィックスが付きます。
>glue.driver. – 名前がこのプレフィックスで始まるメトリクスは、Spark ドライバーのすべてのエグゼキュターから集計された AWS Glue メトリクスか、Spark ドライバーに対応する Spark メトリクスを表します。
>.executorIdglue. – executorId は、特定の Spark エグゼキュターの番号です。ログに表示されているエグゼキュータに対応します。
>glue.ALL. – 名前がこのプレフィックスで始まるメトリクスは、すべての Spark エグゼキュターからの値を集計します。

- Driver、Executorごとのメトリクスが確認できる。
- ALLは、すべてのExecutorからの値を集計したもの


詳細は、[AWS Glue のメトリクス](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html#awsglue-metrics)を確認することで、メトリクスの内容は確認できます。


# 実践
## 事前準備
1. 30秒間に一回メトリクスが作られるので、最低でも30秒以上動作させるため、大きめのデータを用意します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/879e6c1e-efe9-d743-010c-a1bdeccc6440.png)


## 実装
### Job metricsを有効にした場合
1. 下記のようにS3間でデータを連携するだけのジョブを作成します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ec797307-8877-5502-b650-c00f1c157f9c.png)

1. Job metricsをチェックし、実行します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e3b01283-fbd5-a6c5-1dc2-73d0b009e9c4.png)

1. メトリクスが表示されました。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/2940f83c-0561-5073-2b10-726c4389e702.png)

1. CLIでも確認します。表示されました。
    ```
    $ aws cloudwatch list-metrics --namespace Glue --region us-west-2 --dimensions Name=JobName,Value=cloudwatch-metric-test-enabled
    {
        "Metrics": [
            {
                "Namespace": "Glue",
                "MetricName": "glue.1.jvm.heap.usage",
                "Dimensions": [
                    {
                        "Name": "Type",
                        "Value": "gauge"
                    },
                    {
                        "Name": "JobRunId",
                        "Value": "jr_31a602e3b350f95ae9650cf032b64d2605f8c1afdd8b41e81fafe4a6cca580f2"
                    },
                    {
                        "Name": "JobName",
                        "Value": "cloudwatch-metric-test-enabled"
                    }
                ]
            },
    ・・・
    ・・・
    ```

1. メトリクスの内容を確認します。なお、メトリクス名に番号が振られているものはexecutorIdとのことです。
    ```
    $ aws cloudwatch list-metrics --namespace Glue --region us-west-2 --dimensions Name=JobName,Value=cloudwatch-metric-test-enabled | grep MetricName | sort | uniq
                "MetricName": "glue.1.jvm.heap.usage",
                "MetricName": "glue.1.jvm.heap.used",
                "MetricName": "glue.1.s3.filesystem.read_bytes",
                "MetricName": "glue.1.s3.filesystem.write_bytes",
                "MetricName": "glue.1.system.cpuSystemLoad",
                "MetricName": "glue.2.jvm.heap.usage",
                "MetricName": "glue.2.jvm.heap.used",
                "MetricName": "glue.2.s3.filesystem.read_bytes",
                "MetricName": "glue.2.s3.filesystem.write_bytes",
                "MetricName": "glue.2.system.cpuSystemLoad",
                "MetricName": "glue.3.jvm.heap.usage",
                "MetricName": "glue.3.jvm.heap.used",
                "MetricName": "glue.3.s3.filesystem.read_bytes",
                "MetricName": "glue.3.s3.filesystem.write_bytes",
                "MetricName": "glue.3.system.cpuSystemLoad",
                "MetricName": "glue.4.jvm.heap.usage",
                "MetricName": "glue.4.jvm.heap.used",
                "MetricName": "glue.4.s3.filesystem.read_bytes",
                "MetricName": "glue.4.s3.filesystem.write_bytes",
                "MetricName": "glue.4.system.cpuSystemLoad",
                "MetricName": "glue.5.jvm.heap.usage",
                "MetricName": "glue.5.jvm.heap.used",
                "MetricName": "glue.5.s3.filesystem.read_bytes",
                "MetricName": "glue.5.s3.filesystem.write_bytes",
                "MetricName": "glue.5.system.cpuSystemLoad",
                "MetricName": "glue.6.jvm.heap.usage",
                "MetricName": "glue.6.jvm.heap.used",
                "MetricName": "glue.6.s3.filesystem.read_bytes",
                "MetricName": "glue.6.s3.filesystem.write_bytes",
                "MetricName": "glue.6.system.cpuSystemLoad",
                "MetricName": "glue.7.jvm.heap.usage",
                "MetricName": "glue.7.jvm.heap.used",
                "MetricName": "glue.7.s3.filesystem.read_bytes",
                "MetricName": "glue.7.s3.filesystem.write_bytes",
                "MetricName": "glue.7.system.cpuSystemLoad",
                "MetricName": "glue.8.jvm.heap.usage",
                "MetricName": "glue.8.jvm.heap.used",
                "MetricName": "glue.8.s3.filesystem.read_bytes",
                "MetricName": "glue.8.s3.filesystem.write_bytes",
                "MetricName": "glue.8.system.cpuSystemLoad",
                "MetricName": "glue.9.jvm.heap.usage",
                "MetricName": "glue.9.jvm.heap.used",
                "MetricName": "glue.9.s3.filesystem.read_bytes",
                "MetricName": "glue.9.s3.filesystem.write_bytes",
                "MetricName": "glue.9.system.cpuSystemLoad",
                "MetricName": "glue.ALL.jvm.heap.usage",
                "MetricName": "glue.ALL.jvm.heap.used",
                "MetricName": "glue.ALL.s3.filesystem.read_bytes",
                "MetricName": "glue.ALL.s3.filesystem.write_bytes",
                "MetricName": "glue.ALL.system.cpuSystemLoad",
                "MetricName": "glue.driver.BlockManager.disk.diskSpaceUsed_MB",
                "MetricName": "glue.driver.aggregate.bytesRead",
                "MetricName": "glue.driver.aggregate.elapsedTime",
                "MetricName": "glue.driver.aggregate.numCompletedStages",
                "MetricName": "glue.driver.aggregate.numCompletedTasks",
                "MetricName": "glue.driver.aggregate.numFailedTasks",
                "MetricName": "glue.driver.aggregate.numKilledTasks",
                "MetricName": "glue.driver.aggregate.recordsRead",
                "MetricName": "glue.driver.aggregate.shuffleBytesWritten",
                "MetricName": "glue.driver.aggregate.shuffleLocalBytesRead",
                "MetricName": "glue.driver.jvm.heap.usage",
                "MetricName": "glue.driver.jvm.heap.used",
                "MetricName": "glue.driver.s3.filesystem.read_bytes",
                "MetricName": "glue.driver.s3.filesystem.write_bytes",
                "MetricName": "glue.driver.system.cpuSystemLoad",
    $
    ```

1. 1つのジョブの実行で65本のメトリクスが取得されるようです。
    ```
    $ aws cloudwatch list-metrics --namespace Glue --region us-west-2 --dimensions Name=JobName,Value=cloudwatch-metric-test-enabled | grep MetricName | sort | uniq | wc -l
          65
    $
    ```

### Job metricsを無効にした場合
ちなみに、Job metricsを無効にした場合に、一切メトリクスは取得できないのか確認してみました。

1. Job metricsのチェックを外し、実行します。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/fbe9f845-5619-c7e4-842a-16c78f6a1fe0.png)

1. メトリクスは表示されません。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d0e45c93-a91a-da20-dbf8-4b9b4dfb8fed.png)

1. 念のためにCLIでも確認します。取得できません。
    ```
    $ aws cloudwatch list-metrics --namespace Glue --region us-west-2 --dimensions Name=JobName,Value=cloudwatch-metric-test-disable                             
    {
        "Metrics": []
    }
    $ 
    ```

# 参考
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/monitoring-awsglue-with-cloudwatch-metrics.html