Posted at

AWS認定Big Data勉強記 - 6: Amazon Redshift

こんにちは、えいりんぐーです。

今回はRedshiftについてまとめます。


Q: Amazon Redshift とは何ですか?

Amazon Redshift は高速で完全マネージド型のデータウェアハウスです。標準 SQL および既存のビジネスインテリジェンス (BI) ツールを使用して、すべてのデータをシンプルかつコスト効率よく分析できます。洗練されたクエリ最適化、列指向ストレージ、高パフォーマンスのローカルディスク、および超並列クエリ実行を使用して、ペタバイト単位の構造化データに対して複雑な分析クエリを実行できます。


参考資料

基本的に以下の資料をもとにしています。


仕組み


  • クラスター


    • リーダーノード


      • コンピュートノードの管理

      • クライアントとのやりとり

      • クエリの最適化



    • コンピュートノード


      • データの保存

      • クエリの実行





  • 超並列処理: Massive Parallel Processing


    • 1つのタスクを複数のノードで分散して実行する

    • ノードの追加でスケールアウト



  • シェアードナッシング


    • ディスクをノードで共有しない

    • ノードの増加に対して、ディスクがボトルネックにならない



  • 列指向型のデータ保管

  • データの圧縮


    • 圧縮アルゴリズムは列ごとに指定できる



  • ゾーンマップ


    • ブロック単位でデータを格納

    • ブロック内の最小値と最大値をメモリに保存




ノードタイプ

Dense Compute (dc2): 費用対効果が良い

Dense Storage (ds2): ストレージあたりの費用が低い

タイプ
CPU
メモリ
ストレージ
スライス
ノード数
価格
リサイズ幅

dc2.large
2
15
0.16TB SSD
2
1~32
$0.314/h
1/2倍と2倍のみ

dc2.8xlarge
32
244
2.56TB SSD
16
2~128
$6.095/h
同上

ds2.xlarge
4
31
2TB HDD
2
1~32
$1.190/h
1/2倍から2倍の間で任意の値

ds2.8xlarge
36
244
16TB HDD
16
2~128
$9.520/h
同上


  • 価格に関しては2019年1月時点


データ保護


  • クライアントとRedshiftの通信をSSLで暗号化可能

  • 保管中もAES-256で暗号化する


    • Redshift管理の鍵だけでなく、顧客管理のHSMや、AWS KMSの利用も可能



  • データウェアハウスの自動バックアップがデフォルトで有効


    • 保存は1日。35日まで変更できる



  • AZが機能停止したら、クラスターも使用不可能になる


    • スナップショットから他のAZに復元は可能

    • Redshift自体のマルチAZは現在非対応




パフォーマンスの最適化


  • ディスクIOの削減


    • 適切なデータ型

    • データ圧縮


      • LZOが多くのケースで有効


      • ANALYZE COMPRESSION コマンドで推奨を確認できる



    • アクセス範囲の制限


      • SORTKEYによってデータが順に格納される


        • 頻繁に範囲・等式検索される列に有効



      • Interleaved Sort Key


        • 複数の列をソートキーに指定できる

        • 複数のキーがAND条件で検索される時などに有効





    • データの平準化


      • ノードのデータサイズを均一にする





  • データ転送の最小化


    • データ分布の選択


      • EVEN: 均一に分散。基本はこれ

      • KEY: 同じキーを同じ場所に。カーディナリティが高いと有効

      • ALL: 全ノードにデータをコピー



    • コロケーション


      • ジョインされやすい列をDISTKEYに設定する

      • ALLでテーブルを作成する






運用


  • S3にデータを置く

  • COPYコマンドでロードする


    • エンコーディングが定義されていなければ自動で圧縮

    • IAMロールの利用が可能

    • gzip, bzip2, lzo, zstdで圧縮すると効率化

    • ファイル分割で効率化



  • Analyze & Vacuumで効率化


    • テーブルの統計情報はクエリプランの決定に使われる


    • ANALYZE コマンドで統計情報を最新に保つ


      • PREDICATE COLUMNSオプションを使うことで、WHERE句に使われた列だけを対象とすることができる



    • Redshiftのデータは追記型


      • 削除がマークされるだけでディスク上はデータが残る




    • VACUUM コマンドで不要領域を削除(コンパクション)する


    • ANALYZEVACUUMはバックグラウンドスケジュール実行できる




  • ALTER TABLE APPEND


    • ソース表をターゲット表に移動する


    • CREATE TABLE ASINSERT INTO よりも高速



      • CREATE TEMP TABLEではDIST KEYやSORT KEYを指定できるので、ロードを速くできる





  • バックアップ


    • ディスクイメージをS3へバックアップする

    • 他リージョンへの作成可能

    • KMS暗号化済みのスナップショット転送にも対応



  • データの抽出


    • 大量のデータをファイル抽出したい時は UNLOAD を使用する


    • ENCRYPTED オプションで抽出データを暗号化できる




データのロード

S3以外のデータソースからもデータをインポートできる。


  • DynamoDB

  • EMR

  • Glue

  • Data Pipeline


ポイント

Elastic Resize

クラスターをオンデマンドで迅速に伸縮する。

Workload Management (WLM)

実行時間の長いクエリはクラスタ全体のボトルネックになるので、WLM毎にクエリ並列度の上限を設けたキューを定義する。キューで並列度を保証する。リソース競合の可能性は残る。concurrency や memory to use のように Redshift を再起動せずに変更できるパラメータと、 user groups や query groups のように再起動が必要なパラメータがある。

Data Migration Service

ターゲットとして Redshift が対応可能。

Query Monitoring Rules (QMR)

WLMの拡張で、クエリに関するルールを作成して、違反したクエリに対してアクションを実行する。ルール: CPU使用率・ジョイン対象行数など。アクション: LOG/ABORTなど。

CTASにおける自動圧縮

2017年のアップデートで、CTASで作成される表の列は全てLZOで圧縮される(例外あり)。

UDF User Logging

RedshiftはPythonでUDFを作成できる。loggerに出力したエラーログを自動的にRedshiftに蓄積できる。

Enhanced VPC Routing

VPC-S3間のCOPY/UNLOADの通信ルートを調整するための機能。メリット: S3への通信を特定のVPCエンドポイントまたはゲートウェイ経由に強制できる。

ショートクエリアクセラレーション (SQA)

機械学習によってクエリの実行時間を予測。ショートクエリと判断されたクエリは専用のキューにルーティング。リソースを動的に確保。

リザルトキャッシュ

リーダーノード内のキャッシュにクエリ結果が含まれている場合、コンピュートノードで処理をせずに返却。


その他


向き


  • データウェアハウス


    • 数百GB ~ PB



  • OLAP


    • 複雑だが同時実行数の少ないSQL

    • 頻繁でないデータ更新



  • 構造データ


不向き


  • 同時実行数の多いSQL


    • RDSが良い



  • 低レイテンシー


    • RDSかElastiCache



  • ランダム・パラレルなアクセス


    • RDSかDynamoDB



  • データを格納するが集計はしない


    • RDSやDynamoDB




EMRとの使い分け

RedshiftもHadoopもクラスター上に作成されるが、その使い分けとは


  • EMR


    • データが非構造な時

    • Hive, Spark, Prestoなどが使いたい時

    • 機械学習・データ変換・ストリーミング処理をしたい時



  • Redshift


    • 構造的な大規模データを扱う時

    • SQLだけが使えればいい時