流行りのAWSに関わる事になるとは・・・。
まず概念理解が難しい。
相変わらず自分用メモ
■概要について
[小ネタ] Athena のテーブル, データカタログなどの概念がわからなかったのでまとめた
https://dev.classmethod.jp/articles/athena-table-datacatalog-etc-summary/
AWS Glueの概要を図と用語で整理する
https://qiita.com/sot528/items/1c56bb95ac3060772634
■パフォーマンチューニング
公式によるヒント 10項目
https://aws.amazon.com/jp/blogs/big-data/top-10-performance-tuning-tips-for-amazon-athena/
1.データをバケット化
→S3の機能の1つ。
格納先そのものをオブジェクトとして認識できる。
2.データを分割(Hiveでのパーティショニング)
パーティション作成の際、(Key=Value)を設定し、 Where句で利用することにより、
限定したデータ走査が可能となる。
逆をいえばパーティションとして指定したカラムをWhere句で利用しない場合、
パーティションを切ってようが、テーブルとして読み込む際に全ファイルを走査となる。
→バケットの特性を生かし、正規表現マッチングによる
カラムの指定とrow_nuber関数使いましょうというお話。
3.圧縮を使用する
データを圧縮するとクエリを大幅に高速化できる。
データサイズが小さいほど、S3からAthenaへのトラフィックが減少。
| アルゴリズム | 分割可能 | 圧縮比 | 圧縮+解凍速度
+-------------------+-----------+-----------+--------------
| Gzip(DEFLATE)| 番号 | 高い | 中
| bzip2 | 可能 | とても高い | スロー
| LZO | 番号 | 低 | 速い
|スナッピー | 番号 | 低 | とても早い
4.ファイルサイズの最適化
データの読み取りを並列化できる場合、クエリはより効率的に実行される。
ただし、実行エンジンの起動(準備)時間が長い為、ファイルが小さすぎる場合(通常、128 MB未満)効率が落ちる。
ex.)テキスト形式で保存された7GBのデータを1つのファイルで格納した場合、5000個のファイルで格納した場合の比較データ
| クエリ |ファイル数 | 実行時間
+--------------------------+-------------------+------------
| SELECT count()~ | 5000ファイル | 8.4秒
| SELECT count()~ | 1ファイル | 2.31秒
5.列指向データストアの生成を最適化する
Parquet=列指向データストア。ブロックサイズ=最大行数で分割可能。
列データとして見ると、はデータ型が異なっている事が多い為、列ごとの圧縮、エンコーディングが異なる。
しかし、列での分割により圧縮、エンコーディングの処理速度を上げることが可能。
※検証記事によると、実際にはCSVファイルの方が早いケースが多いという結果
(データ数75004739レコード)
Amazon Athena: カラムナフォーマット『Parquet』でクエリを試してみた
https://dev.classmethod.jp/articles/amazon-athena-using-parquet/
Parquet の利点:データスキャンの大幅削減
データ転送量の抑制
コスト削減
■Glue ブックマーク機能について
読込み完了しているデータは処理スキップし、追加データのみ処理実施する機能
便利そうに見えてその実結構処理時間を取られることが判明。
■仕様
パーティションの作成タイムスタンプ>JOB最終実行時間の場合既存データの取り込み取込み処理をスキップする。
具体的には、パーティション毎にフィルター処理を実行しており、
1prefixの処理時間は100msと短時間だが、すべてのprefixに対してフィルター処理を行う。
【フィルター】
After initial job bookmarks filter:前回読み込んだパーティションに追加/変更となったファイルを特定する。
After final job bookmarks filter:対象のファイルを処理する
その為、InputDataにパーティション設定がないほうがブックマーク機能の処理が短くなる。
この辺を考慮した設計が必要となりそう。