目次
とにかくBigQueryを試してみよう
私がBigQueryというサービスを初めて知り興味を持ったのは、確か2年程前だと思います。しかしながら、実際に私がBigQueryを体験したのはとても最近のことです。なぜ興味がありながらもBigQueryに触れるのに2年かかってしまったのかと言うと、どうしてもはじめの一歩が踏み出せなかったことが原因でした。私が感じた敷居の高さは以下の2つです。
- どうやって始めればいいのかわからない
- ビッグデータ解析サービスは高そう
中々触れる機会がないまま時間だけが過ぎていきましたが、最近になってやっとBigQueryに触れる機会が訪れました。そして、久しぶりにBigQueryを試してみたのですが、その結果以下2つの事実がわかりました。
- 簡単にはじめることができる
- 異常な程安い
これは私が当初感じていたイメージと全く逆の事実でした。おそらく私と同じように先入観によってBigQueryの利用を躊躇しているユーザは多いのではないでしょうか。
ということで、今回は自分と同じようにBigQueryを始めたいのに中々一歩が踏み出せない人向けにBigQueryの入門記事を書かせていただきます。内容はBigQueryの概要から利用手順まで、できる限り丁寧に説明していきます。20分くらいの内容ですので、ハンズオン感覚でぜひチャレンジしてみてください!
BigQueryとは何?
BigQueryは Google が提供するビッグデータ解析サービスのことで、2012年の Google I/Oにて公式サービスとしてローンチされました。元々 Google 社内で利用されていたDremel(ドレメル)というデータ解析用のシステムがあり、それを外部ユーザ向けに利用できるようにしたサービスがBigQueryです。 Google 社内では、GMailユーザ(数億)や Google 検索(月1000億以上)等の解析からデータセンター内の温度分析まで…さまざまな用途に利用されているようです。
BigQueryの凄さは前述した料金の安さもありますが、一番はそのパフォーマンスです。
Googleの中の人・佐藤さんが書いた以下のQiita記事を読んでいただければ、その凄さがわかると思います。
Googleの虎の子「BigQuery」をFluentdユーザーが使わない理由がなくなった理由 #gcpja
http://qiita.com/kazunori279/items/10ac0066ac9b0b5aaaf3
Google佐藤さんはこう書いています…「120億行の正規表現マッチ付き集計が5秒で完了した」。果たして、同様のシステムを自前を用意しようとすると、いくらかかるのでしょうか。数億円レベルで収まるものなのでしょうか? Google はこの強力なサービスを超低価格で提供しています。
BigQueryはなぜ早いのか?
なぜこれほどにまでBigQueryは高速なのでしょうか。高速な理由は、何千というサーバ群でクエリを並列処理しているからですが、並列処理を実現できる理由はBigQueryの仕組みにあります。BigQueryの仕組みとは、ずばり「カラム型データストア」と「ツリーアーキテクチャ」です(※1)。
カラム型データストア
通常のリレーショナル・データベースでは行単位でデータを保存していますが、BigQueryでは、列毎にまとめてデータの保存をおこないます。BigQueryはそれにより「トラフィックの最小化」と「高い圧縮率」を実現していると言われています。そして、このデータ保存形式こそがクエリ実行時の高速データ参照を実現しています。
図1. カラム型データストア
ツリーアーキテクチャ
BigQueryはツリーアーキテクチャによって分散処理を実現しています。root serverはクライアント(ユーザ)からクエリを取得し、intermediate serversを経由後、leaf serversが実際にクエリ処理をおこないます。BigQueryの並列処理はクエリがツリー構造で分散実行されることで実現されています。
図2. ツリーアーキテクチャ
以上がBigQueryが高速な理由です。さらに詳しく知りたい場合はBigQueryの公式ドキュメントを参照してください(※2)。次はBigQueryの用語について説明をおこないます。
※1 BigQueryの仕組みについての説明はプログメディア「Publickey」の記事を参考にしています。詳細を知りたい場合は以下のURLを参照してください。
グーグルのBigQuery、高速処理の仕組みは「カラム型データストア」と「ツリー構造」。解説文書が公開
http://www.publickey1.jp/blog/12/bigquery_1.html
※2 Googleが公開しているBigQueryの公式ドキュメントを確認したい場合は以下のURLを参照してください。
An Inside Look at Google BigQuery(PDF)
https://cloud.google.com/files/BigQueryTechnicalWP.pdf
BigQueryで知っておくべき用語
BigQueryの用語を知る前に、まずはBigQueryの抽象概念を学ぶ必要があります。以下はBigQueryの概念図となります。まずトップコンテナに「プロジェクト」があり、その中に「データセット」と「ジョブ」が存在します。「テーブル」は「データセット」の中に格納され、「ジョブ」には4つの種類(クエリ/インポート/エクスポート/コピー)があります。
図3. BigQuery概念図
以下それぞれのコンポーネントを説明して行きます。
プロジェクト
「プロジェクト」は Google Cloud Platform(以下GCP) のプロジェクトを指します。図3を見てもらえればわかる通り、「プロジェクト」はBigQueryの抽象概念におけるトップコンテナに位置し、データセットやジョブは、そのプロジェクト内に所有されます。つまり、プロジェクトを作成しなければ、データセットやジョブを作成することはできないことになります。そのため、後述するBigQueryの利用手順では最初にGCPプロジェクトの作成手順を説明しています。課金の単位もこのプロジェクト単位になります。
データセット
「データセット」はテーブルの集合を所有する、リレーショナル・データベースにおけるデータベースのようなものです。テーブルを作成するためには、ユーザはまずデータセットの作成が必要となります。また、ユーザはデータセットに対してアクセス制御をおこなうことができます。
テーブル
「テーブル」は構造化されたデータ(行)の集合です。つまり、BigQueryのテーブルはリレーショナル・データベースのテーブルと同様にスキーマを持ちます。また、テーブルはデータセットとは違いテーブル単位でアクセス制御をおこなうことはできません。
ジョブ
「ジョブ」はクエリ実行・データ追加・テーブルのコピー等の実行単位となります。ジョブは非同期で実行され、実行中ジョブのステータスも取得が可能です。
料金体系は?
BigQueryの料金体系は以下の通りです。課金対象は以下3つだけで、それ以外の操作については課金は発生しないことになります。つまり、ストリーミングインサートでは無い、バッチ処理的なデータのインポート・エクスポートは無料となります。以下の料金表を見ていただければわかる通り、データを1TB保存しても月にかかる料金は$20(=約2000円)、(中々そこまでの量を処理する状況はないと思いますが)50TBのデータをクエリで処理しても$50(=約5000円)程度しかかかりません。しかも、BigQueryは毎月最初の1TB(クエリによるデータ処理)については無料となります。BigQueryはとにかく安いサービスなのです。
課金対象 | 説明 | 料金 |
---|---|---|
ストレージ使用料 | BigQueryに保存されているデータ容量に対して課金されます。 | $0.020/GB/月 |
クエリによる処理容量 | クエリ実行時にスキャンされるデータ量に対して課金されます。 | $5/TB |
ストリーミングインサート | ストリーミングインサートはデータのリアルタイム収集で利用されるAPIで、テーブルにインサートしたデータ量に対して課金されます。 | $0.01/200MB |
さあBigQueryを始めよう!!
それでは、実際にBigQueryを始めてみましょう!トライアルは以下の手順で進めていきます。BigQueryを始めるためには、事前準備としてGCPプロジェクトの作成が必要となりますので、まずはそちらの手順から説明していきます。
- GCPプロジェクトの作成(※3)
- クエリ実行
- データセット作成
- テーブル作成
- 他ユーザとデータセットを共有してみる
※3 既にGCPプロジェクトを作成している場合は(2)からスタートしてください。
GCPプロジェクトの作成
前述した通り、BigQueryを始めるためには最初にGCPプロジェクトの作成が必要となります。以下の手順に従ってGCPプロジェクトを作成してください。
(1) Developer Consoleへのアクセス
以下のURLにアクセスしてください。アクセスすると以下の画面が表示されますので「Sign in」リンクをクリックします(※4)。
https://console.developers.google.com/project
※4 リンクをクリックするとGoogleアカウントによるログインを求められます。Googleアカウントを持ってない場合は、以下のURLからアカウントの作成をおこなってください。アカウントを持っていて既にGoogleアカウントでログイン済の場合は「Sign in」ではなく「My console」と表示されますので、そちらのリンクをクリックしてください。
https://accounts.google.com/SignUp
画像1. Google Cloud Platformトップページ
(2) 利用開始画面への遷移
GoogleアカウントでアクセスするとDeveloper Condoleのトップ画面に遷移します。「Hello Worldアプリのデプロイ」をクリックしてください。
(3)プロジェクトの作成
プロジェクト作成用のモーダルがポップアップ表示されますので以下2つの項目を入力し「作成ボタン」を押下してください。
- プロジェクト名
プロジェクト名は任意の文字列となります。 - プロジェクトID
twitterIDのように全世界でユニークなIDを入力します。
既に利用されているIDを入力した場合は赤文字で警告エラーが表示されます。
プロジェクトの作成が完了するとプロジェクトのコンソール画面に自動遷移します。 これでデプロイのための事前準備は完了となります。
クエリ実行
GCPプロジェクトの作成が完了したら、これで事前準備は完了です。それでは、実際にBigQueryに触れてみましょう。まずはクエリの実行方法について説明します。
(1) Developers Consoleへのアクセス
以下のURLにアクセスするとプロジェクトの一覧画面が表示されますので、さきほど作成した「プロジェクト名」のリンクをクリックします。
https://console.developers.google.com/project
(2) BigQueryページへの遷移
リンクをクリックするとプロジェクトページに遷移します。左メニューの[BigQuery]をクリックして、BigQueryのWebコンソール画面に遷移します(下画像参照)。
画像2. Developer Console
(3) データセットの選択
BigQueryのWebコンソール画面へ遷移後、左メニュー下部に表示されているデータセット「publicdata:samples」(※5)をクリックしてください。
※5 左メニューにデフォルトで表示されている「publicdata:samples」はGoogleがGCPユーザ向けに公開しているデータセットです。「publicdata」はGoogleが保持するプロジェクト、「samples」はプロジェクト「publicdata」内に存在するデータセットを意味します。
画像3. BigQuery Webコンソール
(4)テーブルの選択
データセット「publicdata:samples」をクリックすると、サンプルテーブルの一覧が表示されます。今回は「wikipedia」テーブルを選択します。「wikipedia」を選択すると右ペインの画面がテーブルの詳細ページに切り替わりますので、「Query Table」ボタンをクリックしてください。
画像4. サンプルテーブルの選択
(5) クエリの実行
「Query Table」ボタンを押下するとクエリ入力用のテキストエリアが表示されますので、レコード数をカウントする以下のサンプルクエリを入力し「Run Query」ボタンを押下してください(※6)。
SELECT count(*) FROM [publicdata:samples.wikipedia] LIMIT 1000 |
※6 テキストエリアには「SELECT FROM [publicdata:samples.wikipedia] LIMIT 1000」という雛形クエリがデフォルトで入力されているので、「SELECT」と「FROM」の間に「count(*)」だけ入力すれば問題ありません。
画像5. クエリの入力
(6) 実行結果の確認
実行が成功すると、[Query Results]というセクションが表示され、結果がテーブル形式で表示されます(※7)。赤枠で囲まれた箇所が「実行にかかった時間」で、オレンジ枠で囲まれた箇所が実行結果(wikipediaテーブルの累計レコード数)となります。
※7 タブの切り替えによってJSON形式で結果を閲覧することも可能です。
画像6. クエリの実行
データセットの作成
前述した通り、テーブルはデータセットが存在しなければ作成することができません。次章の「テーブルの作成」をおこなうために本章ではデータセットの作成をおこないます。それでは実際にデータセットの作成をおこなってみましょう。
(1)メニューの選択
左メニューに表示されている「プロジェクト名」を確認し、右横箇所に配置されているプルダウンメニューをクリックしてください。クリックすると、メニューが表示されますので、「Create new dataset」を選択します。
画像7. データセットの作成開始
(2) データセットの作成
データセット作成用のモーダルがポップアップ表示されますので、以下2つの項目を入力・選択し「OK」ボタンを押下してください。
- Dataset ID
データセットの識別IDを入力します。利用できる文字は半角の英字、数字、アンダースコアの3種類となり、IDはプロジェクト内でユニークな文字列にする必要があります。 - Data location
「US」「EU」の2種類のロケーションから選択可能です(※8)。
※8 Data locationを未選択の状態で「OK」ボタンを押下した場合は、「US」ロケーションでデータセットが作成されます。
画像8. データセット作成モーダル
(3)データセットの作成完了
データセットの作成が完了すると左メニューに作成したデータセットのIDが表示されます。これでデータセット配下にテーブルの作成が可能となります。
画像9. データセットの作成完了
テーブル作成
前章で作成したデータセット配下にテーブルを作成します。以下の手順に従ってテーブルの作成をおこなってください。
(1) メニューの選択
左メニューの「データセットID」右横のプルダウンメニューから「Create new table」を選択してください。選択をおこなうと、テーブル作成用のモーダルがポップアップ表示されます。
画像10. テーブルの作成開始
(2)テーブルIDの入力
テーブル作成用のモーダルが表示されたら、ナビゲーションメニューの「Choose destination」を選択し、テーブルIDを入力してください。データセットIDはデフォルトで入力されているので修正をおこなう必要はありません。テーブルIDを入力したら、ナビゲーションメニューの「Select data」をクリックします。
画像11. テーブルIDの入力
(3)CSVファイルの作成
インポート用のファイルを作成します。インポートファイルの形式はいくつかありますが、今回はCSVをインポートしてみましょう。以下のCSVファイルを作成してください(※9)。
namihei,isono,54fune,isono,52wakame,isono,9katsuo,isono,11
sazae,isono,24
masuo,isono,28
tarao,isono,3
tama,isono,9
※9 CSVファイルの内容については、1列目が名前、2列目が苗字、3列目が年齢を想定しています。
(4)インポートファイルの選択
インポートファイルの選択をおこないます。「Source Format」には「CSV」を選択し、「Load data from」で「Choose file」ボタンを押下してください。ファイル選択ダイアログが表示されますので、(3)で作成した「family.csv」を選択します。
画像12. インポートファイルの選択
ファイルを選択したら、ナビゲーションメニューの「Specify schema」をクリックします。
(5)スキーマの定義
「Add filed」ボタンを押下して列の作成をおこないます。(3)のCSVフォーマットに合わせて以下のスキーマを定義します。定義が完了したら「Submit」ボタンを押下してテーブル作成ジョブを発行します。
列名 | タイプ |
---|---|
first_name(名前) | STRING |
last_name(苗字) | STRING |
age(年齢) | INTEGER |
表2. テーブルスキーマ
画像13. スキーマの定義
(6)テーブルの作成中
テーブルの作成ジョブが実行されると、左メニューに作成対象のテーブルIDが表示されます。作成中の場合は「(loading)」という文字列がテーブルID右に表示されます。
画像14. ファイルのローディング中
(7)テーブルのスキーマ確認
テーブルの作成が完了すると「loading」文字列が消去されますので、テーブルIDをクリックしてください。クリックするとテーブルのスキーマを確認することができます。次に実際にデータがインポートされているか確認するために「Query Table」ボタンを押下します。
画像15. テーブルスキーマの確認
(8)クエリの実行
クエリ入力テキストエリアが表示されますので、以下のクエリを入力し「RUN QUERY」ボタンを押下してください(※10)。
SELECT * FROM [dataset_sample.table_sample] LIMIT 1000
※10 テキストエリアには「SELECT FROM [dataset_sample.table_sample] LIMIT 1000」という雛形クエリがデフォルトで入力されているので、「SELECT」と「FROM」の間に「*」(アスタリスク)だけ入力すれば問題ありません。
(9) クエリの実行結果
クエリの実行が成功すると以下のように結果のテーブルが表示されます。さきほどインポートしたファイルのデータを確認することができたら、テーブルの作成は完了です。
画像17. クエリの実行結果
他ユーザとデータセットを共有してみる
データセットは他のユーザに対してアクセス制御をおこなうことができます。データセットの共有手順は以下の通りです。
(1) メニューの選択
左メニューの「データセットID」右横のプルダウンメニューから「Share dataset」を選択してください。
画像18. データセットの共有開始
(2)共有ユーザの選択
任意のユーザにデータセットの権限を付与します。テキストボックスにメールアドレス(Gmail/Google Appsアカウント)を入力し「Add」ボタンを押下します(※11)。このとき選択できるユーザ権限は以下の3種類となります。
- Can view(閲覧権限)
データセット内のテーブルに対してクエリの実行・テーブルのコピー・エキスポートを実行することができます。 - Can edit(編集権限)
Can view(閲覧権限)で実行可能な項目に加えて、データセット内のテーブルに対してデータの作成・更新・削除を実行することができます。 - In owner(オーナー)
Can edit(編集権限)で実行可能な項目に加えて、データセットの参照・更新・削除を実行することができます。
※11 「Add」ボタンを押下した段階では、共有処理は実行されません。
画像19. データセットの共有ユーザ選択
(3)共有の実行
「Add」ボタンを押下すると、(2)で入力したメールアドレスが共有リスト(※12)に表示されますので、「Save changes」ボタンを押下してください。ボタン押下時にエラーメッセージが表示されなければ、データセットの共有処理は完了です。
※12 デフォルトでリストされる「Project Owners」「Project Editors」「Project Viewers」は、それぞれGCPプロジェクトに対するオーナー・編集者・閲覧者となります。データセットの作成をおこなうと、デフォルトで権限が付与されるようになっています。
画像20. データセットの共有実行
以上でハンズオンの内容は終了となります。おまけとして次章ではコマンドラインからBigQueryを操作する方法について説明します。興味がある方はぜひ試してみてください。
【おまけ】コマンドラインからBigQueryを操作する方法
BigQueryはコマンドラインからも操作が可能です。本章では、まずコマンドライン上でBigQuery操作するためのセットアップ手順を説明し、その後にコマンドの実行例をいくつか解説します。
bqコマンドのセットアップ手順
コマンドライン上でのBigQueryの操作にはbqコマンドというツールを利用します。bqコマンドはGoogle Cloud SDKをインストールすることで利用できるようになります。それではCloud SDKのセットアップをおこなってみましょう。尚インストール環境はMac OS Xを想定しています。
(1) Google Cloud SDKのインストール
以下のコマンドからSDKのダウンロード&インストールを完了させてください。
$ curl https://sdk.cloud.google.com | bash
(2)シェルの再起動
シェルの再起動をおこないます。再起動をおこなうとgcloudコマンドが有効化されます。
$ exec -l $SHELL
(3)gcloudコマンドの初期設定
gcloudの実行ユーザや対象プロジェクトの設定をおこないます。以下コマンドを実行すると、利用プロジェクトの入力を求められますので、「GCPプロジェクトの作成」で作成したプロジェクトIDを指定してください。
$ gcloud init
bqコマンドの実行例
Google Cloud SDKのインストールが完了するbqコマンドが利用できるようになります。それでは、bqコマンドの実行例をいくつかピックアップして説明します。
(1) データセットの一覧参照
データセット一覧を表示には「ls」コマンドを利用します。「-p」オプションを付与するとプロジェクト一覧を参照することができます。
-フォーマット
bq ls [-p]
$ bq ls
datasetId
----------------
dataset_sample
(2) クエリの実行
クエリの実行には「query」コマンドを利用します。スキャンするデータ量によってはレスポンスに時間がかかる場合があるので結果が返ってくるまでは待機してください。「–destination_table」オプションを利用すると、クエリの実行結果から新規テーブルを作成することも可能です。
-フォーマット
bq query “クエリ文字列” --destination_table=[データセット名].[新規テーブル名]
$ bq query "select first_name from dataset_sample.sample_table where age > 20"
Waiting on bqjob_r55557d37c0ce6c32_0000014f4e4d0d3e_1 ... (0s) Current status: DONE
+------------+
| first_name |
+------------+
| namihei |
| fune |
| sazae |
| masuo |
+------------+
(3) データセットの詳細確認
データセットの詳細(Permission)を確認するには「show」コマンドを利用します。
-フォーマット
bq show [プロジェクト名]:[データセット名].[テーブル名]
$ bq show morita-demo:dataset_sample
Dataset morita-demo:dataset_sampleLast modified ACLs
----------------- --------------------------------
20 Aug 14:47:15 Owners:
projectOwners
Writers:
projectWriters
Readers:
projectReaders,
ochiai.suguru.nci@gmail.com,
morita@yoshidumi.co.jp
(4)テーブルのコピー
テーブルを新規テーブルとしてコピーするには「cp」コマンドを利用します。
-フォーマット
bq cp [データセット名].[既存テーブル名](コピー元) [データセット名].[新テーブル名](コピー先)
$ bq cp dataset_sample.sample_table dataset_sample.sample_table2
Waiting on bqjob_r7c0990da1462f485_0000014f4e407022_1 ... (0s) Current status: RWaiting on bqjob_r7c0990da1462f485_0000014f4e407022_1 ... (1s) Current status: RWaiting on bqjob_r7c0990da1462f485_0000014f4e407022_1 ... (2s) Current status: RWaiting on bqjob_r7c0990da1462f485_0000014f4e407022_1 ... (2s) Current status: DONE
Tables 'morita-demo:dataset_sample.sample_table' successfully copied to 'morita-demo:dataset_sample.sample_table2'
まとめ
以上でBigQuery入門は終了となります。如何でしょうか?考えていたよりも簡単だったのではないでしょうか?
BigQueryは、単純にデータだけを解析するだけならエンジニアだけでなく、非エンジニアにも利用しやすいサービスとなっています。ぜひ本記事をキッカケにBigQueryの世界に足を踏み入れては如何でしょうか。
次回のBigQuery記事では、Google App Engine等のGCPサービスとのインテグレーション方法について学びます。apps-gcpではBigQuery以外にもさまざまなコンテンツ記事を配信しています。ぜひapps-gcpを定期的にチェックしてください!