BigQueryってなんぞ?
Google I/O 2010では、Google Storageと合わせて利用する新機能「BigQuery」が発表されました(これもApp Engineとは個別のプロダクトです)。ひとことで言えば「何100億件のデータも数秒〜数10秒で集計できる、大規模並列クエリサービス」です。既存のOLAPやデータウェアハウスに相当するもので、更新処理には使えません。
MapReduceとはどう違う?
大規模なデータセットに対して多数のサーバで並列処理するという点ではMapReduceに似ていますが、処理結果がすぐに得られる点、そしてSQLっぽいクエリ言語で表現できる集計処理しか実行できない(mapperやreducerを定義してデータを任意の方法で加工したりできない)点がMRとは異なります。MRよりさらに高水準の分散処理サービスです(MR+Hiveに近いかもしれません)。
リンク集
特徴
以下、公開されているドキュメントとGoogle I/O 2010のセッションをもとにまとめてみました(カッコ内は筆者の感想です)。
- BigQueryとは
- 大規模データセット(数TB、数兆件規模)に対して短時間(数秒〜数10秒)で対話型の集計処理が可能なサービス
- Google社内でも様々に利用している
- 制限
- OLTP用途には使えない
- 複数テーブルのjoinはできない
- ピボット分析はサポートしない
- インポート作業はいまのところGooglerに依頼して手作業で実施(いずれ自動化予定)
- ネットワークモニタリング分析のデモ
- M-Labではインターネットトラフィックの統計データを一般公開している(約600億件)
- このデータをBigQueryにインポートした
- クエリのデモ:SELECT COUNT (*) FROM [bigquery/tables/mlab/v1]
- (10秒もかからずに全件カウントが返って来た!すごす!)
- もうひとつのデモ
- Googleが保有するWebコーパスデータから「cheese」を含む件数をカウント
- Google DocsスプレッドシートからBigQueryを呼び出し、集計結果を表とグラフに即時表示(かっこいい!)
BigQueryのAPI
BigQueryのクエリ構文
- SQLのサブセットを記述する
- - SELECT ... FROM ... WHERE ... GROUP BY ... ORDER BY ... LIMIT ...
- M-Labデータに対する「ユーザー数のカウント」の例:
SELECT COUNT(DISTINCT web100_log_entry.connection_spec.remote_ip) AS num_clients FROM [bigquery/samples/mlab] WHERE IS_EXPLICITLY_DEFINED(web100_log_entry.connection_spec.remote_ip) AND IS_EXPLICITLY_DEFINED(log_time) AND log_time > 1262304000 AND log_time < 1262476800; num_clients
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
BigQueryのデータモデルとアーキテクチャ
BigQueryでは、以下のようなJSONっぽい(追記:しかしよく見るとかなりJSONと違う!)データモデルを取り扱います。
record { f1: X m1 { f2: a f2: b f2: c } r1 { m2 { f3: 1 f3: 2 } m2 { f3: 3 f3: 4 f3: 5 } } } record { f1: Y ...
こうしたデータに対して、以下のようなかたちでクエリを実行できます。
SELECT f1, COUNT(r1.m2.f3) WITHIN RECORD AS cnt FROM [Table];
このクエリは、「Tableテーブルについて、個々のrecord内のr1.m2.f3の数をカウントしてf1ごとに返す」という意味になります。結果は以下の通り。
+----+-------+ | f1 | cnt | +----+-------+ | X | 5 | | Y | 7 | | Z | 2 | +----+-------+
これらのドキュメントから判断するに、BigQueryのデータモデルはリレーショナルモデルではありません。joinもできません。非正規化されたツリー構造データ(XMLに似ている?)に対して問い合わせする独自データモデル+言語と捉えてよいでしょう。
そして肝心のポイント――どうやってそんなに速くクエリできるの?――ですが、MLで聞いてみたところ、
Kaz, Thank you for the interest in BigQuery. We don't comment on the backend details of BigQuery. What I can say is that we are running BigQuery on thousands of machines. The 60 B records were imported as part of a sample dataset. We don't have numbers to share at this point regarding the time taken to import the dataset. thanks Amit
という回答。つまり詳細なアルゴリズム(例えば事前に集約処理しているか等)は教えてくれませんでしたが、数1000台規模の並列クエリ処理であることは間違いないようです(クラウド破産しそうw)。またインポート時間についても上述のとおりノーコメントでした。
@ashigeru さんのコメントまとめ
BigQueryについて@ashigeruさんにいろいろコメントをいただいたまとめです:
- Togetterまとめ「BigQueryってなんぞ」
という感じで、BigQuery面白いですねぇ。。600億件の集計を数秒でこなすデモを見たときはぞくっとしました。どんなズルしてるのだろう〜と勘ぐりましたが、意外に力業な大規模並列クエリを実行しているようです。価格設定の発表に期待です。これまで超高額な製品群(Hyperionとか?)が席巻していたOLAPやDWH、Business Intelligence市場においてもクラウドの価格破壊を起こせるか興味深いところです。