2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZOZOAdvent Calendar 2022

Day 3

BigQueryのスケジュールクエリをキリの良いタイミングで実行する方法

Last updated at Posted at 2022-12-02

BigQueryで定期的な集計処理を行うときにスケジュールドクエリを利用することがあります。
Cloud ComposerなどのWorkflow Engineを使用するのと比較すると機能が貧弱ですが、気軽につかえるというメリットがあります。

例えば、1時間毎にクエリを実行したい場合は、以下のようなtfファイルをapplyすれば作成できます。

resource "google_bigquery_data_transfer_config" "scheduled_query" {
	display_name = "<表示名>"

	project = "<プロジェクトID>"
	location = "<処理を行うリージョン>"

	data_source_id = "scheduled_query"

	schedule = "every 1 hour"
	params = {
		"query" = "SELECT ..."
	}
}

しかし、この方法で作成したスケジュールクエリは1時間毎に実行されますが、cronの 0 * * * *のようには動いてくれません。
以下の実行ログから分かるように、毎時04分から処理が動きます。
なおかつ、この04分はterraform applyしたタイミングによって変化し、例えば12:34にapplyした場合は毎時34分に実行されます。

スクリーンショット_2022-11-24_18_22_37.png

every 1 hourという意味では間違っていないですが、cronのように毎時0分に動いて欲しいケースもあります。

どのようにすればapplyタイミングに依らずに毎時0分に稼働されることができるのでしょうか?

答え

synchronized を追記する。

every 1 hour synchronized と記載すると、毎時0分に実行されるようになります。

スケジュールクエリのscheduleを指定するときのフォーマットはAppEngineのものと同じなので、AppEngineのcron.yamlのドキュメントを確認します。

上記のドキュメントによると、 synchronizedfrom 00:00 to 23:59 を指定するのと同じであることが分かります。
つまり、 every 1 hourを指定するだけでは曖昧だったスケジュール実行の始点となる時刻を00:00に設定しています。これによって、毎時0分に実行されるようになります。

また、ドキュメントにも書かれている通り、 synchronized を指定する場合には、 every N hour のNは24の約数である必要がある点には注意が必要です。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?