Athenaで統計情報を取得する


背景・目的

  • Athenaでどこに時間がかかっているか内訳を調べたい。

結論

  • Athenaのget-query-executionのオプションを指定することで統計情報が取得できる。

内容

CLIで調査する

  • 以下のコマンドを実行する。
aws athena get-query-execution  --query-execution-id {クエリID} --query QueryExecution.Statistics --output table
  • 結果
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                             GetQueryExecution                                                                             |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
| DataScannedInBytes | EngineExecutionTimeInMillis  | QueryPlanningTimeInMillis  | QueryQueueTimeInMillis  |  ServiceProcessingTimeInMillis  | TotalExecutionTimeInMillis   |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
|  79139461          |  5083                        |  798                       |  295                    |  68                             |  5446                        |
+--------------------+------------------------------+----------------------------+-------------------------+---------------------------------+------------------------------+
  • DataScannedInBytes
    • スキャンしたデータ量(バイト数)
  • EngineExecutionTimeInMillis
    • クエリの実行にかかった時間(ミリ秒)
  • QueryPlanningTimeInMillis
    • Athenaがクエリ実行計画に要した時間(ミリ秒)
    • データソースからテーブルパーティションを取得するために費やした時間も含まれる。
    • この時間はEngineExecutionTimeのサブセット。
  • QueryQueueTimeInMillis
    • リソースを待機している時間。(ミリ秒)
    • 実行前の時間と思われる。
  • ServiceProcessingTimeInMillis
    • クエリ実行後、クエリ結果を公開するのに要した時間(ミリ秒)
  • TotalExecutionTimeInMillis

    • クエリを実行するのに要した時間(ミリ秒)
    • 合計時間と思われる。
  • TotalExecutionは以下のように整理できる。

    • 上述したとおりQueryPlanningTimeInMillisはEngineExecutionTimeInMillisのサブセットのため、計算対象から外しています。
内訳 実行時間 計算対象
EngineExecutionTimeInMillis 5083  ◯
QueryPlanningTimeInMillis 798
QueryQueueTimeInMillis 295
ServiceProcessingTimeInMillis 68
TotalExecutionTimeInMillis 5446

考察

  • これらの数字を確認することで以下の判断ができそう。
    • QueryQueueTimeInMillisが長い。
      • スループットが大きい。(多い)
      • 競合のクエリが多いなど。
      • アカウントあたりのAPIコールのクォーターの引き上げを検討する。
        • StartQueryExecution(デフォルト20/秒)
    • QueryPlanningTimeInMillisが長い。
      • テーブルパーティションを取得する時間も含まれるので、パーティション数が多いか追加で確認する。
      • GlueやAthenaのパーティションインデックスを検討する。
    • ServiceProcessingTimeInMillis
      • クエリの結果を返すのに時間がかかっている。
      • 単純にデータ量が多い場合が考えられる。

参考

https://docs.aws.amazon.com/cli/latest/reference/athena/get-query-execution.html
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/service-limits.html#service-limits-api-calls