[AWS Black Belt Online Seminar] Amazon Redshift Update – 最近追加された新機能と Redshift Spectrum レポート
2017年6月7日(水)の 『[AWS Black Belt Onine Seminar 2017] Amazon Redshift Update - 最近追加された新機能と Redshift Spectrum の解説』を受講しました。リリースされたばかりで Redshift Spectrum を中心にレポートにまとめました。 講師はアマゾンウェブサービスジャパン、ソリューションアーキテクトの下佐粉 昭(@simosako)さんです。
アジェンダ
- Amazon Redshift とは
- Amazon Redshift Spectrum
- 最近のアップデート
- まとめ
Amazon Redshift とは
Amazon Redshiftは、すごく簡単に言うと「データウェアハウス用途に特化した速度の出るRDB」です。性能はペタバイト級にスケールアウトできます。データウェアハウス用途のBIやアドホックな分析が得意です。逆に同時に1万アクセスする用途には全く向かないのでそのような場合はRDSやAuroraを選択した方が良いです。
なぜ早いかというとスケールアウトするからです。実際には複数のコンピュートノードと呼ばれるサーバーに最低1台から128台まで並列分散処理しています。ノードを増やすことでパフォーマンスとディスク容量が増加します。また、ディスクIOを削減するデータ圧縮やゾーンマップ、ソートキーという機能があります。
詳しくは AWS Black Belt Online Seminar - Amazon Redshift(資料)を御覧ください。
Amazon Redshift Spectrum
これまでの課題
- S3からのデータロード(COPY)にかかる時間を削減したい
- データサイズの増加に対応するためにノードを増やすと、セットでCPUやメモリも増加し、AWS利用費が発生する
- CSV/TSV以外の連携ファイルフォーマットの増加に対応したい
これらの課題を解決するために登場したのが「Amazon Redshift Spectrum」という新機能です。
Amazon Redshift Spectrumとは
簡単に言うと、S3に置いたファイルがあれば、Redshiftにロードすることなくクエリがかけられる機能です。Redshift内部のテーブルと結合することが可能で、同じように集計、フィルタできます。
Amazon Redshift Spectrumの特徴
- エクサバイト級まで対応可能(Redshiftはこれまで2PB)
- 高速
- オンデマンド、クエリ毎の費用
- オープンファイルフォーマット(CSV,TSV,Hadoopがサポートするフォーマット等)
- S3のデータを移動させずクエリが実行できる
- フルマネージドサービス
Amazon Redshift Spectrumの使い方
下記の図の1〜3手順で定義すると、クエリを実行できるようになります。CREATE EXTERNAL SCHEMA
は Redshiftの外部スキーマとデータカタログ上のデータベースを関連付け、CREATE EXTERNAL TABLE
は Redshift の外部スキーマ内(データカタログ上のデータベース内)に外部テーブルを定義します。データカタログは Amazon Athena のデータカタログもしくは独自 Hive MetaStore にメタ情報を登録します。
※ ここで注意が必要なのは、Redshift Spectrum から Amazon Athena と同じデータカタログを参照していますが、Redshift Spectrum から Amazon Athena を利用しているわけではなく、全く別のエンジンで動作しています。
クエリを実行すると、Redshiftのコンピュートノードが直接 S3 をリードしているのではなく、「Spectrum層(Spectrum Layer)」という新しいサービス領域の1000台規模の仮想マシンのパワーを使って読み取ります。
手順1 S3にデータを置く
S3バケットにデータを置きます。そして、置いたS3ファイルにアクセスできるIAMロールを作成します。
手順2 CREATE EXTERNAL SCHEMA
CREATE EXTERNAL SCHEMA
は Redshiftの外部スキーマとデータカタログ上のデータベースを関連付けや利用するIAMロールを定義して、Athenaと同じデータカタログ、もしくは独自 Hive MetaStore (実際には EMR の Hive MetaStoreです)にメタ情報を登録します。
手順3 CREATE EXTERNAL TABLE
CREATE EXTERNAL TABLE
は Redshift の外部スキーマ内(データカタログ上のデータベース内)に外部テーブルを定義します。ファイルの種別やテキストファイルの場合は区切り文字、S3ファイルのディレクトリを指定します。
手順4 クエリを実行
通常のSQLが実行可能で、RedshiftのSELECT構文や関数が利用可能です。
クエリ実行の流れ
コンピュートノードの下にある、Spectrum層という新しい領域に対して処理を移譲(Pushdown)して、Spectrum層がノード数をクエリの量に応じて増減させながら処理を実行します。Redshiftのワークロードが Spectrum層にオフロードできることによって、Redshiftがより多くのクエリを実行したり、別の処理ができるようになります。Spectrum層はS3ファイルをスキャンするだけでなく、フィルタ、結合、集計などできるだけSpectrum層で処理して、Redshiftのワークロードを軽減します。
Amazon Redshift Spectrum の特長
大規模データを高速に処理
- Spectrum層で大規模スケールアウトによるクエリを実現
- 1000台までスケールアウト
- S3データへのクエリ実行を自動的に並列化
- 高速かつエクサバイト級に対応可能なインフラを提供
- Redshift のオプティマイザを活用
- SQLを効率的に実行する実績のある Redshift のオプティマイザを利用可能
- 述部をプッシュダウンして、集計や結合、フィルタをSpectrum層側で実行
- Dynamic Pratition Elimination により不要なデータ(パーティション)を読み込みを削減
フルマネージド
- Spectrum層の利用に、準備も管理も不要
- 利用したいときにすぐに利用可能
- Spectrum層の機能拡張が入る場合もユーザの操作は不要
高い費用対効果
- S3データの1TBスキャンあたり$5
- パーティションやカラムナフォーマット(Parquet)、圧縮(gzip, snappy等)でコストを削減可能
- 1000台ものSpectrum層のコンピューティングのパワーを活用してクエリを実行
Amazon Redshift Spectrum 活用のポイント
S3上のデータを直接クエリできるメリット
- Amazon Redshiftのクエリがそのまま活用できる
- ローディングのかかる時間や手間が不要で、分析までの時間を短縮
- (Hadoop等の)ファイルフォーマットを変更せずにクエリを実行可能
- Amazon Redshiftクラスタ上のデータとS3上データをジョイン可能
- 1つのS3データに複数のAmazon Redshiftクたスタから共有アクセス可能(可用性の向上、ワークロードの分散)
ユースケース:定期的に追加されるFACTデータをS3に置く
スタースキーマのファクトをS3に置き、Redshiftのディメンジョンと結合して分析します。
なお、公式マニュアル(Amazon Redshift Spectrum クエリパフォーマンスの向上)の中でも以下のように解説されています。
大きなファクトテーブルは Amazon S3 に、使用頻度の高い小さなディメンションテーブルはローカルの Amazon Redshift データベースに置きます。
ユースケース:アクセス頻度の低いデータをS3に
アクセス頻度の高いデータはRedshift内のテーブル、アクセス頻度の低いデータをS3の外部データを参照するように使い分ける。
そうなると、全てのデータをSpectrumに置き、コンピュートノードを1台で処理できるだろうと考えるかもしれません。しかし、Spectrumはコンピュートノードのスライス単位で処理をSpectrum層に移譲するので、極端に大きなデータに対してコンピュートノード数が少ないと性能がでないことをご注意ください。
ユースケース:S3上のデータを複数クラスタで共有
これまでのRedshiftではできなかった、可能性を感じるユースケースです。S3上のデータを複数クラスタで共有ことで、ジョブ連携や同時実行性能を向上させたり、MultiAZ構成が可能になります。
パフォーマンスのベストプラクティス
パフォーマンスの向上は、読み取りデータ量をいかに減らすか重要で、読み取りデータ量(S3のスキャンサイズ)を減らすことで、AWS利用費も削減できるというメリットがあります。
パーティショニングとは、いわゆるレンジパーティショニングの一種です。クエリのWHERE句の対象となる範囲、例えば時系列データで指定する年・月・日のような日付のような場合に、ディレクトリを年・月・日に階層的に分けて格納します。Spectrum層が読み取る範囲を減らして、速度の向上とコストの削減を実現します。
PARTITIONED BY
でパーティション列を指定して、
CREATE EXTERNAL TABLE mys3.tab1( : PARTITIONED BY (YEAR INTEGER, MONTH INTEGER) STORED AS PARQUET LOCATION 's3://MyData/ex2/';
ALTER TABLE
でパーティションを追加します。
ALTER TABLE mys3.t1 ADD PARTITION(year='2016',month='1') LOCATION 's3://MyData/ex2/year=2016/month=1/; ALTER TABLE mys3.t1 ADD PARTITION(year='2016',month='2') LOCATION 's3://MyData/ex2/year=2016/month=2/; :
データファイルを追加するたびに パーティション指定したALTER TABLE
が手間な場合は、Amazon Athena と同じデータカタログを参照していることを利用して、Amazon Athena から MSCK REPAIR TABLE
でパーティション情報を認識させるというTipがあります。
MSCK REPAIR TABLE tab2
AWSCLIからAthenaにクエリ投げると簡単です。
参考:新機能 AWSCLIから Amazon Athena のクエリを実行する
未サポートの機能、制約
参考:Amazon Redshift:Redshift Spectrumの概要/仕様/制限事項など
最近のアップデート
継続的なスループット向上への取り組み
例)
- v1.0.1012 : I/OとCommitロジックの改善で35%スループット向上
- v1.0.1056 : クエリ中のメモリアロケーションアルゴリズムの改善で最大60%スループット向上
オブジェクト名にUTF−8(日本語)が使用可能に
- オブジェクト名(表名、列名)をUTF−8(日本語)で設定可能になった
- オブジェクト名は最大127バイト
新しい圧縮エンコード - ZSTD
- 圧縮展開が高速かつ高い圧縮率
- 全ての型に適用可能
- 文字列型(CHAR, VARCHAR)に効果が高い
- ANALYZE COMPRESSIONも対応済み
Query Monitoring Rue(QMR)
- WLMの拡張
- クエリのルールを8つまで定義して、違反したクエリへのアクションを定義可能になった
- ルール:CPU利用率、CPU時間、ブロック読み取り数、ジョイン対象行数等 多数
- アクション:LOG(記録)、HOP(別のキューに転送)、ABORT(停止)
- 例)ジョイン対象の行数が10億行を超える場合はABORT
- 例)CPUを80%移譲消費した状態が10分移譲続いたクエrはABORTする
パーセンタイル関連の新しい関数の追加
CTASにおける自動圧縮のサポート
- CTAS: CREATE TABLE AS SELECT ...
- 新機能によって、CTASで作成される表の列は全て自動的にLZOで圧縮
- 例外は、BOOLEAN, REAL, DOUBLE PRECISIONの場合と、列がソートキーの場合
ANALYZE を効率的に時間短縮するオプション
- 大規模環境ではANALYZEにかかる時間が課題になる場合がある
- ANALYZEに PRECDICATE COLUMNS が追加
- 過去の述部(WHERE句)に使用された列、もしくは評価対象になった列のみ自動的に選択される
UDF User Logger
- UDF User Logger
- logger出力したエラーログが自動的にRedshiftに蓄積される機能
- デフォルトログレベルはWARN
- SVL_UDF_LOG表で参照
Timestamp with timezone
- TIMESTAMPZ型の追加
- TIMESTAMP型の列にTIMESTAMPZ型のデータを格納すると自動的にUTC時間に変換して格納
- タイムゾーンを含んだ時刻を比較するための新しい日付関数が追加
- DATE_CMP_TIMEZONEZ
- TIMESTAMP_CMP_TIMEZONEZ
Enhanced VPC Routin
- VPC-S3間のCOPY/UNLOADの通信ルートを設定するための機能
- メリットはS3の通信をVPC Endpoint もしくはGateway経由に強制できる
- COPY/UNLOADの通信をVPC Flowlogでキャッチできる
まとめ
- Redshift SpectrumはS3に置いたデータをロードせずにクエリーする新機能
- Spectrum以外にも、継続的なスループット向上、分析に必要な機能、運用ユーティリティの改善が行われている
最後に
Amazon Redshift Spectrumを中心に解説して頂き、大変満足なセミナーでした。上記で紹介されていたユースケース以外に、Redshift Spectrumを使うことで VACUUMが不要になったり、大規模クラスタでは問題となるコミットキューのウエイト問題の回避に有効ではないかと考えています。
Amazon Redshift Spectrumについては、サービス開始当日に検証してブログ化しています。より具体的な使い方につきましては以下のブログも御覧ください。