- 背景・前提
- 施策1. パーティションを使う
- 施策2. 読み込ませるデータを圧縮する
- 施策3. ファイル数を分割する
- 施策3. 結合を最適化する
- 施策4. LIKE句の使用は控える
- 施策5. 近似関数を使う
- 施策6. 必要ない列は含めない
- 施策6. クエリ結果を再利用
- 最後に
- 参考資料
背景・前提
Amazon Athenaは、AWSが提供するフルマネージドサービスです。
S3上にあるデータをクエリを用いて、分析するサービスです。
大規模なデータ分析ができる一方で、クエリの実行時間がボトルネックになりがちです。
そこで今回は、業務をするうえで実際に役立つAthenaのパフォーマンスを改善するための方法をまとめていきたいと思います。
施策1. パーティションを使う
パーティションを利用することで、スキャン量を減少させ、高速化することができます。 例えば、
2020/ 01/ 02/ 2021/ 2022/
のように年月をPrefixとして整理することでパーティションを有効化し、
2020年だけスキャンする
などを行うことができます。
施策2. 読み込ませるデータを圧縮する
CSV等で読ませるのではなく、圧縮されたデータを使うことで、スキャン量が小さくなり高速化します。
gzip
,zstd
,parquet
などが該当します。
施策3. ファイル数を分割する
巨大なファイルを一つ持つよりも、分割したほうがathenaの並列処理が効くため、高速化することができます。
だからといって、分割しすぎるのもNGです。
AWS公式によれば、
約 128 MB
と記載があったりします。
ただし、これを下回ると余分な処理が走るため下回らないようにしましょう。
施策3. 結合を最適化する
athenaでTABLE JOIN
するときのお話です。
2 つのテーブルを結合する場合、結合の左側に大きいテーブルを指定し、右側に小さいテーブルを指定
することで、高速化することができます。
施策4. LIKE句の使用は控える
LIKE
は非常に計算負荷が高いです。できるだけ、使わないようにしましょう。
施策5. 近似関数を使う
正確な数え上げではなく、おおよそが使いたいときは近似関数を使いましょう。
例えば、COUNT
ではなくapprox_distinct
を使うなどです。
施策6. 必要ない列は含めない
必要ない列は計算に入れないようすると、スキャン量を減らすことができます。
必要十分な列のみに限定しましょう。
施策6. クエリ結果を再利用
データに変更がなく、何度もリクエストする場合はクエリ結果の再利用を有効化しましょう。
最後に
素晴らしい検証記事のまとめがあったので、拝借
Athenaのパフォーマンスを最適化するには、データのサイズ、ファイルの数、および圧縮形式を適切に選択することが重要である。この検証の結果により、Athenaを利用する際は、ファイルを予め100MB前後にまとめておくことが何よりも重要であることがわかった。そのうえで、用途に応じてファイルフォーマット、圧縮形式の検討が必要である。可能なかぎりParquet形式でSnappy圧縮するのを前提とすると良いが、データソース側の開発負荷を考えて選択すべき。 Athenaと離れたところで考えても、サイズに大量の小さなファイルを転送するのは著しく転送効率が悪い。Athenaの処理の他に、ETLの転送処理の影響も大きい。データレイクにデータを格納する際に、最初からある程度のサイズにまとめておくことが、処理効率・コスト観点からも重要である。
検証レポート.:Athenaにおけるファイルサイズが性能に与える影響 | NRIネットコムのクラウドソリューション