Salesforceプラットフォームには、購入するSalesforceライセンスの種類およびユーザ数により、数千万件以上のレコードを格納することが可能です。
ただし、ガバナ制限により5万件を超えるレコードを1回のSOQLクエリにより集計することはできません。 ( Summer'15 時点)
@ReadOnlyアノテーションを付けた場合は5万件以上も集計可能ではありますが、大量件数を対象に集計した場合、レスポンスが遅いかもしれません。 ※「50000万件以上」と誤っていたところを「5万件以上」に訂正いたしました。(2015/07/04)
日本で今年リリースすることが予定されている Analytics Cloud は、まだ試せてはいませんが、すでにリリースされているアメリカの公式ヘルプページでは、1platformライセンスあたり、1データセットで2億5千万件まで格納可能という記述があり、日本の公式ページには 「高速な検索ベースのクエリエンジン」 「大規模な並列インフラストラクチャ」とあります。 明示的な記述はありませんが、大量データの高速集計も得意だとうれしいですね。
Analytics Cloudの日本での正式リリースが待てない大容量データの集計ニーズがある場合、現時点での一つの選択肢としてRedShiftがあります。
今回はAWS の データウェアハウス である Redshift がどれほどの性能なのか簡単に検証してみました。
Redshift とは
Redshift のリリースからある程度時間も経ち、世の中に Redshift の記事がそれなりにありますので簡単に特徴だけ説明すると、
1. 大量データの高速集計が得意な RDB である。
- PostgreSQL がベースの RDB です。
- PostgreSQL ですと、1000万件の集計クエリ(group by)で60秒を超えます。
※PostgreSQL 9.0デフォルト設定で測定
Redshift ですと最安構成($0.310/h, 2015/06/25時点では一番安い構成のオンデマンドインスタンス) でも 2秒 かかりません。
2. 簡単にスケールアップ、スケールアウトができる。
- 普通の RDB でクラスタ構成を組もうとすると、高度な専門知識が必要ですが、 Web画面の AWS Mangerment Console で ほんの数クリックでスケールアップ、スケールアウトできます。
- マルチコアCPUや複数台サーバによる並列処理に最適化されているため、 スケールアップ、スケールアウトしたときにリニアに性能が向上します。
※5台並列構成を試したところ、5倍の処理速度向上が確認できました。
3. バックアップが容易
- 自動で AWS S3 にスナップショットが作成されます。
もちろん、マニュアルでも作成可能です。
4. PostgreSQL と比べて、いくつか制約がある。
- ユニーク制約が効きません。
- 行ロックができません。
- 使用可能なデータ型が PostgreSQL より少ないです。
検証内容は下記の2つです。
・CSVファイル1億件 の Redshift へのロード
・集計クエリ実行 (集計対象の件数増加による、応答性能の変化を確認)
CSVファイル1億件 の Redshift へのロード
JDBC, ODBC経由で1件ずつ INSERT することも可能ではありますが、 この方法は速度が遅いため、ある程度以上のデータボリュームを1回でロードするには適していません。
AWS DynamoDB以外のデータを Redshift に高速にロードするには S3 を経由する方法が最適です。
実装例として Salesforce からデータを取得して、Redshift にそのデータをロードするまでの処理を 弊社のSkyOnDemandで作ると下記のようになります。
・Salesforceデータ読み取り - データ変換 - CSV書込
Salesforceから取得したデータを必要に応じ加工し(日付書式の変換など) CSVファイルを作成します。
・S3へCSVファイルアップロード - Redshift_COPYコマンド実行
Redshiftに COPYコマンド を送信し、S3上のCSVファイルを Redshift に取り込ませます。
今回は事前に SkyOnDemand上にCSVファイルを準備しまして、 「S3へCSVファイルアップロード」 と 「Redshift_COPYコマンド実行」のみ実際に行いました。
- Redshift のテーブル定義
日付型の項目が 1 つ、数値型の項目が 2 つ、それ以外は文字列型です。
- 1億件CSVデータ詳細
75万件、125MBの CSVファイルを 130個 計 16.3 GB
- 処理時間
1ファイルのS3アップロード + COPY実行1回につき、約30秒 130ファイルで合計約70分
S3へのアップロードとCOPY実行をシーケンシャルに1つずつ実行したので70分ほど要しましたが、 RedshiftのCOPY処理は並列実行可能なので、だいぶ改善の余地はあります。
それでもたったの 70分 で CSV 16.3 GB 1億件 を Redshift にロードできました。
集計クエリ実行
・実行した SELECT文
文字列項目: sourceIP の1文字目でグループ化し、数値項目: adRevenue の合計値を取得します。
・実行結果(クエリを投げてから結果を取得し終わるまでの処理時間)
まずは1000万件を対象とした集計クエリの処理時間比較(PostgreSQL と Redshift)から。
PostgreSQL, Redshiftともに計測したのは 150万件、460万件、1150万件です。
PostgreSQL環境(EC2) :
インスタンスタイプ: C3.LAEGE
vCPU:2
ECU:7
メモリ:3.75GB
OS: Windows 2008 R
PostgreSQLバージョン: 9.0
設定はデフォルトのまま。
Redshift環境 : dw2.LARGE
vCPU:2 ECU:7
メモリ:15GB
設定はデフォルトのまま。
PostgreSQLでは 1150万件の実行時間が 2分近くかかっています。 画面で集計ボタンを押して 2分待たされるというのはかなり遅く感じますね。 Redshift の最安構成では1150万件で 2秒 未満です。
1億件の集計については、Redshiftの最安構成での測定とともに、5台並列構成での測定も行いました。
最安構成 ($0.310 / h) ですと、クエリの応答時間は 13秒 ほどでした。 さすがに1億件対象だと1分ぐらいはかかるかと思っていたのでビックリなパフォーマンスでした。
最安構成の5台並列 ($1.550 / h) ですと 3秒弱 で終了しました。 スケールアウトによるリニアな性能向上が確認できました。
まとめ
今回のRedshift検証でかかった AWS費用は 約$86 でした。
内訳:
Redshift $81
S3利用料 $1未満
データ転送利用料 $1未満
AWSサポート料(5%) 約$4
今回行ったデータロード、クエリ検証に加えて、BIツール Tableau でロードしたデータで 少し遊んでも上記のAWS費用でした。
単純なgroup byのみでなく、join やソートも相当に速いとの情報があります。 世の中にはIoTでの活用事例もありますので、Redshiftに少しでも興味を持っていただいたのなら ぜひ試してみてください。
補足情報
今回の検証は 2015/06 に実施したときの結果です。
最安構成では HDD の容量制限が 160GB です。 今回の1億件テストデータをロードした状態で、ディスク使用量は 6GB未満 でした。 単純計算では今回と同じテーブル構成で余裕をもって20億件はRedshiftに格納できることになります。