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-statementUNLOAD対象となるクエリを記述します。Parquet変換対象をSELECT文で記述できるので、実装の敷居は随分下がっています。
TOに出力先のS3バケットとキーのプレフィックスを指定しIAM_ROLEに上記S3へのアクセス権限を持ったIAMロールのarnを記述します。ここは従来のCSV出力のUNLOADと一緒です。
FORMAT ASPARQUETを指定します。今まで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-statementyearmonthday カラムの値でパーティション分割され、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化する方法と注意点をご紹介しました。

現状の運用方法やリソースを鑑みて、できるところからお試しください。

hirokazu.kobayashi