[AWS Black Belt Online Seminar] Amazon Redshift Update – 最近追加された新機能と Redshift Spectrum レポート

2017.06.09

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

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を削減するデータ圧縮やゾーンマップ、ソートキーという機能があります。

20170607-aws-blackbelt-about-redshift

詳しくは 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内部のテーブルと結合することが可能で、同じように集計、フィルタできます。

20170607-aws-blackbelt-about-redshift-spectrum

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 にメタ情報を登録します。

20170607-aws-blackbelt-using-redshift-spectrum

※ ここで注意が必要なのは、Redshift Spectrum から Amazon Athena と同じデータカタログを参照していますが、Redshift Spectrum から Amazon Athena を利用しているわけではなく、全く別のエンジンで動作しています。

クエリを実行すると、Redshiftのコンピュートノードが直接 S3 をリードしているのではなく、「Spectrum層(Spectrum Layer)」という新しいサービス領域の1000台規模の仮想マシンのパワーを使って読み取ります。

手順1 S3にデータを置く

S3バケットにデータを置きます。そして、置いたS3ファイルにアクセスできるIAMロールを作成します。

20170607-aws-blackbelt-using-redshift-spectrum-1

手順2 CREATE EXTERNAL SCHEMA

CREATE EXTERNAL SCHEMA は Redshiftの外部スキーマとデータカタログ上のデータベースを関連付けや利用するIAMロールを定義して、Athenaと同じデータカタログ、もしくは独自 Hive MetaStore (実際には EMR の Hive MetaStoreです)にメタ情報を登録します。

20170607-aws-blackbelt-using-redshift-spectrum-2

手順3 CREATE EXTERNAL TABLE

CREATE EXTERNAL TABLE は Redshift の外部スキーマ内(データカタログ上のデータベース内)に外部テーブルを定義します。ファイルの種別やテキストファイルの場合は区切り文字、S3ファイルのディレクトリを指定します。

20170607-aws-blackbelt-using-redshift-spectrum-3

手順4 クエリを実行

通常のSQLが実行可能で、RedshiftのSELECT構文や関数が利用可能です。

20170607-aws-blackbelt-using-redshift-spectrum-4

クエリ実行の流れ

コンピュートノードの下にある、Spectrum層という新しい領域に対して処理を移譲(Pushdown)して、Spectrum層がノード数をクエリの量に応じて増減させながら処理を実行します。Redshiftのワークロードが Spectrum層にオフロードできることによって、Redshiftがより多くのクエリを実行したり、別の処理ができるようになります。Spectrum層はS3ファイルをスキャンするだけでなく、フィルタ、結合、集計などできるだけSpectrum層で処理して、Redshiftのワークロードを軽減します。

20170607-aws-blackbelt-redshift-spectrum-process

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のディメンジョンと結合して分析します。

20170607-aws-blackbelt-redshift-spectrum-usecase-1

なお、公式マニュアル(Amazon Redshift Spectrum クエリパフォーマンスの向上)の中でも以下のように解説されています。

大きなファクトテーブルは Amazon S3 に、使用頻度の高い小さなディメンションテーブルはローカルの Amazon Redshift データベースに置きます。

ユースケース:アクセス頻度の低いデータをS3に

アクセス頻度の高いデータはRedshift内のテーブル、アクセス頻度の低いデータをS3の外部データを参照するように使い分ける。

20170607-aws-blackbelt-redshift-spectrum-usecase-2

そうなると、全てのデータをSpectrumに置き、コンピュートノードを1台で処理できるだろうと考えるかもしれません。しかし、Spectrumはコンピュートノードのスライス単位で処理をSpectrum層に移譲するので、極端に大きなデータに対してコンピュートノード数が少ないと性能がでないことをご注意ください。

ユースケース:S3上のデータを複数クラスタで共有

これまでのRedshiftではできなかった、可能性を感じるユースケースです。S3上のデータを複数クラスタで共有ことで、ジョブ連携や同時実行性能を向上させたり、MultiAZ構成が可能になります。

20170607-aws-blackbelt-redshift-spectrum-usecase-3

パフォーマンスのベストプラクティス

パフォーマンスの向上は、読み取りデータ量をいかに減らすか重要で、読み取りデータ量(S3のスキャンサイズ)を減らすことで、AWS利用費も削減できるというメリットがあります。

20170607-aws-blackbelt-redshift-spectrum-bestpractice-for-performance

パーティショニングとは、いわゆるレンジパーティショニングの一種です。クエリのWHERE句の対象となる範囲、例えば時系列データで指定する年・月・日のような日付のような場合に、ディレクトリを年・月・日に階層的に分けて格納します。Spectrum層が読み取る範囲を減らして、速度の向上とコストの削減を実現します。

20170607-aws-blackbelt-redshift-spectrum-patitioning

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 のクエリを実行する

未サポートの機能、制約

20170607-aws-blackbelt-redshift-spectrum-restricts

参考: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については、サービス開始当日に検証してブログ化しています。より具体的な使い方につきましては以下のブログも御覧ください。