概要

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構文は以下のとおりです。

Copy to Clipboard

select-statementUNLOAD対象となるクエリを記述します。Parquet変換対象をSELECT文で記述できるので、実装の敷居は随分下がっています。
TOに出力先のS3バケットとキーのプレフィックスを指定しIAM_ROLEに上記S3へのアクセス権限を持ったIAMロールのarnを記述します。ここは従来のCSV出力のUNLOADと一緒です。
FORMAT ASPARQUETを指定します。今までCSVしか指定できなかったのがPARQUETを指定できるようになりました。

またPARTITION BYを指定することでHive形式のパーティションに分割することも出来ます。

Copy to Clipboard

例えば 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 PARTITIONMSCK REPAIR TABLE が実行できるようになります。

ただ、テーブルを追加するたびに毎回Data Permissionを追加、編集するのは大変なので、AWS Lake FormationのSettingsの項目で Use only IAM access control for new databasesUse only IAM access control for new tables in new databases の設定をonにすることで自動的に権限が付与されます。どのようなポリシーで権限管理するか検討した上で設定してください。

なお、Lake Formationリリース前に作成された外部テーブルについては自動的にData Permissionが付与されています。

3. troccoでRedshiftからS3へParquet出力

troccoでも簡単にRedshiftからS3へParquet出力することが可能です。
この方法のメリットは以下になります。

  • 開発が要らず、UIで操作が完結する

  • バッチ(スケジュール)実行やSlack通知の仕組みを作る必要が無い

  • Glueデータカタログへの登録を自動化出来る
  • Redshift以外の転送元に、40以上の対応サービスが選べる


troccoはデータ統合に特化したSaaSのマネージドサービスなので、開発・実装やジョブ管理などを自前で行う必要がありません。

以下が実際の操作画面ですが、直感的な操作で、5分ほどで設定が行なえます。
(詳しい設定方法はQiitaの設定記事をご参照下さい)

ただしこの方法はRedshiftのテーブル内の列を使用したHiveパーティションの生成には対応しておらず、trocco転送実行時刻をベースとしたパーティション生成のみの対応となります。

まとめ

以上、RedshiftからUNLOADでParquet出力できるようになり、低コストでRedshift Spectrum化する方法と注意点をご紹介しました。

データ分析基盤を作るなら、trocco®

パワフルなデータ統合機能だけでなく、データの管理やワークフローの管理を、手軽に実現するには「trocco®(トロッコ)」が最適です。自前構築に比べて最大90%の工数カットが可能です。

troccoについて詳しく知る