SyntaxHighlighter

2012年9月9日日曜日

GoogleAppEngineのデータをGoogleBigQueryで扱ってみる

今回は再びGoogleAppEngine

今年の五月に正式版がリリースされたばかりのサービスBigQueryGoogleAppEngineを連携させてみるのが今回のテーマ。
まず、今年のGoogle I/Oで発表された「Building data pipelines at Google Scale」を紹介する。

このデモンストレーションはGoogleAppEngineのDataStoreのデータをCSVに変換し、GoogleCloudStorageにファイル出力する。そのデータをGoogleBigQueryの解析に使う。
という流れになっている。

【手順】

1.プロジェクト作成
・まず必要な準備はGoogleBigQuery APIGoogleCloudStorageを利用可能な状態にする必要がある。これはGoogle APIs Consoleから可能だ。
・TeamよりAccountSettingを行って、GoogleAppEngineからアクセスできるようにしよう。
GoogleBigQueryのプロジェクトIDを覚えておこう。#project:以降の数字部分(https://code.google.com/apis/console/?pli=1#project:111111:bigquery)

2.テストデータの準備
GoogleCloudStorageにbucketを作成しよう。ここではdatastore_csvoutputという名前で作成。
BigQueryWebUIよりdatasetの作成も行おう。ここではdatasetという名前で作成。

3.MapReduceアプリケーションを作成
・今回のプロジェクトはMapReduceフレームワークを使用して、データの作成を行う。
MapReduceのインプットデータとなるProductSalesDataのプロパティーは以下のとおりとなる。
・モックデータの作成 ・各種プロパティの設定 ・MapperPipelineを作成
MapperPIpelineのパラメータの説明をすると、
第一パラメータはpipelineの名前、第二パラメータはmap関数、次の2つのパラメータはinput_readerとoutput_readerリーダーの指定、input_readerとoutput_readerにはbucket名やACLなどのパラメータを設定することができる。最後にshard数。

続いてMap関数について
ここでは二つの事を行っている。一つはCSVフォーマットに整形しているのと、もう一つはGoogleBigQueryのdatasetとして扱う為にDateTimeのtimestampをPOSIXへと変換している。

GoogleBigQueryへデータを格納
GoogleBigQueryのdatasetへと登録するpipeline処理は下記の通りとなっている。
GoogleBigQueryサービスのAPIを使用してdatasetを格納する。その際jobの定義を行うJSONオブジェクトが必要となる。
以上で準備は完了。
・デプロイ
下記のようなハンドラーを作成する。

【実行】

・モックデータをDatastoreへ格納、pipeline処理実行
http://your-app.appspot.com/add-dataにアクセスするとデータが格納される。
続いて、pipelineを実行する。
http://your-app.appspot.com/startにアクセスするとpipeline処理が実行される。






GoogleCloudStorageに格納されたCSVファイル












このようなCSVファイルが確認できる。

BigQueryWebUIよりQueryを実行

BigQueryWebUIでインポートされたデータが確認できる。





Queryを実行してみる。








【まとめ】
今回はGoogleAppEngineGoogleCloudStorageGoogleBigQueryを連携させてみた。
興味深いのはやはりGoogleCloudStorageGoogleBigQueryの連携である。
今回はDataStoreに格納されているデータを一度GoogleCloudStorageに格納させてGoogleBigQueryにインポートという回りくどい(?)と思われる手法をとっているが、
効率的にGoogleAppEngine側のアプリケーションの出力を直接GoogleCloudStorageに行い、GoogleBigQueryにインポートの方が、効率的に思われる。
いずれにしてもアプリケーションの幅が広がることには違いない。
現在開発中のプロジェクトにも取り込みたいと思っている。
次回もGoogleAppEngine関連のエントリーにしようかな。
つづく。