Redshiftでお手軽に1億件集計

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で作ると下記のようになります。

sod

・Salesforceデータ読み取り - データ変換 - CSV書込

Salesforceから取得したデータを必要に応じ加工し(日付書式の変換など) CSVファイルを作成します。

・S3へCSVファイルアップロード - Redshift_COPYコマンド実行

Redshiftに COPYコマンド を送信し、S3上のCSVファイルを Redshift に取り込ませます。

今回は事前に SkyOnDemand上にCSVファイルを準備しまして、 「S3へCSVファイルアップロード」 と 「Redshift_COPYコマンド実行」のみ実際に行いました。

- Redshift のテーブル定義

sod

日付型の項目が 1 つ、数値型の項目が 2 つ、それ以外は文字列型です。

- CSVファイルの内容sod

- 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文 sod

文字列項目: sourceIP の1文字目でグループ化し、数値項目: adRevenue の合計値を取得します。

・実行結果(クエリを投げてから結果を取得し終わるまでの処理時間)

まずは1000万件を対象とした集計クエリの処理時間比較(PostgreSQL と Redshift)から。

sod

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秒 未満です。

sod

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に格納できることになります。

参考ページ

● Analytics Cloud Limit (アメリカ)

● Analytics Cloud (日本の公式ページ)

● COPY コマンドを使ってデータをロードする

● データ型

● AWS re:invent2014 ペタバイトクラスデータのRedshift移行事例