【Cloud Data Fusion】GCSバケット消えない問題

4 min read読了の目安(約3800字

はじめに

以前、GCPのローコードETLサービスであるCloud Data Fusionでパイプラインを作成して
記事投稿しました。

https://zenn.dev/hssh2_bin/articles/478e6a41e103c7

書き終えた喜びも束の間、意図しないGCSバケットが大量に生成されていました。

GCSバケット削除画面

このバケットには、パイプライン実行中に生成されるAVRO形式の中間ファイルが置かれます。
パイプラインは、Dataproc(Hadoop Spark)で実行されているためです。

パイプライン実行後は、バケット内は空になりますが、バケットだけが残ってしまいます。
しかも、パイプラインを実行するたびに新規でバケットが生成されてしまいます。

これはなかなかイケていない仕様になっているなと思い
「どうにかならんかな...」ということで改善策について検討しました。

今回実施した内容

対策案として、以下の2つの案が考えられると思いました。
❶パイプライン実行後に自動でバケットが削除する方法
❷特定のGCSバケットを指定することで自動生成されない方法

今回の内容は上記❷として、Temporary Bucket Nameを指定する方法になります。

https://cdap.atlassian.net/wiki/spaces/DOCS/pages/464912425/Google+BigQuery+Table+Sink

こちらが説明文になります。
...あれ、これだとTemporary Bucketを指定せずとも終わったら自動で消えるって(笑)

Optional. Google Cloud Storage bucket to store temporary data in. It will be automatically created if it does not exist, but will not be automatically deleted. Temporary data will be deleted after it is loaded into BigQuery. If it is not provided, a unique bucket will be created and then deleted after the run finishes.

設定項目は、BigQuery Pluginsのプロパティ内にあります。

Temporary Bucket Nameの設定場所

今回は細かいことは気にせず、まずは試してみましょう!ということで...

利用環境

Product version
CDAP 6.4.0 (Developer)
BigQuery Sink Plugin 0.17.0
Region asia-northeast1

【構成図】

【補足】
Sink BigQueryで設定をしています。

実施内容

  1. Temporary Bucket Nameを指定しない場合
  2. Temporary Bucket Nameを指定する場合

1. Temporary Bucket Nameを指定しない場合

まず、パイプライン実行前のGCSバケットの個数と一覧を確認しました。

確認コマンド
$ sudo gsutil ls | wc -l
2
$ sudo gsutil ls
gs://tmp_bucket
gs://bino_dev_bucket

パイプライン実行し、StatusSucceededとなり、以下のログメッセージが出ればOKです。
※ ログはStatusの左隣のLogsボタンで閲覧できます。

15時12分1秒のタイミングで中間ファイルが削除されています。
3609aa21-3416-4f62-840d-14a451bfeb8aが自動生成されたバケットになります。

Successfully deleted GCS output path ‘gs://3609aa21-3416-4f62-840d-14a451bfeb8a/3609aa21-3416-4f62-840d-14a451bfeb8a/input/xxxxxxxxxxxxxxxxxxx-3609aa21-3416-4f62-840d-14a451bfeb8a’.

gsutil ls コマンドを実行するとバケット数が3個に増えていました。
(3609aa21-3416-4f62-840d-14a451bfeb8a追加)

確認コマンド
$ sudo gsutil ls | wc -l
3
$ sudo gsutil ls
gs://tmp_bucket
gs://bino_dev_bucket
gs://3609aa21-3416-4f62-840d-14a451bfeb8a

2. Temporary Bucket Nameを指定する場合

先のパイプラインをコピーし、Sink BigQueryのプロパティを開きます。
Temporary Bucket NameにGCSバケット(tmp_bucket)を入力します。
※ GCSバケットは作成済みのバケットであればなんでもOKです。

パイプライン実行し、StatusSucceededとなり、先と同じログメッセージが出ればOKです。
指定したGCSバケット(tmp_bucket)の中にbcf33b1e-657a-40ce-b666-8a3962d9063cという
フォルダが作成されたログが出ていました。

Successfully deleted GCS output path ‘gs://tmp_bucket/bcf33b1e-657a-40ce-b666-8a3962d9063c/input/xxxxxxxxxxxxxxxxxxx-bcf33b1e-657a-40ce-b666-8a3962d9063c’.

gsutil ls コマンドを実行するとバケット数は3個のまま、新規バケットはありませんでした。

確認コマンド
$ sudo gsutil ls | wc -l
3
$ sudo gsutil ls
gs://tmp_bucket
gs://bino_dev_bucket
gs://3609aa21-3416-4f62-840d-14a451bfeb8a

まとめ

さて、いかがでしたでしょうか?

BigQueryのプラグインにあった項目のTemporary Bucket Name
バケット名を入力すると自動でのGCSバケット作成がされませんでした。

よって、対策案❷が有効なことが分かりました。
これで安心してCloud Data Fusionを利用できそうですね!

オチですが、本対応している際中にバグ認定され
5/27(木)にBigQuery Pluginのバグ修正[1]がされていました。

CDF 6.4.1、BigQuery Plugin 0.17.3ではちゃんとバケットが削除されるようです^^
CDF 6.4.0を利用している方はご注意ください!!

Fixed an issue in the BigQuery plugins to correctly delete temporary storage buckets.

脚注
  1. Relsase notes ↩︎