BI(分析)基盤を運用していると必ず起こるのが、日々のレコード数上昇によりBigQueryへのシンクが遅くなってしまうということです。実際にRDS(MySQL)のレコード数はどのくらいあるのか調査してみたところ、1000万レコードもあるテーブルが複数存在しており、シンクも1時間半くらいかかっていました。こうなる前に差分更新により、前日のデータをシンクするように作れば高速になるので、今回対象のテーブルを改善するべく方法と注意点をまとめてみます。


■構成

Digdagのバッチで、EmbulkRDS(MySQL)のテーブルをガツンとBigQueryにシンクしています。これを前日分のみをシンクするとなると以下のような流れになります。

まずEmbulkhogeテーブルだとしましょう。このテーブルをBigQuerytmpというデータセットを作り、その中で前日分のhogeテーブルをシンクします。あとはDigdagから2つのテーブルを union all で結合して、主キーで partition by で行を追加します。BigQueryにはupdateの概念がないのでこのようなテクニックで実装することができます。では実際にコードを見てみましょう。


■Digdag/Embulk

  • embulk/hoge.yml.liquid

13行目WHEREを使ってINTERVAL 1 DAYを指定します。 28行目tmpに変更してあげましょう。

  • hoge.dig

7行目transformを使って、下記のSQLを叩くように実際に格納するテーブルに行を追加するわけですね。

  • queries/hoge.sql

このSQLではidカラムの固まりであるPartitionの中から行番号の1行目(並び順:modified desc)(1行目:rn = 1 )を抽出して、union all前日差分と全データを結合しています。

ちなみに私の場合だと、そのテーブルにidカラムがなく、user_idカラムで差分更新しようとしていたのでユーザーに対して、1レコードしか作られなくなる=レコード消えるということになりました。これは危ない。。基本idカラムで抽出条件を作るように気をつけましょう。


■まとめ

差分更新により1時間半のシンクが3分になりました!激速っ!今後は500万レコードくらいになったら差分更新するよう改善していけば良さそうですね。しかし運用大変だ。


adachin

1989年生まれのFindy/SRE。ホスティングから大規模なアドテクなどのインフラエンジニアとして携わる。現在はサービスの信頼性向上、DevOps、可用性、レイテンシ、パフォーマンス、モニタリング、オブザーバビリティ、緊急対応、AWSでのインフラ構築、Docker開発環境の提供、IaC、新技術の検証、リファクタリング、セキュリティ強化、分析基盤の運用などを担当している。個人事業主では数社サーバー保守とベンチャー企業のSREインフラコンサルティングやMENTA/TechBullで未経験者にインフラのコーチング/コミュニティマネージャーとして立ち上げと運営をしている。また、過去「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。

0件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください