[AWS]S3からRedshiftにデータをロード&RedshiftからS3へデータ出力
S3からRedshiftにデータをコピーする
前回はAmazon RedshiftをCLIから起動し、nodeプログラムからアクセスしてみました。 Redshiftにはこういった直接アクセスする手法だけでなく、S3やDynamoからデータをロードしたり、逆にS3やDynamoへ出力する機能があります。 今回はS3のファイルからRedshiftのテーブルに対してデータを追加とS3へのデータ出力を行なってみましょう。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.8
Redshiftクラスタやnodeのpgモジュールは前回を参考にセットアップしておいてください。
Amazon S3とRedshiftでデータのやり取り
Redshiftにテーブルを作成
では、RedshiftへS3からデータを登録してみましょう。 まずはRedshiftに対してテーブルを作成しておきます。下記のようなプログラムで作成してもかまいませんし、postgres用クライアントで接続してもかまいません。
var pg = require('pg'); var conString = "tcp://<ユーザー名>:<パスワード>@<endpoint>:<ポート番号>/<DB名>"; var client = new pg.Client(conString); client.connect(function(err) { if(err) console.error(err); }); var query = client.query("CREATE TABLE data_from_s3(id integer,name varchar(50), timestamp timestamp not null default current_timestamp)"); query.on('error', function(error) { console.error(error); }); query.on('end', function(row, error) { client.end(); });
data_from_s3という名前で、idカラム、nameカラム、timestampカラムを持つテーブルを作成します。
S3へオブジェクトアップロード
data_from_s3テーブルへ登録するデータを記述したファイルをS3へ登録します。 csvファイルのように改行で1レコード、デフォルトでは「|」がdelimiterとしてデータを記述します。 下記のように記述すると、5レコード分のデータを記述したことになります。このファイルをusers.txtと名前をつけ、S3へアップロードしておきます。
1|taro|2010-01-12 14:15:57.119568 2|hanako|2011-03-10 12:13:17.372616 3|takeshi|2008-01-12 10:10:57.784833 4|jon|2009-03-30 10:34:57.3954958 5|yuki|2013-10-22 18:44:55.585858
copyコマンドでS3からRefshiftへ
copyコマンドを実行することで、S3のファイル内容をReedshiftへ登録することができます。 S3とRedshiftは同じリージョンでなければいけません。また、1レコードのサイズは4MBまでと制限されています。
・ ・ var query = client.query("copy data_from_s3 from 's3://<S3のtxtファイルパス>' credentials \'aws_access_key_id=<アクセスキー>;aws_secret_access_key=<シークレットキー>\' timeformat 'YYYY-MM-DD HH:MI:SS'"); query.on('error', function(error) { console.log(error); }); query.on('end', function(row, error) { client.end(); });
上記プログラムを実行すると、S3にアップロードしたデータがRedshiftに登録されます。 select文で登録されたのを確認してみましょう。
・ ・ var query = client.query("SELECT * FROM data_from_s3"); query.on('row', function(row) { console.log(row); }); query.on('error', function(error) { console.log(error); }); query.on('end', function(row, error) { client.end(); });
Redshiftへ登録されているのを確認したら、今度は逆に、S3へRedshiftの内容を出力してみましょう。 unloadコマンドを使用すれば、S3へデータ内容が出力されます。 出力用バケットを作成し、そこへRedshiftのデータを出力してみましょう。
・ ・ var query = client.query("unload ('select * from data_from_s3') to 's3://<出力先S3のパス>' credentials \'aws_access_key_id=<アクセスキー>;aws_secret_access_key=<シークレットキー>\'"); query.on('error', function(error) { console.log(error); }); query.on('end', function(row, error) { client.end(); });
まとめ
いかがでしょうか。S3からRedshiftへの登録、逆にS3への出力もコマンド1つで簡単に実行できました。 なお、今回はS3データをtxtファイルで用意しましたが、gzipオプションを使用すると、gzip圧縮されたファイルを指定することができます。
参考サイトなど
- Amazon Redshift: http://aws.amazon.com/jp/redshift/
- Copy from Amazon S3: Copy from Amazon S3
- Copy to Amazon S3: Copy to Amazon S3