はじめに
データ分析基盤において冪等性の問題は避けて通れないものではないかと思います。
当社ではtroccoを導入し、分析対象データのBigQueryへの集約を進めているのですが、集約にあたり細かなニーズが出てきました。一部のテーブルでスナップショットを取得したい(過去時点のデータを日別に保存しておきたい)というもので、これの取得時に冪等性を考慮する必要がありました。当初はBigQueryのシャーディング機能で実現しようかとも考えたのですが、troccoの機能で実現できました。
0. troccoについて
troccoはSaaS版Embulkといったサービスで、各種データ転送をGUIで設定できるだけでなく、Redshift/BigQueryへのクエリ発行やジョブ管理等の便利機能も提供されています。詳細は公式ページをご確認下さい。
1. 冪等性を担保する話
1.1 概要
上図は処理の流れを端的に表したものです。データ転送機能を用いてRDSインスタンスの内容をBigQueryに転送したのち、データマート機能を用いてスナップショットを保存しています。ここで冪等性を考慮し、保存時に当日分のスナップショットが既に存在する場合は当日分を削除してから保存する処理にしています。また、こうした処理の流れをワークフロー機能で管理しています。
データ転送時の冪等性の話は今回は割愛します。
##1.2 データマート機能と冪等性
1.2.1 データマート機能
上述の通り便利機能のうちのひとつであるデータマート機能
(BigQueryへのクエリ発行機能)を利用しています。これは公式の説明ページにあるようにDWH(現在はBigQueryまたはRedShift)に対してクエリを発行して集計や変換を行う為の機能です。
設定画面にはクエリ本体やクエリ発行先のテーブル、結果を書き込むテーブルを入力する欄が設けられています。変数を作成することもでき、これによってキューイング時の日付をクエリに入れ込むことができます。
以下はクエリの例ですが、保存したいカラムに加え、変数を利用したパーティション用カラムdtも記述しています。
このdtカラムを出力先設定の項目で入力することで、保存先テーブルのパーティションとして利用できるようになります。
1.2.2 冪等性の話
ここまで設定してようやく冪等性の話に帰ってくるのですが、以下の通り転送前に実行するクエリ
という便利機能があります。これを用いると、実際に転送を行う前に転送先テーブル内の当該パーティションを削除できます。これにより、データマート機能が何度実行されても同じパーティション内でデータが重複する事態を回避できるようになります。
2. GCPの権限の話/プロジェクトまたぎの処理
本筋から少し逸れますが、troccoでBigQueryを扱う場合、GCPで作成したサービスアカウントの認証情報をtrocco側に登録することになります。このサービスアカウントに権限を付与することで、データマート機能をGCPのプロジェクトをまたいで利用できます。
以下の図の例では、スナップショット保存先PJでサービスアカウントを発行し、転送先PJにて権限付与を行うことで、転送先PJにクエリした結果をスナップショット保存先PJに転送できるようになります。
図のようにスナップショット用PJを用意している場合や、データレイク層・データウェアハウス層・データマート層といった階層を別プロジェクトを作成することで構成している場合に有効な利用方法です。
3. まとめ
troccoを用いることで冪等性を考慮しつつスナップショットを取得する設定を簡単に行うことができました。転送前に実行するクエリ
機能がなかなか便利で、他にもアイディア次第で色々できそうな印象です。