🗺️

BigQueryでデータセットを再作成することなくリージョン変更する

2024/06/19に公開

はじめに

こんにちは、Miotavaです。

最近では社内でBigQueryに触れる機会や連携されたデータも増えて、データ関連が好きな自分としてはハッピーな今日この頃です。

その反面、連携データが増えるにつれ、データセットリージョンが統一されていないことが困りごとを生んでしまいました。

困りごととは、USリージョンとAsiaリージョンなど異なるリージョンにあるデータセット間ではテーブルのJOINができないという問題です。これは分析観点では痛い問題となり得ます。

そして残念なことに、現在BigQueryではコンソール上の通常の操作では一発でリージョンを変更する機能はサポートされていません。

しかしながらコンソール上で"とある手順"を踏むことで比較的簡単にリージョンを変更することができましたのでご紹介します。

方法

概要

結論、BigQueryのクロスリージョンデータセットレプリケーション機能を使うことでデータセットの再作成なしに簡単に切り替えることができます。
https://cloud.google.com/bigquery/docs/data-replication?hl=ja

方針としては以下の通りでとても簡単です。

  1. 切り替えたいリージョンでレプリカを作成する
  2. 作成したレプリカをプライマリレプリカとして切り替え
  3. 切り替え元のレプリカを削除

※ 本記事ではasia-northeast1からUS(マルチリージョン)へ切り替える想定で進めます。

1. 切り替えたいリージョンでレプリカを作成する

データセット画面の下に「データセットのレプリカ情報」が表示されているので、そこから「レプリカを表示」を選択します。

すると、レプリカの一覧が表示されます。今はデータセットには1つのプライマリレプリカしかないことがわかります。

そこで「レプリカの作成」を選択し、「レプリカのロケーション」にて切り替えたい先のリージョンを選んで「レプリカの作成」を押下します。

しばらくすると、以下のようにセカンダリレプリカとして作成されたことがわかります。

2. 作成したレプリカをプライマリレプリカとして切り替え

セカンダリレプリカ(切り替え先のリージョンのレプリカ)右の3点リーダから「プライマリにプロモート」を選択します。

確認画面が出ますので「確認」と入れます。(以下のスクショは画面の指示通りにConfirmと入れて怒られているところです笑)

プロモートが開始されてしばらくするとプライマリとセカンダリが切り替わります。(自分の場合はデータ量が少なかったからか1,2分で切り替わりました)

3. 切り替え元のレプリカを削除

セカンダリレプリカとなった切り替え元のレプリカ右の3点リーダから「削除」を選択します。

こちらも画面指示に騙されずに(Deleteではなく)「削除」と入れて「確認」を押します。

すると「削除しました」と通知が出てレプリカ一覧でも削除が確認できます。

無事移行ができました!

注意点

当然ながら一時的にでもレプリカを作成するため、その分の費用が発生します。

具体的には、「レプリカを作成したリージョンでのストレージ料金」と「データレプリケーション費用」です。

特にデータレプリケーション費用については、クロスリージョンでのデータ転送費用が適用されるため、大量のデータ量を扱っている場合は注意が必要です。

詳細は以下を参照ください。
https://cloud.google.com/bigquery/pricing?hl=ja#data_replication

補足:他に検討した方法

BigQuery Data Transfer Serviceを使う

データセット名を一時的にでも変更することが許されている状況ならば「BigQuery Data Transfer Service」も選択肢にあがります。
https://cloud.google.com/bigquery/docs/dts-introduction?hl=ja

ただ、切り替えしたいデータセット名に対してすでに他から参照されているような状況だと変えるのは少々面倒そうです。(データセット名を変えないで運用するには仮のデータセットにTransferしつつ、元のデータセットを削除し希望リージョンで再作成&仮データセットから新データセットへTransferする必要があり画面操作が少々多め。そして作業の間一時的にデータセットが消失してしまう。)

SQLを実行してレプリカを作成 & プライマリ・セカンダリを切り替える

SQLで同様のレプリカ操作をすることもできますが、同様の操作が画面上でできるため特殊なケースでない限りわざわざSQLで実施するメリットは薄いかなと感じています。

スペースマーケット Engineer Blog

Discussion