Amazon RedshiftのUNLOADコマンド: PARALLELオプションで出力ファイルを一括化
先日5/6に、Amazon RedshiftのUNLOADコマンドに関する機能改善が発表されました。UNLOADコマンドとは、Redshiftクラスタ内のテーブルに格納されているレコードをエクスポートする際に用いるコマンドになります。
- Release: Amazon Redshift on 2014-05-06 : Release Notes : Amazon Web Services
- UNLOAD - Amazon Redshift
このエントリでは、そのUNLOADコマンドに追加されたオプション機能『PARALLEL』についてその内容を確認してみたいと思います。
UNLOADコマンドでPARALLEL OFFコマンドを使う事によって出力ファイルを1つにまとめる事が出来るようになった
内容としては上記見出しのポイントに尽きます。では早速試してみましょう。まずは既存の状態から。テーブル容量=2.4GB程のテーブルに対して全件取得した内容を、所定のS3バケットにプレフィックスを付けてアンロードしてみます。
# \timing タイミングは on です。 # UNLOAD ('SELECT * FROM sampletable') TO 's3://unload-files/sample-table-' # CREDENTIALS 'aws_access_key_id=XXXXXXXXX;aws_secret_access_key=XXXXXXXXX' # DELIMITER ',' ADDQUOTES GZIP; UNLOAD 時間: XXXX.XXX ms
コマンド実行後のS3バケットを確認してみます。ファイルはこのような形で出力されました。
次いでPARALLEL OFFオプションを付けて実行してみます。オプションを指定しない場合よりも時間は掛かっているようでした。
タイミングは on です。 # UNLOAD ('SELECT * FROM sampletable;') TO 's3://unload-files/sample-table-' # CREDENTIALS 'aws_access_key_id=XXXXXXXXX;aws_secret_access_key=XXXXXXXXX' # DELIMITER ',' ADDQUOTES GZIP # PARALLEL OFF; UNLOAD 時間: XXXX.XXX ms
実行のS3バケットの様子(上記処理で生成されたファイル群は削除した上で実行しています)。確かに1つにまとめられてますね!
テーブルデータサイズが所定の容量を超える場合は、追加でファイルが生成される
一方で、上記の様にテーブルのサイズが一定量を超える場合は、これまで同様にファイルが分かれた形で生成されるようです。こちらも試してみましょう。
大きめの容量となっているテーブルに対し、UNLOADを実行してみます。
タイミングは on です。 # UNLOAD ('SELECT * FROM sample_big_table;') TO 's3://unload-files/sample-big-table-' # CREDENTIALS 'aws_access_key_id=XXXXXXXXX;aws_secret_access_key=XXXXXXXXX' # DELIMITER ',' ADDQUOTES GZIP # PARALLEL OFF; UNLOAD 時間: XXXX.XXX ms
実行後。確かに、指定の6.2GBを超えるファイルが生成される場合は追加でファイルが生成されていますね。
まとめ
以上、RedshiftのUNLOADコマンド新機能『PARALLELオプション』について試してみました。
正確な時間までは測っていないですが、このオプションを使わない時と使う時では、使った時の方がだいぶ時間が掛かる印象でした。従来であれば小さめのファイルを適宜出力していた所に対しファイルを連結する、大きなファイルを作成しているという点で処理に対してリソースを費やしているのでしょうか。ともあれ、エクスポートファイルの個数がコンパクトになるのは管理上嬉しい面でもあります。状況に応じてこれらのパラメータを上手く使って管理して行きたいところですね。