Amazon Redshift Spectrumが2017年にリリースされ、今までRedshift上のデータの増加対策としてノード追加しか手段がなかったのが、Amazon S3へデータを退避しRedshift Spectrumでアクセスするという手段が取られるようになりました。
この時に注目をされるようになったのがParquetというカラムナフォーマットです。CSVファイルのままRedshift Spectrumでアクセスした場合とParquetファイルに対してアクセスした場合と比較した時に、パフォーマンスに大きな差が出ることが分かり、多くの場面で利用されるようになりました。
しかし運用面で一つ難点があり、Parquet形式のファイルを生成、変換するのに手間がかかるという問題がありました。
従来は、AWS Glueを利用してETL処理でParquet形式に変換し出力するという方法が一般的でした。しかし、PySparkなどで変換スクリプトを作成する必要があり、テンプレートコードが用意されているとはいえ若干敷居が高く、またジョブの実行時間に応じた料金がかかるため、巨大なデータをETL処理する場合にはコストも問題となりました。
今回はこれらの問題を解決する方法を3つご紹介致します。
1. UNLOADでParquet出力
この問題を解決する発表がre:Invent 2019で行われました。データレイクエクスポートで、RedshiftのUNLOADクエリを用いてS3にParquet形式で出力できるようになったのです。
Amazon Web Services ブログ – Amazon Redshift の新機能 – データレイクエクスポートとフェデレーテッドクエリー
Parquet出力のUNLOAD構文は以下のとおりです。
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
IAM_ROLE 'arn:aws:iam::123456789012:role/hogeRole'
FORMAT AS PARQUET
select-statement
にUNLOAD
対象となるクエリを記述します。Parquet変換対象をSELECT
文で記述できるので、実装の敷居は随分下がっています。TO
に出力先のS3バケットとキーのプレフィックスを指定しIAM_ROLE
に上記S3へのアクセス権限を持ったIAMロールのarnを記述します。ここは従来のCSV出力のUNLOAD
と一緒です。FORMAT AS
でPARQUET
を指定します。今までCSV
しか指定できなかったのがPARQUET
を指定できるようになりました。
またPARTITION BY
を指定することでHive形式のパーティションに分割することも出来ます。
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
IAM_ROLE 'arn:aws:iam::123456789012:role/hogeRole'
FORMAT AS PARQUET
PARTITION BY (col_name1, col_name2,...)
例えば PARTITION BY (year, month, day)
を指定すると、select-statement
のyear
, month
, day
カラムの値でパーティション分割され、s3://object-path/name-prefix/year=yy/month=mm/day=dd/000.parquet
のような形でファイルが作られます。
FORMAT AS PARQUET
で注意すべき点は、圧縮系のオプション(GZIP, BZIP2, ZSTD)指定ができないことです。デフォルトでSNAPPY圧縮が使用されます。
2. AWS Lake Formationで権限管理
AthenaやRedshift Spectrumがリリースされた直後は CREATE EXTERNAL SCHEMA
で適切な IAM_ROLE
を指定すれば、特に問題なく外部テーブルの作成や SELECT
クエリの実行ができました。
しかし昨年 AWS Lake Formation がリリースされ、単純に外部テーブルを作成するだけではRedshift Spectrumを利用することができなくなりました。利用するIAMユーザーやIAMロールに対して、適切なData PermissionをDatabaseやTableに設定する必要があります。例えばパーティションを追加する場合、 Alter Permissionを追加することで、ALTER TABLE ... ADD PARTITION
や MSCK REPAIR TABLE
が実行できるようになります。
ただ、テーブルを追加するたびに毎回Data Permissionを追加、編集するのは大変なので、AWS Lake FormationのSettingsの項目で Use only IAM access control for new databases
と Use only IAM access control for new tables in new databases
の設定をonにすることで自動的に権限が付与されます。どのようなポリシーで権限管理するか検討した上で設定してください。
なお、Lake Formationリリース前に作成された外部テーブルについては自動的にData Permissionが付与されています。
3. troccoでRedshiftからS3へParquet出力
trocco®︎でも簡単にRedshiftからS3へParquet出力することが可能です。
この方法のメリットは以下になります。
trocco®︎を使うメリット
- 開発が要らず、UIで操作が完結する
- バッチ(スケジュール)実行やSlack通知の仕組みを作る必要が無い
- Glueデータカタログへの登録を自動化出来る
- Redshift以外の転送元に、40以上の対応サービスが選べる(2020年4月現在)
troccoはデータ統合に特化したSaaSのマネージドサービスなので、開発・実装やジョブ管理などを自前で行う必要がありません。
以下が実際の操作画面ですが、直感的な操作で、5分ほどで設定が行なえます。
(詳しい設定方法はQiitaの設定記事をご覧ください。)


ただしこの方法はRedshiftのテーブル内の列を使用したHiveパーティションの生成には対応しておらず、trocco転送実行時刻をベースとしたパーティション生成のみの対応となります。
まとめ
以上、RedshiftからUNLOADでParquet出力できるようになり、低コストでRedshift Spectrum化する方法と注意点をご紹介しました。
現状の運用方法やリソースを鑑みて、できるところからお試しください。