Query exhausted resources at this scale factor というエラーが発生
こちらのエラーはエラーメッセージの通り、Athenaのリソースが足りないというエラーです。
リンクを参照すると以下のメッセージも同様にメモリが足りないなどに起因して発生するエラーです。
INTERNAL_ERROR_QUERY_ENGINE
EXCEEDED_MEMORY_LIMIT: Query exceeded local memory limit
Query exhausted resources at this scale factor
Encountered too many errors talking to a worker node. The node may have crashed or be under too much load.
対応方法
Athenaのリソースを増強するのはできないため、クエリ・データを見直すしかありません。
先程のリンクに対応方法も記載があるのですが、自分でよく対応するやり方を書いておきます
parquetファイルを利用する
CSVファイルを利用しているならparquetファイルに置き換えるのをおすすめします。列指向のファイルなので列を指定することでスキャン量を減らすことができます。これはクエリ速度・費用という観点からも有効です。
パーティションの利用
パーティションを利用することでこちらもスキャン量を減らすことができます。
ただリンクにもある通り100,000を超えるようなパーティションは逆にリソースを使うようなので注意が必要です。不要なパーティションはつくらない・削除するようにしましょう。
Order Byを避ける
order byは単一のノードで処理するようです。なのでorder byをかけると結構このエラーが発生してしまいます。
order byをなくすとクエリが通る事があるので一度試してみてもいいかもしれません。とはいえorder byしないとクエリの意味がないときもあるのでそのときは他のやり方を探らないといけないのですが…。
クエリを分割する
これは面倒ですが一番効くやり方です。特にCTASの利用時は期間やidなどで絞って細かく処理をさせることでリソースエラーを避けることが可能となります。
例えばyear, monthでデータが分かれているなら
WHERE year = 2022
とつけたり
WHERE year = 2022 AND month = 1
として年月の分繰り返分ことでエラーを回避できます。
AthenaはINSERT分にも対応しているので繰り返すハードルは以前より下がっています。
Athenaは大量データ向けのサービスですが、大量すぎると処理ができなくなり、RedShiftなどの利用が必要となります。ただこの場合段違いでコストが掛かるのでなるべくAthenaで完結させたいところです。このようなやり方で回避できれば幸いです。