[無料] 他クラウドのデータにクエリを実行できる BigQuery Omni が期間限定でオンデマンド料金で利用可能!
ウィスキー、シガー、パイプをこよなく愛する大栗です。
Amazon S3 や Azure Blob Storage に格納されたデータに対してクエリを実行できる BigQuery Omni で期間限定ですがオンデマンドの料金モデルがサポートされました!今までは BigQuery Reservations を使用した定額料金のみで BigQuery Omni が利用できましたが、オンデマンド料金で無料トライアルが利用可能になります。
BigQuery release notes - September 21, 2022
BigQuery Omni
今更ですが、BigQuery は Google Cloud 上に実装され分散ストレージ(Colossus1 や Spanner2 で管理)と高可用性コンピューティングクラスタ(Borg3 や Dremel4 で管理)をペタバイトレベルのネットワーク(Jupiter5)で接続して、分散メモリ シャッフル層を使用して高速にクエリを処理する高速でスケーラブルなサーバーレスデータウェアハウスサービスです(なお2020 年時点での情報であるため、現在は異なる技術やサービスが採用されている可能性があります)。つまり BigQuery 様々な Google 独自のハードウェアやソフトウェアを使用して実装されています。
Google Cloud. "BigQuery、業界トップクラスとなる 99.99% の稼働時間の SLA を提供". Google Cloud. 2020-08-19. https://cloud.google.com/blog/ja/products/data-analytics/cloud-data-warehouse-bigquery-4-9s-sla, (参照2020-09-22)
Amazon Web Service や Microsoft Azure でも BigQuery と同様のインタフェースでクエリを実行できるサービスが BigQuery Omni となります。BigQuery Omni は他社クラウドインフラ上で動作できるように Google の内部サービスを置き換え同様の仕組みを実装しています。AWS であれば、分散ストレージはユーザー側の Amazon S3、高可用性コンピューティングクラスタは Google 側のフルマネージド Anthos クラスタ上で動作するため、AWS 内でデータが分析され結果のみが Google Cloud 側へ転送されます。
Google Cloud. "BigQuery Omni - マルチクラウド の分析でデータを活用". Google Cloud. 2020-07-15. https://cloud.google.com/blog/ja/products/data-analytics/introducing-bigquery-omni, (参照2020-09-22)
そのためデータ分析を行う場合にデータソースとなるシステムが他社クラウド上に構築されていても Google Cloud 側で管理でき、集計結果のみ転送されれるためクラウド間のデータ転送量も低減することが可能となります。例えば他社クラウド上でデータレークを実装していた場合でも BigQuery Omni を経由して、データを Google Cloud の機械学習サービスで分析する事も容易になります。
なお現在利用可能なリージョンは以下のようになっています
- Amazon Web Service
- リージョンの説明 : AWS - US East (N. Virginia)
- リージョン名 : aws-us-east-1
- Microsoft Azure
- リージョンの説明 : Azure - East US 2
- リージョン名 : azure-eastus2
BigQuery の料金モデル
料金の詳細は以下を確認してください。2022 年 9 月 22 日現在で日本語ページは更新されていないため、英語版ページをご覧ください。
定額料金モデル
BigQuery は元々定額料金制を採用していました。有効にするために BigQuery Reservations を使用します。
月定額契約
リージョン | 1ヶ月費用 | スロット数 |
---|---|---|
AWS - US East (N. Virginia) | $2,500 | 100 |
Azure - East US 2 | $2,920 | 100 |
年定額契約
リージョン | 1ヶ月費用 | スロット数 |
---|---|---|
AWS - US East (N. Virginia) | $2,125 | 100 |
Azure - East US 2 | $2,482 | 100 |
Flex Slots: 短期間のコミットメント
リージョン | 1時間費用 | 1ヶ月費用 | スロット数 |
---|---|---|---|
AWS - US East (N. Virginia) | $5.00 | $3,650 | 100 |
Azure - East US 2 | $5.80 | $4,234 | 100 |
オンデマンド料金モデル
今回追加されています。オンデマンド料金は 2022 年 9 月 15 日から 2023 年 3 月 31 日までの期間限定(試用期間)で無料で利用できます。試用は起用期間中に初めてオンデマンドクエリを使用した日から 2 か月間、または試用期間の終了日のいずれか早い方で終了します。試用期間中 BigQuery Omni オンデマンドクエリによってスキャンされたバイト数は無料ですが、無料起用枠のデータ処理の上限は 1 プロジェクトあたり 1TB です。
注意
試用期間はユーザーの検証のために提供されます。大規模なワークロードやクエリを対象としていません、試用期間終了後に BigQuery Omni を引き続き利用する場合には悠長の価格モデルに移行する必要があります。
やってみた
では実際に BigQuery Omni を試してみます。
事前に以下のものを用意します。
- AWS アカウント
- AWS で IAM ロールの作成できる権限
データは AWS の北バージニア(us-east-1)に配置します。
また、BigQuery Connection API が有効化されていない場合には有効化しておきます。
Amazon S3 バケットの作成
AWS の S3 コンソールのトップ画面でCreare bucket
をクリックします。
バケット名を入力して、リージョンで米国東部 (バージニア北部) us-east-1 を選択します。デフォルト暗号化について、ここでは Server-side encryption をEnable
にして、Encryption key type でAmazon S3-managed keys (SSE-S3)
としました。最後にCreate bucket
をクリックします。
S3 バケットが作成されました。
AWS の IAM 設定
まず IAM ポリシーを作成します。AWS の IAM コンソールで [Access management] - [Policies] でCreate policy
をクリックします。
JSON
タブで、以下の内容の JSON を入力して、Next: Tags
をクリックします。JSON のBUCKET_NAME
は先ほど作成した S3 のバケット名に書き換えて入力してください。なお S3 バケットにデータをエクスポートする場合にはs3:PutObject
権限も追加します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::BUCKET_NAME"] }, { "Effect": "Allow", "Action": ["s3:GetObject"], "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ] }
必要に応じてタグを追加してNext: Review
をクリックします。
ポリシー名と説明を入力して、Create policy
をクリックします。
ポリシーが作成されます。
IAM ロールを作成します。AWS の IAM コンソールで [Access management] - [Roles] でCreate role
をクリックします。
Trust entity type はWeb Identity
を選択して、Web Identity の Identity provider でGoogle
、Audience は仮に00000
を入力して、Next
をクリックします。Audience は後で置き換えます。
先程作成したポリシーを選択して、Next
をクリックします。
ロール名と説明を入力して、Create role
をクリックします。
ロールが作成されます。作成したロールをクリックします。
ロールの ARN をメモします。
BigQuery と AWS を接続する
Google Cloud の BigQuery コンソールで+ ADD DATA
- External data source
をクリックします。
Connection type はBigLake on AWS (via BigQuery Omni)
を選択、Connection ID は任意の名称を入力、Connection location はaws-us-east-1
を選択、Friendly name は判別しやすい任意の名称を入力、Description は説明を入力、AWS role id は先ほど作成した AWS の IAM ロールの ARN を入力してCREATE CONNECTION
をクリックします。
プロジェクトの下のExternal connections
の下にコネクションが追加されているので、クリックします。
AWS の IAM コンソールの [Access management] - [Policies] でCreate policy
をクリックします。
Edit
をクリックします。
Maximum session duration で12 hours
を選択してSave changes
をクリックします。
Trust Relationships
タブを選択してEdit trust policy
をクリックします。
accounts.google.com:aud
の値に Google Cloud で作成した Connection の BigQuery Google identity を設定してUpdate policy
をクリックします。
もし AWS アカウントに accounts.google.com 用のカスタム ID プロバイダがある場合には、BigQuery Google identity をプロバイダのオーディエンスとして追加します。
BigQuery でテーブルを作成
まず S3 バケットにデータを準備します。ここでは Amazon Athena 用サンプルデータの中から ELB のログを使用します。
AWS コンソールの上部から CloudShell を起動します。
以下のコマンドを実行して、ELB のログファイルをコピーします。BUCKET_NAME
は作成した S3 のバケット名に書き換えて実行してください。
$ aws s3 cp s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions/ \ > s3://BUCKET_NAME/hive-ads/ \ > --recursive copy: s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions/dt=2009-04-12-13-00/ec2-47-98-45-77.amazon.com-2009-04-12-13-00.log to s3://BUCKET_NAME/hive-ads/dt=2009-04-12-13-00/ec2-47-98-45-77.amazon.com-2009-04-12-13-00.log copy: s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions/dt=2009-04-12-13-00/ec2-64-28-73-15.amazon.com-2009-04-12-13-00.log to s3://BUCKET_NAME/hive-ads/dt=2009-04-12-13-00/ec2-64-28-73-15.amazon.com-2009-04-12-13-00.log ・ ・ ・ copy: s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions/dt=2009-04-14-13-00/ec2-47-98-45-77.amazon.com-2009-04-14-13-00.log to s3://BUCKET_NAME/hive-ads/dt=2009-04-14-13-00/ec2-47-98-45-77.amazon.com-2009-04-14-13-00.log copy: s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions/dt=2009-04-14-13-00/ec2-65-23-84-97.amazon.com-2009-04-14-13-00.log to s3://BUCKET_NAME/hive-ads/dt=2009-04-14-13-00/ec2-65-23-84-97.amazon.com-2009-04-14-13-00.log
Google Cloud の BigQuery コンソールで自分のプロジェクトのメニューでCreate dataset
をクリックします。
Project ID でプロジェクトを選択して、Dataset ID に任意のデータセット ID を入力して、Data location はaws-us-east-1
を選択します。そしてCREATE DATASET
をクリックします。
作成したデータセットのメニューでCreate table
をクリックします。
Create table from でAmazon S3
を選択して、Select S3 path で ELB のログをコピーしたパスを入力して、File format で ELB のログ形式に合わせてJSONL (Newline delimited JSON)
を選択して、Project で自分のプロジェクトを選択して、Dataset で作成したデータセットを入力して、Table に任意のテーブル名を入力して、Table type にExternal table
を入力して、Connection ID に作成したコネクションの ID を選択して、Schema の Auto detect は自動でスキーマを判定させるためにチェックしてCREATE TABLE
をクリックします。
S3 データにクエリを実行
作成したテーブルのメニューでQuery
をクリックします。
クエリエディタ上で以下のクエリを入力して、RUN
をクリックします。
SELECT * FROM `PROJECT.aws_sample_data.sample_data_1` LIMIT 100
先頭 100 行のデータを取得できました。
以下のクエリを実行して全レコードの件数を取得してみます。
SELECT COUNT(*) FROM `PROJECT.aws_sample_data.sample_data_1` LIMIT 100
件数が 100 万件と分かりました。
BigQuery のインタフェースで Amazon S3 のデータにクエリを実行できるため、Google Sheets での分析も可能です。
Google Sheets を開きます。メニューの [データ] - [データ コネクタ] - [BigQuery に接続] をクリックします。
作成した BigQuery テーブルがあるプロジェクトを選択します。
作成したデータセットを選択します。
作成したテーブルを選択して、接続
をクリックします。
ピボット テーブル
をクリックします。
新しいシート
を選択して作成
をクリックします。
ピボット テーブルで分析可能になります。
Amazon S3 のデータを直接 Google Sheets のピボット テーブルで分析ができました。しかし BigQuery ネイティブのテーブルに比べると速度が低いため、高頻度にクエリを実行するような分析の場合には Amazon S3 のデータを BigQuery 側のテーブルとして作成して、そのデータと接続したほうが良さそうです。
さいごに
大規模なクラウド利用を行っているとデータが各クラウドに分散している事があると思います。しかし、分析や機械学習は Google Cloud を使いたい場合にデータの連携に困ります。ここで BigQuery Omni を利用することで、各クラウドにためているデータにクエリを実行して必要な結果だけを Google Cloud に持ってこれます。
今回のオンデマンド料金モデルでは無料で BigQuery Omni を検証できるので、複数のメガクラウドを使用している場合には試してみるとよいのではないでしょうか。
- Colossus は Google の各種サービスのデータで利用されているストレージシステムです。詳細はColossus の仕組み: Google のスケーラブルなストレージ システムの舞台裏 を参照してください。 ↩
- ここでの Spanner はサービスとしての Cloud Spanner とは異なり Google 内部のインフラサービスとして利用される強整合性を備えたデータベース サービスを指しています。 ↩
- Borg は Kubernetes の元となった Google 内部で利用されるクラスタ管理システムです。 ↩
- Dremel は BigQuery のクエリ実行エンジンです。 ↩
- Jupiter は Google のデータセンターで利用されるネットワークです。詳細は進化する Jupiter: Google データセンターのネットワークの変遷を振り返って を参照してください。 ↩