Go ahead!

Memoization for Everything

AWS Athena雑感

| Comments

Amazon Athena — Serverless Interactive Query Service - AWS

Prestoのフォースを感じたので,知り合いが試した情報も含めて,今思っている所を書いてみる.

実装

Athenaのページにあるように,実行エンジンは独自実装ではなくて,Facebookが公開しているPrestoを使っている.FacebookのみならずTreasure Data,Airbnb,Netflixなどクエリがガンガン飛ぶ環境で元気に動いている実績もあるので,拡張性,パフォーマンス,安定性で選ばれたのだろうと思われる.あとAWS的にJavaの方が相性は良さそう.

パフォーマンス

いくつかの記事で言及されている.

これらを見ると,Prestoをそんなに改造せずに動かしている感じ.例えばGunosyさんやclassmethodさんの記事ではとりあえずフルスキャンをするcsv.gzの方がParquetより速い.データ量が少ないのとクエリが単純なので誤差の範囲に収まってる可能性もあるが,ParquetのReaderをAthena向けに改造している感じはしない(TQA(TDのPresto)の場合,PlazmaDB向けに色々と最適化したReaderを実装してパフォーマンスを稼いでいる(参考)).

AWSがGoogleのColossus相当を持っているという話は聞かないものの,それでもBigQueryに近いパフォーマンスが出たりもするようなので,1クエリで多めにワーカーを使っているんじゃないかと思っている.TQAがクエリによっては同じデータ量でBigQueryとかその他DWHより高速に動いたケースってのはいくつかあるので,Prestoを使っているAthenaでも同様になると思われる.

あと細かなところだけど知り合いの試した情報によると,TQAとかBigQueryはキューイングされてから実行が完了するまでの実行時間が表示されるが,Athenaはクエリが走り始めてから完了するまでの時間しか表示されてないようなので,キューイングまわりで時間が掛かっている場合,体感と表示時間にかなり差があくようだ.

スケジューリング

1クラスタに数千ワーカー(今のPrestoだと万は怪しい?)があって,そこにユーザが割り当てられ,そこの中でさらに適宜ワーカーを選んで処理をしている感じ.

Amazon AthenaでCloudFrontログをSQLで解析する #reinvent #athena

例えばこの記事の最後に「同じSELECTでも数秒で終わるものが時間帯によって数百秒かかることがあったり」というのがあるので,リソースが空いてるワーカーやクラスタをちゃんと選んでいるのではなくて,おそらくランダムか割り当て回数が少ないワーカーを選んでいるっぽい.この辺はBigQueryと同じで,実際複数ユーザが投げ続ける環境だと空いてるワーカーをクエリ負荷含めて探すのはかなり難しいので,この手のアプローチがシンプルでそれなりによく動く.

ただ,知人の試した結果だと,1時間弱くらいResourceUnavailableで弾かれ続けた,みたいな状況もあるようなので,重めのクエリを投げ続けると制限されるのか,ユーザのクラスタ割り当てが一定時間は固定で,ビジーなクラスタに割り当てられるとクエリが失敗しやすくなるのかもしれない.

Athenaのページに同時実行数に関する記述がないので,この辺どれだけ絞っているのかよく分からないのが悩ましいところ……

エラーハンドリング

どうもPresto内部でいくつかエラーを握りつぶしているっぽい.これはBigQueryもそうなんだけど,多分そのエラーによってクラスタの状態とかバックエンドの詳細が分かってしまうので,「とりあえずエラー」みたいなのを返しているようだ. エラーが起きたらとりあえずretryする感じになりそう.

カスタマイズされている部分

ユーザが目に見えるところだと,DDLとか禁止されているクエリ周り.例えば運用上発行されたら困るDDLとかはもちろん弾かれるし,生のPrestoとかTQAだと通るクエリがAthenaではエラーになったりすることもあるようなので,その辺は運用との兼ね合いで禁止しているようだ.

あと当たり前だけどHiveのmetastore周りはAWS向けに専用サーバを実装しているっぽい.

料金

ここは思いっきりBigQueryを参考にしているようだ,がBilling Tierみたいなのはない.いずれ入るかもしれないが,AthenaはBigQueryのようにバッチとか含めてDWH的に使わせる気はあまりないようなので,当分ないだろうと思っている. ただ,AWSは既存のうまく行ってるサービスを自社サービスに取り込んで提供する傾向が強いので,今後BigQueryに寄せていく可能性はありそう.

Athenaは様々なフォーマットに投げられる一方,jsonやcsvみたいなオブジェクトを対象にすると強制的にフルスキャンになるので,その分課金がバーストしやすい.列指向にするにはEMRのSparkとか使って行うのが鉄板のようだ.

あと当たり前だけどS3に対する保存・APIリクエスト・データ転送分も別途課金されるので,1TB per 5$ + additionalというのは気をつけてないと,想像より課金されてた,みたいなのが起きやすそう.特にデータ転送量.

感想

結構TLとか見てると,「BigQueryの対抗だ!」みたいなtweetを見かけたりするけど,個人的にはあくまでManaged Prestoって感じでまだ対抗みたいな感じはしてない.今後,ヘビーユーザが増えた時にどこまでうまくworkするのかは気になっているところ.

出来れば,AWSからPrestoにガンガンパッチとかFeature Requestが飛んでくれると嬉しいなぁと思ってます.

Comments