views4GCPのストレージサービスについてまとめてみた。Exp:190284普段はGCP専門のエンジニアをやっています。最近は個人的な活動としてGOとswiftでアプリ作ってます。G+TweetShareHatena注意この記事は2015年11月4日に更新されたもので、内容が古い可能性がありますのでご注意ください。他ユーザとデータセットを共有してみる【おまけ】コマンドラインからBigQueryを操作する方法bqコマンドのセットアップ手順bqコマンドの実行例まとめとにかくBigQueryを試してみよう私がBigQueryというサービスを初めて知り興味を持ったのは、確か2年程前だと思います。実際に私がBigQueryを体験したのはとても最近のことです。興味がありながらもBigQueryに触れるのに2年かかってしまったのかと言うと、どうしてもはじめの一歩が踏み出せなかったことが原因でした。私が感じた敷居の高さは以下の2つです。やって始めればいいのかわからないビッグデータ解析サービスは高そう中々触れる機会がないまま時間だけが過ぎていきましたが、最近になってやっとBigQueryに触れる機会が訪れました。久しぶりにBigQueryを試してみたのですが、その結果以下2つの事実がわかりました。簡単にはじめることができる異常な程安いこれは私が当初感じていたイメージと全く逆の事実でした。私と同じように先入観によってBigQueryの利用を躊躇しているユーザは多いのではないでしょうか。いうことで、今回は自分と同じようにBigQueryを始めたいのに中々一歩が踏み出せない人向けにBigQueryの入門記事を書かせていただきます。内容はBigQueryの概要から利用手順まで、できる限り丁寧に説明していきます。I/Oにて公式サービスとしてローンチされました。社内で利用されていたDremel(ドレメル)というデータ解析用のシステムがあり、それを外部ユーザ向けに利用できるようにしたサービスがBigQueryです。検索(月1000億以上)等の解析からデータセンター内の温度分析まで...さまざまな用途に利用されているようです。BigQueryの凄さは前述した料金の安さもありますが、一番はそのパフォーマンスです。Googleの中の人・佐藤さんが書いた以下のQiita記事を読んでいただければ、その凄さがわかると思います。#gcpjahttp://qiita.com/kazunori279/items/10ac0066ac9b0b5aaaf3Google佐藤さんはこう書いています...「120億行の正規表現マッチ付き集計が5秒で完了した」。同様のシステムを自前を用意しようとすると、いくらかかるのでしょうか。この強力なサービスを超低価格で提供しています。BigQueryはなぜ早いのか?なぜこれほどにまでBigQueryは高速なのでしょうか。高速な理由は、何千というサーバ群でクエリを並列処理しているからですが、並列処理を実現できる理由はBigQueryの仕組みにあります。BigQueryの仕組みとは、ずばり「カラム型データストア」と「ツリーアーキテクチャ」です(※1)。カラム型データストア通常のリレーショナル・データベースでは行単位でデータを保存していますが、BigQueryでは、列毎にまとめてデータの保存をおこないます。BigQueryはそれにより「トラフィックの最小化」と「高い圧縮率」を実現していると言われています。このデータ保存形式こそがクエリ実行時の高速データ参照を実現しています。カラム型データストアツリーアーキテクチャBigQueryはツリーアーキテクチャによって分散処理を実現しています。serversが実際にクエリ処理をおこないます。BigQueryの並列処理はクエリがツリー構造で分散実行されることで実現されています。ツリーアーキテクチャ以上がBigQueryが高速な理由です。詳しく知りたい場合はBigQueryの公式ドキュメントを参照してください(※2)。次はBigQueryの用語について説明をおこないます。BigQueryの仕組みについての説明はプログメディア「Publickey」の記事を参考にしています。詳細を知りたい場合は以下のURLを参照してください。Googleが公開しているBigQueryの公式ドキュメントを確認したい場合は以下のURLを参照してください。BigQuery(PDF)https://cloud.google.com/files/BigQueryTechnicalWP.pdfBigQueryで知っておくべき用語BigQueryの用語を知る前に、まずはBigQueryの抽象概念を学ぶ必要があります。以下はBigQueryの概念図となります。トップコンテナに「プロジェクト」があり、その中に「データセット」と「ジョブ」が存在します。「テーブル」は「データセット」の中に格納され、「ジョブ」には4つの種類(クエリ/インポート/エクスポート/コピー)があります。以下それぞれのコンポーネントを説明して行きます。プロジェクトを指します。図3を見てもらえればわかる通り、「プロジェクト」はBigQueryの抽象概念におけるトップコンテナに位置し、データセットやジョブは、そのプロジェクト内に所有されます。プロジェクトを作成しなければ、データセットやジョブを作成することはできないことになります。そのため、後述するBigQueryの利用手順では最初にGCPプロジェクトの作成手順を説明しています。課金の単位もこのプロジェクト単位になります。データセット「データセット」はテーブルの集合を所有する、リレーショナル・データベースにおけるデータベースのようなものです。テーブルを作成するためには、ユーザはまずデータセットの作成が必要となります。ユーザはデータセットに対してアクセス制御をおこなうことができます。テーブル「テーブル」は構造化されたデータ(行)の集合です。BigQueryのテーブルはリレーショナル・データベースのテーブルと同様にスキーマを持ちます。テーブルはデータセットとは違いテーブル単位でアクセス制御をおこなうことはできません。ジョブ「ジョブ」はクエリ実行・データ追加・テーブルのコピー等の実行単位となります。ジョブは非同期で実行され、実行中ジョブのステータスも取得が可能です。料金体系は?BigQueryの料金体系は以下の通りです。課金対象は以下3つだけで、それ以外の操作については課金は発生しないことになります。ストリーミングインサートでは無い、バッチ処理的なデータのインポート・エクスポートは無料となります。以下の料金表を見ていただければわかる通り、データを1TB保存しても月にかかる料金は$20(=約2000円)、(中々そこまでの量を処理する状況はないと思いますが)50TBのデータをクエリで処理しても$50(=約5000円)程度しかかかりません。BigQueryは毎月最初の1TB(クエリによるデータ処理)については無料となります。ストレージ使用料BigQueryに保存されているデータ容量に対して課金されます。$0.020/GB/月クエリによる処理容量クエリ実行時にスキャンされるデータ量に対して課金されます。$5/TBストリーミングインサートストリーミングインサートはデータのリアルタイム収集で利用されるAPIで、テーブルにインサートしたデータ量に対して課金されます。$0.01/200MBさあBigQueryを始めよう!!それでは、実際にBigQueryを始めてみましょう!トライアルは以下の手順で進めていきます。BigQueryを始めるためには、事前準備としてGCPプロジェクトの作成が必要となりますので、まずはそちらの手順から説明していきます。GCPプロジェクトを作成している場合は(2)からスタートしてください。前述した通り、BigQueryを始めるためには最初にGCPプロジェクトの作成が必要となります。以下の手順に従ってGCPプロジェクトを作成してください。Consoleへのアクセス以下のURLにアクセスしてください。in」リンクをクリックします(※4)。リンクをクリックするとGoogleアカウントによるログインを求められます。Googleアカウントを持ってない場合は、以下のURLからアカウントの作成をおこなってください。console」と表示されますので、そちらのリンクをクリックしてください。Condoleのトップ画面に遷移します。Worldアプリのデプロイ」をクリックしてください。(3)プロジェクトの作成プロジェクト作成用のモーダルがポップアップ表示されますので以下2つの項目を入力し「作成ボタン」を押下してください。プロジェクト名プロジェクト名は任意の文字列となります。プロジェクトIDtwitterIDのように全世界でユニークなIDを入力します。利用されているIDを入力した場合は赤文字で警告エラーが表示されます。プロジェクトの作成が完了するとプロジェクトのコンソール画面に自動遷移します。これでデプロイのための事前準備は完了となります。クエリ実行GCPプロジェクトの作成が完了したら、これで事前準備は完了です。それでは、実際にBigQueryに触れてみましょう。クエリの実行方法について説明します。Consoleへのアクセス以下のURLにアクセスするとプロジェクトの一覧画面が表示されますので、さきほど作成した「プロジェクト名」のリンクをクリックします。BigQueryページへの遷移リンクをクリックするとプロジェクトページに遷移します。左メニューの[BigQuery]をクリックして、BigQueryのWebコンソール画面に遷移します(下画像参照)。データセットの選択BigQueryのWebコンソール画面へ遷移後、左メニュー下部に表示されているデータセット「publicdata:samples」(※5)をクリックしてください。左メニューにデフォルトで表示されている「publicdata:samples」はGoogleがGCPユーザ向けに公開しているデータセットです。「publicdata」はGoogleが保持するプロジェクト、「samples」はプロジェクト「publicdata」内に存在するデータセットを意味します。Webコンソール(4)テーブルの選択データセット「publicdata:samples」をクリックすると、サンプルテーブルの一覧が表示されます。今回は「wikipedia」テーブルを選択します。Table」ボタンをクリックしてください。Query」ボタンを押下してください(※6)。1000」という雛形クエリがデフォルトで入力されているので、「SELECT」と「FROM」の間に「count(*)」だけ入力すれば問題ありません。Results]というセクションが表示され、結果がテーブル形式で表示されます(※7)。赤枠で囲まれた箇所が「実行にかかった時間」で、オレンジ枠で囲まれた箇所が実行結果(wikipediaテーブルの累計レコード数)となります。タブの切り替えによってJSON形式で結果を閲覧することも可能です。前述した通り、テーブルはデータセットが存在しなければ作成することができません。次章の「テーブルの作成」をおこなうために本章ではデータセットの作成をおこないます。それでは実際にデータセットの作成をおこなってみましょう。左メニューに表示されている「プロジェクト名」を確認し、右横箇所に配置されているプルダウンメニューをクリックしてください。dataset」を選択します。データセットの作成データセット作成用のモーダルがポップアップ表示されますので、以下2つの項目を入力・選択し「OK」ボタンを押下してください。IDデータセットの識別IDを入力します。利用できる文字は半角の英字、数字、アンダースコアの3種類となり、IDはプロジェクト内でユニークな文字列にする必要があります。location「US」「EU」の2種類のロケーションから選択可能です(※8)。locationを未選択の状態で「OK」ボタンを押下した場合は、「US」ロケーションでデータセットが作成されます。データセット作成モーダル(3)データセットの作成完了データセットの作成が完了すると左メニューに作成したデータセットのIDが表示されます。これでデータセット配下にテーブルの作成が可能となります。前章で作成したデータセット配下にテーブルを作成します。以下の手順に従ってテーブルの作成をおこなってください。table」を選択してください。選択をおこなうと、テーブル作成用のモーダルがポップアップ表示されます。destination」を選択し、テーブルIDを入力してください。データセットIDはデフォルトで入力されているので修正をおこなう必要はありません。data」をクリックします。テーブルIDの入力(3)CSVファイルの作成インポート用のファイルを作成します。インポートファイルの形式はいくつかありますが、今回はCSVをインポートしてみましょう。以下のCSVファイルを作成してください(※9)。CSVファイルの内容については、1列目が名前、2列目が苗字、3列目が年齢を想定しています。(4)インポートファイルの選択インポートファイルの選択をおこないます。file」ボタンを押下してください。ファイル選択ダイアログが表示されますので、(3)で作成した「family.csv」を選択します。schema」をクリックします。filed」ボタンを押下して列の作成をおこないます。(3)のCSVフォーマットに合わせて以下のスキーマを定義します。定義が完了したら「Submit」ボタンを押下してテーブル作成ジョブを発行します。スキーマの定義(6)テーブルの作成中テーブルの作成ジョブが実行されると、左メニューに作成対象のテーブルIDが表示されます。作成中の場合は「(loading)」という文字列がテーブルID右に表示されます。ファイルのローディング中(7)テーブルのスキーマ確認テーブルの作成が完了すると「loading」文字列が消去されますので、テーブルIDをクリックしてください。クリックするとテーブルのスキーマを確認することができます。Table」ボタンを押下します。QUERY」ボタンを押下してください(※10)。1000」という雛形クエリがデフォルトで入力されているので、「SELECT」と「FROM」の間に「*」(アスタリスク)だけ入力すれば問題ありません。クエリの実行結果クエリの実行が成功すると以下のように結果のテーブルが表示されます。さきほどインポートしたファイルのデータを確認することができたら、テーブルの作成は完了です。他ユーザとデータセットを共有してみるデータセットは他のユーザに対してアクセス制御をおこなうことができます。データセットの共有手順は以下の通りです。dataset」を選択してください。任意のユーザにデータセットの権限を付与します。Appsアカウント)を入力し「Add」ボタンを押下します(※11)。このとき選択できるユーザ権限は以下の3種類となります。view(閲覧権限)データセット内のテーブルに対してクエリの実行・テーブルのコピー・エキスポートを実行することができます。view(閲覧権限)で実行可能な項目に加えて、データセット内のテーブルに対してデータの作成・更新・削除を実行することができます。edit(編集権限)で実行可能な項目に加えて、データセットの参照・更新・削除を実行することができます。「Add」ボタンを押下した段階では、共有処理は実行されません。changes」ボタンを押下してください。ボタン押下時にエラーメッセージが表示されなければ、データセットの共有処理は完了です。データセットの作成をおこなうと、デフォルトで権限が付与されるようになっています。以上でハンズオンの内容は終了となります。おまけとして次章ではコマンドラインからBigQueryを操作する方法について説明します。興味がある方はぜひ試してみてください。【おまけ】コマンドラインからBigQueryを操作する方法BigQueryはコマンドラインからも操作が可能です。本章では、まずコマンドライン上でBigQuery操作するためのセットアップ手順を説明し、その後にコマンドの実行例をいくつか解説します。bqコマンドのセットアップ手順コマンドライン上でのBigQueryの操作にはbqコマンドというツールを利用します。SDKをインストールすることで利用できるようになります。SDKのセットアップをおこなってみましょう。SDKのインストール以下のコマンドからSDKのダウンロード&インストールを完了させてください。bash(2)シェルの再起動シェルの再起動をおこないます。再起動をおこなうとgcloudコマンドが有効化されます。$SHELL(3)gcloudコマンドの初期設定gcloudの実行ユーザや対象プロジェクトの設定をおこないます。以下コマンドを実行すると、利用プロジェクトの入力を求められますので、「GCPプロジェクトの作成」で作成したプロジェクトIDを指定してください。SDKのインストールが完了するbqコマンドが利用できるようになります。それでは、bqコマンドの実行例をいくつかピックアップして説明します。データセットの一覧参照データセット一覧を表示には「ls」コマンドを利用します。「-p」オプションを付与するとプロジェクト一覧を参照することができます。クエリの実行クエリの実行には「query」コマンドを利用します。スキャンするデータ量によってはレスポンスに時間がかかる場合があるので結果が返ってくるまでは待機してください。「–destination_table」オプションを利用すると、クエリの実行結果から新規テーブルを作成することも可能です。データセットの詳細確認データセットの詳細(Permission)を確認するには「show」コマンドを利用します。Owners:projectOwnersWriters:projectWritersReaders:projectReaders,ochiai.suguru.nci@gmail.com,morita@yoshidumi.co.jp(4)テーブルのコピーテーブルを新規テーブルとしてコピーするには「cp」コマンドを利用します。'morita-demo:dataset_sample.sample_table2'まとめ以上でBigQuery入門は終了となります。如何でしょうか?考えていたよりも簡単だったのではないでしょうか?BigQueryは、単純にデータだけを解析するだけならエンジニアだけでなく、非エンジニアにも利用しやすいサービスとなっています。本記事をキッカケにBigQueryの世界に足を踏み入れては如何でしょうか。Engine等のGCPサービスとのインテグレーション方法について学びます。apps-gcpではBigQuery以外にもさまざまなコンテンツ記事を配信しています。