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が速度的にも良さそう)
- パーティション分割してどんどんデータをためていけて、しかも効率よくアクセスできる想定だが、何も考えずに全件クエリで莫大なクエリコストが発生する可能性。。。(データ量の制限はある様だけど)