Amazon Redshift:Redshift Spectrumの概要/仕様/制限事項など #awssummit

2017.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2017/04/19開催(日本時間:2017/04/20)の『AWS Summit in San Francisco』で発表されたAmazon Redshiftの新機能『Redshift Spectrum』。S3のデータをRedshiftから直接クエリ出来るという代物ですが、リリース時点での仕様や制限事項等のドキュメントは発表と同時に既に公開されています。当エントリではその内容を読み解き、現状どんな風に使えるのかについて理解・把握してみたいと思います。

redshift-spectrum_01

目次

Redshift Spectrum:概要

Amazon Redshift Spectrumを使う事で、データをRedshiftクラスタにロードする事無く、Amazon S3のファイルから構造化データ及び非構造化データを効率的にクエリする事が出来ます。Redshift Specrtumクエリでは大きなデータセットに対して非常に高速に実行可能な、大規模な並列処理を採用しています。処理の多くはRedshift Spectrumレイヤーで行われ、殆どのデータはAmazon S3に残る形となります。

Redshift Spectrumを使う事で、複数のクラスタからAmazon S3上に存在する同じデータセットを(各クラスタにデータのコピーを作成する必要無く)同時に照会する...というアクションも可能となります。

Redshift Spectrumはクラスタとは独立した、専用のAmazon Redshiftサーバに存在する形となります。Redshift Spectrumは述部のフィルタリングや集計等の多くの"計算集約型"のタスクをプッシュし、Redshift Spectrumレイヤーに移動させるので、Redshift Spectrumクエリはクラスタの処理キャパシティを大幅に削減する事が出来ます。Redshift Spectrumはインテリジェントにスケールさせる事が可能です。

クエリの要求に基づき、Redshift Spectrumは大規模並列処理を利用する為に数千ものインスタンスを使用する可能性があります。

Redshift Spectrumテーブルを作成するには、ファイルの構造を定義し、外部データカタログにテーブルとして登録する必要があります。外部データカタログはAmazon Athenaに付属のデータカタログまたはApache Hiveメタストアのいずれかの形式となります。外部テーブルを作成及び管理するためには、Amazon RedshiftからDDLコマンドを使用するか、外部データカタログに接続するツールを使用します。外部データカタログへの変更はAmazon Redshiftクラスタですぐに利用出来ます。

作成した外部テーブルは、必要に応じて1つまたは複数の列にパーティション化する事が可能です。Amazon Redshiftクエリオプティマイザはクエリのデータを含まないパーティションを排除するため、外部データの一部としてパーティションを定義する事でパフォーマンスの向上が期待出来ます。

Redshift Spectrumテーブルが定義されると、既存Amazon Redshiftテーブルと同様に、テーブルを照会し・結合する事が出来るようになります。(※Amazon Redshiftは外部テーブルに対する更新操作はサポートされていません。)

Redshift Spectrumテーブルを複数のAmazon Redshiftクラスタに追加する事で、Amazon S3上に存在する任意のデータを複数のクラスタからクエリ出来るようになります。Amazon S3データファイルを更新すると、データはAmazon Redshiftクラスタからすぐに参照出来るようになります。

Redshift Spectrum:制限事項

Redshift Spectrumでは、利用に際しての各種制限事項についてもその内容が紹介されています。現時点(2017/04/20)での制限事項は以下の通りです。

  • Redshift Spectrumの機能を使うには、Redshiftクラスタのエンジンバージョンが1.0.1294以上となっている必要があります。
  • 作成する外部テーブルは、外部スキーマ名によって修飾されている必要があります。検索パス(Seatch Path)の機能は外部スキーマ及び外部テーブルではサポートされていませんのでご注意ください。
  • 外部テーブル作成の詳細についてはこちら: Creating External Tables for Amazon Redshift Spectrum - Amazon Redshift
  • 検索パスの詳細についてはこちら: search_path - Amazon Redshift
  • RCFILEデータフォーマットについては、(LazyBinaryColumnarSerDeではなく)ColumnarSerDeのみがサポート対象となっています。
  • RCFile — Apache Tajo 0.8.0 documentation
  • HiveQL TABLEメモ(Hishidama's Apache Hive TABLE Memo)
  • What Kind of Hive Table is Best for Your Data? | MapR
  • 日付型はパーティション列としてのみサポートされます。
  • 外部テーブルは読み取り専用です。外部テーブルに対するデータの追加(INSERT)、更新(UPDATE)、削除(DELETE)操作は実行出来ません。
  • 外部テーブルに対するビューを作成する事は出来ません。
  • 外部テーブルに対するANALYZEは実行出来ません。また、外部テーブルに対する統計も使用出来ません。クエリ実行プランは、外部テーブルが大きなテーブルであり、ローカルテーブルが小さいテーブルであるという前提に基いて生成されます。
  • 外部テーブルに対するユーザー権限を制御する事は出来ません。代わりに、外部スキーマに対する権限を付与及び取り消す事が可能となっています。
  • Amazon RedshiftクラスタとAmazon S3バケットは同じ地域に存在している必要があります。
  • Amazon S3バケットは特定のVPCエンドポイントへのアクセスを制限する事は出来ません。
  • Amazon S3クライアント側での暗号化はサポートされていません。

Redshift Spectrum:IAMポリシー

デフォルトでは、Amazon Redshift SpectrumはAmazon Athenaのデータカタログを使用します。

Athenaの外部データカタログとAmazon S3のデータファイルにアクセスするにはRedshiftクラスタに許可を与える必要があります。クラスタにアタッチされているIAM Roleを用いる事でその認可を行います。データカタログ管理にHiveメタストアを用いる場合はAthenaにアクセスする必要はありません。

クラスタは、少なくともAmazon S3バケットへのGET及びLISTアクセスを必要とします。また、バケットとしてもクラスタに対してデータアクセスを許可する必要があります。この辺りの詳細については以下をご参照ください。

注意: Amazon S3バケットは特定のVPCエンドポイントからのみアクセスを制限する、というバケットポリシーを使う事は出来ません。

以下ポリシーは、あらゆるAmazon S3バケットのGET及びLISTアクセスを許可する例です。

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": ["s3:Get*", "s3:List*"],
		"Resource": "*"
	}]
}

以下ポリシーは、『myBucket』というバケットのGET及びLISTアクセスを許可する例です。

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": ["s3:Get*", "s3:List*"],
		"Resource": "s3://myBucket/*"
	}]
}

以下ポリシーでは、Amazon Athenaリソースへのアクセスを許可しています。外部データベースがHIVEメタストアにある場合、Amazon Athenaアクセスは不要です。

{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": ["athena:*"],
		"Resource": ["*"]
	}]
}

Redshift Spectrum:クエリがアクセスするデータファイルの仕様について

Amazon Redshift Spectrumのクエリで使用するデータファイルは、Athena、Amazon EMR、Amazon QuickSight等の他のAWSサービスを含む、他アプリケーションで使用するファイルと同じ仕様のものとなります。

ファイルがRedshift Scpectrumでサポートされている形式のいずれかでフォーマットされており、クラスタがアクセス可能なバケットにそのファイルが格納されていれば、Amazon S3から直接データを照会する事が出来ます。データファイル(が格納されているS3バケット)とAmazon Redshiftクラスタは同じリージョンになければなりません。

サポート対象リージョン

現時点(2017/04/20)でのRedshift Spectrumサポート対象リージョンは以下となります。

  • us-east-1(米国東部(バージニア北部))
  • us-east-2(米国東部 (オハイオ))
  • us-west-2(米国西部 (オレゴン))

ファイルフォーマット

現時点(2017/04/20)での、サポート対象となっているRedshift Spectrumにおける構造化及び非構造化データのファイル形式は以下となります。

  • PARQUET
  • TEXTFILE
  • SEQUENCEFILE
  • RCFILE

推奨のファイルフォーマットは列指向型ファイルフォーマット(PARQUET, RCFILE)です。このファイルフォーマットを使用して、必要なカラムだけを選択するように設定を行う事で、Amazon S3からのデータ転送コストを最小限に抑える事が出来ます。

圧縮形式

ストレージスペースを削減し、パフォーマンスを向上させ、コストを最小限に抑える為に、データファイルを圧縮しておく事を強くお勧めします。現時点(2017/04/20)での、サポート対象となっている圧縮形式は以下の通りです。

暗号化

Redshift Spectrumでは、以下の暗号化オプションを使用して暗号化されたデータファイルを透過的に復号化する事が出来ます。

  • Amazon S3によって管理される、AES-256暗号化キーを使用するサーバ側の暗号化(SSE-S3)
  • デフォルト鍵を使用するAWS Key Management Service(SSE-KMS)によって管理される、サーバ側の暗号化

詳細については以下をご参照ください。

Redshift Spectrum:並列処理高速化のためのデータ最適化の"コツ"

Amazon Redshiftは大量並列処理(MPP)の仕組みを使って、大量データを処理する複雑なクエリを高速に実行します。Redshift Spectrummは、外部データを照会する為に同じ原則を拡張し、大きなファイルをスキャンするために必要に応じて複数のRedshift Spectrumインスタンスを作成します。ファイルをテーブルごとに別々のフォルダに配置します。

並列処理を行うためにデータを最適化するには、以下の方法があります。

  • 大きなファイルがある場合、小さなファイルに分割する。ファイル1つあたりのサイズについては100MB〜1GBがオススメです。同一テーブルのファイルを同じフォルダに保存します。
  • すべてのファイルを同じサイズに保つ。一部のファイルが他のファイルよりも遥かに大きい場合、Amazon Redshift Spectrumはワークロードを均等に分散させる事ができません。

まとめ

以上、Amazon Redshift Spectrumに関する仕様周りの情報についてのご紹介でした。まだ出たてたばかりの機能ですので制約等も幾つか存在していますが、それでも色々夢が広がりそうなこの機能。効果を最大限発揮させるためには列指向型のファイル形式にしておく必要があるとの事ですが、この形に如何にして準備させておけるかという部分もポイントとなってきそうな気がしますね。引き続きRedshift Spectrumについては注視して行きたいと思います。

参考情報: