LINEで送る
Pocket

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万レコードくらいになったら差分更新するよう改善していけば良さそうですね。しかし運用大変だ。

LINEで送る
Pocket


adachin

1989年生まれのLancers SRE。 ホスティングから大規模なアドテクなどのインフラエンジニアとして携わり、AnsibleやTerraformでのインフラコード化を推進。副業では数社サーバー保守、未経験によるエンジニアのメンターなども実施している。また、「脆弱性スキャナVuls」のOSS活動もしており、自称エバンジェリスト/技術広報/テクニカルサポート/コントリビュータでもある。現在はサービスの信頼性向上、可用性、レイテンシ、パフォーマンス、モニタリング、緊急対応、インフラコード化、リファクタリング、セキュリティ強化、新技術の検証、Docker開発環境の提供、AWSでのインフラ構築、グループ会社のインフラをECS/Fargateへ移行、CakePHP4での管理画面作成、メンター、分析基盤の運用を担当している。

0件のコメント

コメントを残す

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