[無料] 他クラウドのデータにクエリを実行できる BigQuery Omni が期間限定でオンデマンド料金で利用可能!

オンデマンド料金との記載がありますが実態は無料トライアルです。今まで定額料金で試しにくかったですが、検証がやりやすくなっています。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ウィスキー、シガー、パイプをこよなく愛する大栗です。

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 Omni pricing

定額料金モデル

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 を検証できるので、複数のメガクラウドを使用している場合には試してみるとよいのではないでしょうか。


  1. Colossus は Google の各種サービスのデータで利用されているストレージシステムです。詳細はColossus の仕組み: Google のスケーラブルなストレージ システムの舞台裏 を参照してください。 
  2. ここでの Spanner はサービスとしての Cloud Spanner とは異なり Google 内部のインフラサービスとして利用される強整合性を備えたデータベース サービスを指しています。 
  3. Borg は Kubernetes の元となった Google 内部で利用されるクラスタ管理システムです。 
  4. Dremel は BigQuery のクエリ実行エンジンです。 
  5. Jupiter は Google のデータセンターで利用されるネットワークです。詳細は進化する Jupiter: Google データセンターのネットワークの変遷を振り返って を参照してください。