Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

BigQueryの事始め。Web Consoleと戯れる。

Burikaigiも終わり、引っ越しも落ち着いたので、ようやく中途半端に書いていたBlogをせこせことまとめています。

今回はGoogleが提供する、これだけでもGCPGoogle Cloud Platform)を使う価値があるであろう、BigQueryについてまとめてみました。

f:id:sugimomoto:20180212235937p:plain

cloud.google.com

BigQueryとは?

Googleが提供する「フルマネージドのエンタープライズ向けアナリティクス データ ウェアハウス」です。

2012年にリリースされているものですが、もともとGoogleの内部でGmail検索エンジンなどのビッグデータ処理に使われいたものを、フルマネージドサービスとして提供したのが始まりとのこと。

そのためペタバイト級のデータも数秒で処理することが可能と、あまりにも私が扱うデータ量からはかけ離れすぎて、実感が持ちづらいサービスです。

そんななかでも、わかりやすいBigqueryのデモが以下のYoutubeかと。120億行の正規表現マッチ付き集計が5秒で完了・・・。これは・・・早い・・・。

www.youtube.com

さすがに120億とは行きませんがサンプルデータとして、Wikipediaのデータ(313,797,035件、約3億件 35.7GB)が提供されているので、部分一致検索を試してみたところ、1.6秒・・・。早いですねー。

f:id:sugimomoto:20180213000032p:plain

それ以外にも特徴として、基本的にはRDBと同じような形でSQLベース(ただし、BigQuery用として作られたスーパーセットのため、ある程度方言はあり)で扱えること

ストレージ・クエリ実行時のデータ量単位での使いやすい料金(安いかどうかは使い方次第)

REST APIや各種ライブラリ(C#JavaRubyPython・GO・Node.js・PHP)の提供

などなど、開発者が扱いやすい環境がかなり整っているサービスです。

読んでおくといい感じの資料

以下、今回の記事を書くにあたって、参考にさせてもらいました、おすすめの資料です。

■ウェブ UI を使用したクイックスタート

https://cloud.google.com/bigquery/quickstart-web-ui?hl=ja

公式のクイックスタート。今回の記事の参考にさせてもらいました。結構丁寧なので、はじめに触ってもとっつきやすいと思います。


www.slideshare.net

課金については、このスライドが一番わかりやすいです。


www.task-notes.com


www.slideshare.net


qiita.com

個人的に一番オススメの資料。中の人のQiita記事。なぜBigqueryがやばいのかよくわかる。

■はじめの一歩が踏み出せない人のためのBigQuery入門

https://apps-gcp-tokyo.appspot.com/bigquery-introduction/

今回やってみたこと

とりあえず、基本となるWeb ConsoleベースでのSQLの実行とDataset・Tableの作成方法

および、主な課金の要素をまとめてみました。

基本的なSQLの実行方法

前述の通り、BigQueryは様々なプラットフォームから実行できますが、同じような操作をWeb Consoleベースで実行できるので、今回はこれを使って試したいと思います。

それと、先のWikipediaデータのように予めHello Worldを始めやすいサンプルデータセットが提供されているので、それを使ってまず触ってみましょう。

GCPのアカウントとプロジェクトは作成しておいてください。

以下のGoogle Cloud Platformにログインして、左ナビゲーションからBigQueryをクリック

Google Cloud Platform

f:id:sugimomoto:20180213000233p:plain

BigQueryのWeb Console画面が立ち上がるので、[Compose Query]クリックして、とりあえず単純なSELECT Queryを実行したいと思います。

f:id:sugimomoto:20180213000256p:plain

Queryを記述するウインドウが表示されるので、以下のクエリを貼り付けます。

#standardSQL
SELECT
 weight_pounds, state, year, gestation_weeks
FROM
 `bigquery-public-data.samples.natality`
ORDER BY weight_pounds DESC LIMIT 10;

詳しくは後述しますが、BigQueryはクエリ実行時のデータ量によって、課金が行われます。

その際の指標になる処理データ量を確認するのが、画面左下にあるチェックマークです。

これをクリックすることで、SQLのバリデーションと共に、処理される予定のデータ量が計算されます。

f:id:sugimomoto:20180213000305p:plain

上記クエリを実行時に処理されるデータ量は「3.49GB」でした。

これでRun Queryをクリックすると、以下のように処理結果が表示されます。普段SQLを書いている人であれば、馴染み深いインターフェースではないでしょうか。

f:id:sugimomoto:20180213000314p:plain

ちなみにテーブル全体のデータ量やカラムの情報は左ナビゲーションメニューから確認できます。

今回使用したのは、Public DatabaseのSamplesにある「Natality」というデータです。

ここを選択して、[Details]タブをクリックすると、データ件数などテーブルの細かな情報が確認できます。

f:id:sugimomoto:20180213000321p:plain

Dataset・Tableの作成

先程はサンプルのデータをそのまま使いましたが、今度は実際に一から作ってみたいと思います。

データはBigquery用のサンプルのデータが以下のURLから提供されているのでこれを使います。

http://www.ssa.gov/OACT/babynames/names.zip

まず、最初にデータセットRDBで言うところのデータベース)を作成します。

プロジェクト名の[▼]をクリックして、[Create new dataset]をクリックし

f:id:sugimomoto:20180213000407p:plain

任意の名前をつけて作成します。

ロケーションは2018年2月現在ではUSとEUの2つのリージョンから選択できます。

Data expirationはデータが削除されるまでの日数です。BigQueryはクエリだけでなく、データを保持するのにも課金が発生するので要注意です。今回は5日間で削除されるようにしました。

f:id:sugimomoto:20180213000415p:plain

これで、DataSetの作成は完了です。

続いて、テーブルを作成します。テーブルの作成はいろんなアプローチがありますが、今回はWeb ConsoleからCSVファイルベースでファイルをアップロードしつつテーブルを作成する方法で行います。

先程作成したDatasetの横に表示される[+]ボタンをクリックすると、Table作成画面が表示されるので、Chose FileからダウンロードしておいたCSVファイルを選択します。

f:id:sugimomoto:20180213000954p:plain

次にカラムの指定ですが、一度Edit as Textをクリックして、以下のテキストを貼り付けます。

今回はヘッダーが無いCSVファイルなので、以下のようにカンマ区切りでカラム名と型を指定しています。

name:string,gender:string,count:integer

f:id:sugimomoto:20180213001316p:plain

貼付け後、Create TableをクリックすればOKです。

f:id:sugimomoto:20180213001322p:plain

作成されました。

f:id:sugimomoto:20180213001429p:plain

Previewで見てみると、定義したカラムと一緒にCSVファイルも同時にデータとして登録されていることがわかるかと思います。

f:id:sugimomoto:20180213001445p:plain

課金について

BigQueryの課金については、主に以下の3種類の操作・管理を行うことで発生します。

・ストレージ(永続と非永続で値段が違う)

・ストリーミングインサート

・クエリー

f:id:sugimomoto:20180213001638p:plain

https://cloud.google.com/bigquery/pricing?hl=ja

2018年2月12日現在、1ドルあたり「108円(小数点以下切り捨て)」として、ちょっとまとめてみます。

[ストレージ]はわかりやすいですね。データの保管時にかかる費用です。

1GBあたり、永続であれば0.02ドル

最初のWikipediaが313,797,035件、約3億件 35.7GBなので、1ヶ月あたり77.112円。安い!12ヶ月使っても925.344円と1000円いきません。

[ストリーミングインサート]はデータの登録時の費用。ちょっと高めです。

1GBあたり、0.05ドル

例えば1日1GBのデータが発生して、BigQueryにインサートしたとしたら、1ヶ月で1.5ドル、日本円で162円。年間1944円となります。

ちなみにこのストリーミングインサートとは、SQL のInsert文もしくは、REST APIやライブラリからのInsert処理を実行した場合に課金されるものです。

今回Tableを作るのにCSVをベースで実行しましたが、これは課金対象には含まれません。なので、用途や処理したいデータの種類に合わせて、どんなデータ追加方法を取るかは色々と検討の余地ありです。

[クエリ]は一番気をつけないといけない要素。SQL実行時の費用です。

クエリ1回、1TB(1000GB)あたり5ドル(540円)なので1GBあたり0.005ドル(0.54円)

最初に紹介した以下のクエリ、3.5GBだと、1.89円が1回分の消費となるみたいです。

f:id:sugimomoto:20180213002743p:plain

ちなみにこの算出方法ですが、BigQueryが列指向データベースのため、SelectやWhereなどの条件で指定されたカラムに比例します。

なので、これでSelect文にワイルドカードを使おうものなら、以下のように「21.9GB(11.826円)」と、10倍くらいのお値段になります。

f:id:sugimomoto:20180213002908p:plain

ちなみに、最初のクエリから列を一つ削ると「2.5GB」まで縮小されました。

f:id:sugimomoto:20180213001539p:plain

これがやっぱりチリツモな感じかつ、最終的にBIツールに落とし込むのであれば、経過データとして逐次取得したいと思うので、1回10円だったとしても1日5回やれば1ヶ月1500円、年間18,000円です。

BigQueryで多額のお金を溶かした人も居るらしいので要注意。

ただ、ここも色々と節約ポイントがあるらしく、キャッシュされたデータで実行できるクエリであれば課金されないだったり、テーブルを分割するアプローチだったりと、話題が絶えない感じです。

あと以下のプレビュー画面ですが、ここでの表示は課金されないみたいなので、有効活用しないといけないですね。

f:id:sugimomoto:20180213003233p:plain

所感

とりあえず今回はここまで。色々と戯れるべきポイントが多くて、面白いです。

しかし、並行して、色々と調べているので、なかなか進まなかったり・・・。