お仕事でAmazon Redshiftを利用する機会がありました。その時のことをブログに書きます。(画像は公式ページからです)
Amazon Redshiftとは
AWSで提供されているクラウドデータウェアハウスです。S3に格納されたファイルや他のデータベースからデータを読み出すこと、WebアプリのバックエンドDBとしても利用することが可能です。テーブル定義としてSUPER型が定義できるのでCSVとかJSONのファイルはとりあえず読み込んでそこに突っ込むっていうことができます。COPYコマンドで一発で取り込めちゃいます。
通常のリレーショナルなデータベースとしても使用できますが遅いです。Redshiftの特徴として列指向データベースなので行を取り出すというのは苦手でグループ化したり、集計したりするのが得意です。
参考:データウェアハウス
INSERTが遅い問題
公式のドキュメントにもあるのですが、1件ずつデータをINSERTするのがとても遅いです。Amazon Aurora MySQLにINSERTするのが数ミリ秒かかるような環境で、Amazon RedshiftのINSERTには数百ミリ秒かかっていました。
参考:Amazon Redshift データベース開発者ガイド
そこで試したのは、RedshiftはPostgreSQLと互換性があり複数行INSERTに対応していたので、よくある1000行ずつINSERTする処理に変更しました。1000行INSERTは数秒かかりました。ただその時のINSERTするオーダーが100万行くらいあったのでこれではだめでした。
次に試したのは、1000行ずつファイルに出力してS3に転送してCOPYコマンドで取り込む処理に変更しました。1000個近いファイルがCOPYコマンドでの取り込みは十数秒でした。ファイルを作成してS3に転送する処理にそこそこ時間がかかりますが、それを差し引いてもCOPYコマンドが優秀なため早かったです。またCOPYコマンドはファイル一つずつ引数に指定する必要もなくS3のバケット中のディレクトリを指定するとその配下にあるファイルはすべて取り込んでくれます。
正確には測定していないですがまとめるとこんなイメージです。
・1行INSERT → 100万行×300ms/行=300000s
・1000行INSERT → 100万行/1000行×3s=3000s
・COPYコマンド → ファイル作成・転送 300s + COPYコマンド 20s = 320s
おわりに
今回はAmazon Redshiftを紹介いたしました。大量のデータファイルを扱うときや集計するようなシステムを構築するときは検討に入れるといいと思います。今後こう言ったシステム構築の依頼が増えるのかなとも思いました。