BigQuery データセットのロケーションを変更したくなったときに読む note
暑い日が続いておりますが 、みなさまいかがおすごしでしょうか。ファンズでエンジニアリングマネージャーをしている @thorigoshi08 (改名しました)です。
つい先日、内々の事情から BigQuery(以後、BQと称します)データセットのロケーションを変更する作業を行いました。
一概に変更とは言ったものの、実際にはさまざまな制約があり、なかなか骨の折れる作業でした。
本エントリではBQデータセットのロケーション移管を行う最中で遭遇した制約について解説していきたいと思います。
データセットのロケーションは変更できない
出鼻をくじくようですが、そもそもBQにおいてデータセットの変更という直接的な操作は許可されていません。
そのため、新しいロケーションにデータセットを予め用意しておき、BigQuery Data Transfer Service (以降、BGDTSと称します)の Copy datasets などを活用し、データ転送をすることで実質的な変更の実現を目指す必要があります。
同プロジェクト内でデータセットIDの重複が許可されていない
BQのリソースはデータ分析の文脈等でさまざまな用途で利用されていることと思いますが、SQLなどを通じて問い合わせを行う際には、データセットIDを指定することが大半でしょう。
そのため、ロケーションの変更後もデータセットIDは現行の値を継続利用していきたいものではありますが、ここで問題になるのは同プロジェクトにおいてはロケーションが異なっていたとしてもデータセットIDを重複して配置できないという点です。
このことからデータセットIDをそのままにロケーションの変更を達成するためには対象のデータセットを削除した後、新しいロケーションにて同じIDで再作成を行う必要があります。
当然ながら、データセットを削除すれば内部のテーブルやVIEWなどの情報も失われてしまいます。
そのため、テーブルに関しては BQDTS などを通じて一時的に別のデータセットへバックアップしておき、バックアップされない VIEW などの定義は IaC 等で管理し、復元可能な状態にしておくことが必要になります。
同じSQLでロケーションが異なるデータセットへの問い合わせができない
BQをデータソースとし、BIなどを通じてSQLを発行する際、幾つかのデータセットを指定して問い合わせることも少なくないかとは思うのですが、このときロケーションの異なるデータセットを指定しての問い合わせが許可されていない点に注意が必要です。
↑の画像の通り、ロケーションの異なるデータセットを跨いで、クエリを発行しようとするとエラーとなってしまいます。
そのため、複数のデータセットを参照するSQLがあり、そのうち1つでもデータセットのロケーションを移管する場合は、SQL内で参照する全データセットのロケーションも合わせて変更が必要となります。
SQLのジョブプロセスとデータセットとでロケーションが一致していなければならない
BQにはジョブプロセスにもロケーションという概念があります。端的にいうとどこからSQLを実行するのかという仕組みです。
ジョブプロセスのロケーションは、SQLから問い合わせるデータセットと一致している必要があります。
そのためETLやBIツールからBQに対して操作を行う際、明示的に指定していた場合にはデータセットの移管先のロケーションに合わせて変更が必要となります。
例えば、弊社だとBIツールに Redash を利用しているのですがBQのデータソースの設定にて Processing Location の変更が必要でした。
ここまでの制約を踏まえた移管手順
これまでの内容を踏まえたうえで我々が実際に行った作業の手順は以下のようになりますので参考にしてみてください。
1. ロケーション移管対象のデータセットを洗い出す
データセットを跨いで問い合わせるSQLがエラーになってしまわないようにロケーションを移管する対象のデータセットを洗い出します。
2. VIEW/EXTERNAL VIEW を IaC の管理対象に追加
VIEW 及び、EXTERNAL VIEW はバックアップなどができないので、復元できるように IaC の管理対象とします。
3. 各種データ転送機構の停止
BQのロケーション移管はデータセットの削除を伴いダウンタイムが発生します。不要なエラーが発生しないよう、ETL等、各種データ転送機構を停止しておきます。
4. 各種データセットのバックアップ
別途データセットを用意し、BQDTS等を活用して現行データセットのバックアップを取得します。
5. ロケーション変更(削除→再作成)
現行のデータセットを削除し、別ロケーションを指定して再作成します。
6. データ復旧
BQDTSを活用してバックアップしたデータから新設したデータセットへの転送を行います。
7. データ転送機構の再開
停止していたデータ転送機構を再開します。この時、必要に応じてジョブプロセスのロケーションを移管先の値に変更します。
移管手順は以上となります。
終わりに
BQのロケーションを変更するうえでの制約事項について解説しました。
今回わたしたちは連携先の SaaS の契約体系の事情でロケーションの移管進める形となりました、もし同じような境遇の方がいらっしゃるとしたら参考になればと思い筆を走らせてみました。
お役に立てていたら幸いです。