Gunosyデータ分析ブログ

Gunosyで働くデータエンジニアが知見を共有するブログです。

Amazon AthenaをBigQueryと比較してみた

f:id:y-koid:20161201055559p:plain

こんにちは、データ分析部の阿部です。 作業中音楽は聞かない派ですが、ホワイトノイズを聞いていると集中できるという噂を聞いたことがあるので少し気になっています。

今回は、re:Invent2016で発表されたばかりのAthenaを紹介します。

Athenaとは

本日、AWSのre:Invent中で、RedshiftやEMRに続くビッグデータサービスとして、Athenaというサービスがリリースされました。

Athenaは、S3上のデータ(CSV, JSON, その他フラットファイル)に対して、インタラクティブにSQLを実行することができます。 RedshiftやEMRに比べて、クラスタの構築や運用を必要とせず、シンプルにクエリを実行できるというメリットがあります。 課金形態も、クエリ&読み込んだデータ量に応じて課金という点で、GoogleのBigQueryに近いサービスだと思えば良さそうです。

Redshiftなどのサービスとの違いや使い所は以下を見ると参考になるかと思います。 https://aws.amazon.com/jp/athena/faqs/

今回、GunosyでもAthenaを導入すべきかどうか検討すべく、早速パフォーマンスの検証をしてみました。

データの準備

データはS3に保存するだけで使えます。

Pricingのページを見てみると、GZIPでファイルを圧縮したり、列指向なストレージファイルフォーマットを使ったりすることで、読み込むデータ量を減らすことができる、と書いてあります。 料金 - Amazon Athena | AWS

今回は検証用に15億行のtable_aと、1.5億行のtable_bとtable_cをGZIP圧縮されたCSVと、Parquet*1の形式で準備しました。

また、Prestoベースということもあり、大きなファイル1つ、ではなく、ある程度のサイズで分割したほうがパフォーマンスは良くなるようです。 今回CSVの方はそれぞれ4000ファイルに分割しました。

※実際の運用としては、GunosyではKinesis Firehoseを利用しているので、ここからストリーミングデータをS3に保存し、Athenaからクエリを実行する、ということができるのではと考えています。

data.gunosy.io

テーブル作成

AthenaはWebコンソールが用意されており、Webコンソールでテーブルの作成ができます。

画面の見た目はHue*2とよく似ています。 f:id:y-abe-hep:20161127171639p:plain

データベースとテーブルの作成は画面上部のカタログマネージャをクリックして行います。

f:id:y-abe-hep:20161127171655p:plain

Step 1 ではデータベースの作成または既存のデータベースの選択とテーブルの作成をします。 Location of Input Data Set の項目では先ほどアップロードしたファイルがあるディレクトリのパスを指定します。

Step 2 ではデータフォーマット(CSV, JSONなど)を選びます。

Step 3 ではカラムの定義をします。

f:id:y-abe-hep:20161127190325p:plain

ここではカラム名と型を入力していきます。

最後に Step 4 ではパーティションの設定をします。 日毎や時間毎などに分割でき、こうすることでクエリ実行時に使用するデータを絞り込むことができます。 (クエリを実行するときに、うっかりパーティションの指定を忘れると、全てのデータが読み込まれるのでBigQuery破産ならぬAthena破産の可能性がありそうです。)

以上のことはクエリ(HiveQL)で行うこともできます。 下記はJSONの例です。シリアライザ・デシリアライザの指定は、FAQを見ると書いてあります。 よくある質問 - Amazon Athena | AWS

CREATE EXTERNAL TABLE IF NOT EXISTS tbl
(
   a string,
   b int
)
PARTITIONED BY ( partition_key string )
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ('serialization.format' = '1')
LOCATION 's3://path/to/objects/';

パーティションを利用する場合は、 /YYYY/MM/DD/HH/ などの階層を、個別に追加します。

ALTER TABLE tbl ADD
IF NOT EXISTS PARTITION (partition_key='2016_MM_DD_HH')
LOCATION 's3://path/to/objects/2016/MM/DD/HH/';

速度測定

いくつかクエリを実行して速度を検証しました。 クエリはWebコンソールから実行することができます。

クエリサンプル1

まずはカラムの行数を調べるクエリです。

SELECT COUNT(*) FROM table_a
サービス 実行時間
Athena (csv.gz) 11秒
Athena (parquet) 7秒
BigQuery 10秒

Athena (csv.gz) と BigQuery では10秒程でした。 AthenaではParquetを使うことでパフォーマンスは更に改善し、7秒でした。

AthenaやBigQueryでは同時に複数のジョブを走らせたりもしてみましたが、他のジョブによる影響は無かったです。

クエリサンプル2

SELECT b, COUNT(a) FROM table_a GROUP BY b

カラムbのユニーク数は150です。

サービス 実行時間
Athena (csv.gz) 16秒
Athena (parquet) 20秒
BigQuery 10秒

Athenaでは20秒弱、BigQueryでは10秒で実行できました。 Parquetの方がパフォーマンスが良さそうと考えられますが、このクエリではcsv.gzの方が若干良い結果でした。

まとめ

今回発表されたAthenaはフルマネージドで超高速な分散処理サービスです。 運用が簡単でパフォーマンスも良く、導入する価値があるサービスだと思いました。 とくにAWSをメインに利用している場合、S3にログを保存している場合にはメリットが大きいのではないでしょうか。 あとは各種ライブラリや、弊社で重宝しているRe:dashなどのサービスへの対応が早く充実してくることに期待です。

*1:Parquetとは主にHadoopのエコシステムで利用される列指向なストレージファイルフォーマットです

*2:HadoopやHiveをWebUIで操作するためのツール