絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

AWS Summit 2015 - Day1 - Redshift Deep Dive

  • AWS 八木橋さん
  • Redshiftをどうやって他システムと連携していくか

Redshiftの概要

  • LeaderNodeと並列のComputeNode

  • 超並列演算

    • CPU / disk /network /ioの並列化
  • データの格納

    • 列思考(カラムナ)
  • 各CPUコアにプロセスを張り付けていくような形で実行していく

    • ノードスライス
  • データのロード

    • COPYコマンドを実行すると、S3から直接ComputeがCSVファイルを引っ張ってくる
    • ファイル数はスロットの倍が望ましい

Redshiftの主要アップデート

  • カスタムドライバ

    • Redshift用ネイティブドライバが出た
    • PostgreSQLのドライバよりも、パフォーマンス、信頼性が高い
  • Interleaved Sort Key

    • Sort Keyを複数のカラムで指定可能になった
    • それぞれのキーがフェアに扱われるようにデータが格納される

インテグレーション

  • データ連携をどうするか

  • オンプレミスとのデータ連携

    • S3に一旦CSVをアップロード
    • オンプレミスからRedshiftへの直接insertは推奨していない
    • 不可が高い場合はDynamoなどを一旦挟んでからRedShiftへ
  • AWSサービス間のデータ連携

    • S3がハブとなり、他のサービスと連携
    • Data Pipeline
    • Kinesis
    • Lambda

サンプルシナリオ

  • シナリオ
    • RDBMSから抽出
    • S3へアップ
    • EMRに変換
    • Redshiftにロード

バッチ

  • Talendというツールを使ってみた
  • 一旦S3にアップロード
  • EMRに流してフィルタリング
  • 結果をRedShiftへ

  • Talend

Extract

  • CSVファイルとしてレコードを抽出
  • この時点で複数ファイルに分割

  • Change Data Capture - CDC

    • 差分データをどうやって検知するか
    • 日々追加されていくデータであれば難しくない
    • 差分データの抽出が難しい
      • マスターレコードのテーブル数が少ない場合、差分を割り出さずに全件抽出
      • トランザクションログからログを解析して更新できるツールもある
  • ポイント

    • 大量レコードの場合は、メモリの枯渇を防ぐためにカーソルを利用
    • 抽出後、圧縮すればアップロード時のコスト削減
    • ファイル分割数は、スロットの倍に

Upload

  • S3に並列アップロード
  • 転送時間が短縮できる

  • ポイント

    • Uploadの並列度は、クライアント側のCPUスペックを考慮
    • S3のキー(先頭4文字)をランダム化するのが理想

Transform

  • どこで実行するか?

    • AWSアップロード前にオンプレでやる
      • 転送時間、データ量の削減
      • オンプレ側にリソースが必要
    • S3内のファイルをEMRでバッチ変換
      • Redshiftからtransform処理のオフロード
      • Hadoopの知識がいる
    • SQLで一時テーブルから本番テーブルへ
      • Redshift内で全て簡潔
      • Redshiftの負荷が増加
  • Amazon EMR

  • ポイント

    • EMRで容易に実現可能
    • AWS CLIが非同期なので、pollingなどの処理が必要

Load

  • Redshiftへのロード
  • ファイル一覧や正規表現に寄るCOPYコマンドを指定したり

  • ロードに失敗したレコードはstl_load_errorsに格納

    • MAX_LOAD_ERRORを指定し、一定回数のエラーは無視
  • ポイント

    • ロード時にテーブルロックがかかるので、アクセス頻度が低いタイミングを狙う
      • ロード先のテーブルを本番テーブルと差し替えたり
    • INSERT ~ SELECT はCOPYと同様にコンピュートノードで並列処理されるので効率が良い

まとめ

  • Talendについて

    • ツール導入によるETL実装の効率化
    • Javaプログラムとしてスタンドあるんで動く
    • ツール自体の学習は必要
  • 実行ポイントを上手く分ける