GlueとAthenaの備忘メモ

AWSのGlueとAthenaを勉強しており、現時点のメモを残しておきます。 (完全に自分用になっています)

やりたいこと

RDS上の特定のテーブルのスナップショットを、Athenaで検索できる状態でS3上にGlueで出力させる。 出力タイミングは日次&アドホック。

glue

  • S3へのアクセスの場合、S3用のVPC Endpointが必要
    • ただしS3 to S3の処理の場合は不要(チュートリアルもこれ)
  • RDS等のサービス用のEndpointが無い場合、該当サービスのSGに対して、同SGからのフルポートTCPアクセスの許可が必要
    • Glueは同一Subnet内にENIをアタッチしてアクセスするためとのこと
  • subnetすら無いサービスへのアクセスが必要な場合、NAT Gatewayの設定が必要
  • pythonは2.7しか対応してない。python3はだめorz
  • 格納先のパスは、以下の様なコードを追加して、パーティションを意識したディレクトリ構成とする(S3でのディレクトリはコンソール上での表現だそうですが)
## add morihaya
year   = int(time.strftime('%Y',time.localtime()))
month  = int(time.strftime('%m',time.localtime()))
day    = int(time.strftime('%d',time.localtime()))
hour   = int(time.strftime('%H',time.localtime()))

dpath = "s3://aws-glue-morihaya" + "/" + "year=" + str(year) + "/" + "month=" + str(month) +  "/" + "day=" + str(day) + "/" + "hour=" + str(hour)

glueの残メモ

RDS -> parquet形式@S3だとsnappyで圧縮をしてくれるが、avroにすると無圧縮になる。。。

Athena

  • Amazon Athena のパフォーマンスチューニング Tips トップ 10は必読
    • パーティション分割 も必須。コストも時間もやすくなる(ただし全件アクセスの効率は落ちる)
    • 圧縮もコストがやすくなるという点で必須(snappyが速度的にも良さそう)
  • パーティション分割してどんどんデータをためていけて、しかも効率よくアクセスできる想定だが、何も考えずに全件クエリで莫大なクエリコストが発生する可能性。。。(データ量の制限はある様だけど)