Skip to content

Instantly share code, notes, and snippets.

@odasatoshi
Last active August 29, 2015 14:16
Show Gist options
  • Save odasatoshi/bf6cd54894af02fa3d67 to your computer and use it in GitHub Desktop.
Save odasatoshi/bf6cd54894af02fa3d67 to your computer and use it in GitHub Desktop.
embulk-output-redshiftを調べた

embulk-output-redshiftメモ

できること

embulkが動作しているEC2やローカルのマシンからRedshiftにロードする。

https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-redshift でのソースコードを確認する限り、

  1. ローカルからS3にファイルを分割アップロードする。
  2. ローカルからRedshiftのマスターノードにCOPY文を発行する
  3. RedshiftクラスタがS3からファイルを指定したテーブルにロードする。 というフローになっている。

embulk

ここでは、ローカルからS3にアップロードするときには分割アップロードを実施することで アップロード速度が上がっているが、S3からRedshiftにロードするところは、通常のファイル転送が行われていると推測される。 そのため、Redshiftクラスタへのロードがボトルネックになる可能性がある。 (S3からRedshiftへのロードはAWS内で行われているためあくまでも推測であるが、  RedshiftはS3にあるクライアントサイド暗号を実施したファイルもロードできるため、ファイル内で並列化ロードは行われていないと推測される。  AES-CBCモードは前から順番にデータを暗号・復号する必要が有るため、並列処理は難しい) 当然、ひとつのテーブルに複数のCOPY文を走らせてもテーブルロックがかかるのであまり意味が無い。テーブルを分けてロードしてからRedshift上でETL処理をするのだろう。ただ、Redshiftはひとつのクラスタにつき9900個しか永続テーブルを持てないので、気をつける必要がある。 http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_CREATE_TABLE_usage.html

Redshiftで、S3から並列にCOPYを行うことはもちろん可能である。 ひとつは、S3のファイルを指定する所に*などを使って分割ファイルを使う方法。 もう一つは、S3上のファイルのパス一覧を記載したmanifestファイルを作成し、そのファイルを指定する方法である。 http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/loading-data-files-using-manifest.html

manifest

この場合、S3にアップロードが完了しても、ある程度ファイルが貯まらないとCOPYが走らないようになるため、 スループットは上がるがレイテンシは下がる。なので使い分けが必要と考える。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment