Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【Tokyo dbt Meetup #12】dbtでETL/Reverse ETLやったら思っ...

Civitaspo
February 21, 2025
150

【Tokyo dbt Meetup #12】dbtでETL/Reverse ETLやったら思ったより運用が大変でした / The Challenges of ETL/Reverse ETL by dbt

Tokyo dbt Meetup #12 の登壇資料です。
https://www.meetup.com/ja-JP/tokyo-dbt-meetup/events/305733629/

Civitaspo

February 21, 2025
Tweet

More Decks by Civitaspo

Transcript

  1. © LayerX Inc. 3 バクラク事業部 機械学習‧データ部 DataOps チーム TechLead 兼

    Platform Engineering部 DevOps チーム 今⽇は福岡から来ました!!! Snowflake九州ユーザーグループ主宰 Snowflake Squad 2024 SNS 𝕏 civitaspo civitaspo その他 画像を⼊れてね civitaspo (キビタスポ/ きびちゃん) ⾃⼰紹介
  2. 5 © LayerX Inc. すべての経済活動を、デジタル化する。 会社概要 会社名 株式会社LayerX(レイヤーエックス) 代表取締役 代表取締役CEO 福島

    良典 代表取締役CTO 松本 勇気 創業 2018年 8⽉1⽇ 資本⾦ 約132.6億円 拠点 東京本社 〒104-0045 東京都中央区築地1-13-1 銀座松⽵スクエア 5階 関⻄⽀社 〒530-0002 ⼤阪府⼤阪市北区曽根崎新地1-13-22 御堂筋フロントタワー 内 中部⽀社 〒466-0064 愛知県名古屋市昭和区鶴舞1-2−32 STATION Ai 内 九州⽀社 〒810-0801 福岡県福岡市博多区中洲3-7-24 WeWorkゲイツ福岡 11F 内 従業員数 385名 (2024年10⽉末時点)
  3. 6 © LayerX Inc. 「すべての経済活動を、デジタル化する。」をミッションに、AI SaaSとAI DXの事業を展開 事業紹介 バクラク事業 企業活動のインフラとなる業務を

    効率化するクラウドサービス Fintech事業 ソフトウェアを駆使したアセットマネジ メント‧証券事業を合弁会社にて展開 AI‧LLM事業 社内のナレッジやノウハウをデータ ベース化するAIプラットフォーム AI SaaSドメイン AI DXドメイン
  4. © LayerX Inc.  7 「バクラク」シリーズラインナップ ‧AIが請求書を5秒でデータ化 ‧仕訳 / 振込データを⾃動作成 ‧電帳法‧インボイス制度にも対応

    仕訳‧⽀払処理効率化 ‧年会費無料で何枚でも発⾏可 ‧カード利⽤制限で統制を実現 ‧すべての決済で1%以上の還元 法⼈カードの発⾏‧管理 ‧帳票の⼀括作成も個別作成も⾃由⾃在 ‧帳票の作成‧稟議‧送付‧保存を⼀本化 ‧レイアウトや項⽬のカスタマイズも可能 請求書発⾏ ‧スキャナ保存データも直接取込  ‧AI-OCRが⾃動読取&データ化 ‧[取引先][取引⽇][取引⾦額]での検索 帳票保存‧ストレージ ‧AIが⾒積書‧請求書を5秒でデータ ‧スマホからも申請‧承認OK ‧柔軟な通知設定‧承認の催促機能 稟議‧⽀払申請 ‧直感的UIで従業員の負担を軽減 ‧Slack連携で打刻や⾃動リマインド可能 ‧わかりやすい残業 / 休暇管理レポート 勤怠管理 ‧AIが領収書を5秒でデータ化 ‧スマホアプリとSlack連携あり ‧領収書の重複申請などミス防⽌機能 経費精算
  5. ⽬次 Agenda • バクラクにおけるETL/Reverse ETL事例 • dbtでETL/Reverse ETLする嬉しさ • dbtでETL/Reverse

    ETLする⾟さ • ⾟さ①: 実⾏ライフサイクル • ⾟さ②: エラーハンドリング • ⾟さ③: 環境差分吸収 • おわりに
  6. © LayerX Inc. 14 • Pythonを使って外部APIからデータを取得 し、データを格納するパターン • 前回取得データがあれば、incrementalに データ取得可能なAPIであれば、可能な限り

    incremental modelにする運⽤にしていま す。 事例①: dbt Python Modelを使ったETL バクラクにおけるETL/Reverse ETL事例 前回実⾏時間以降のデータを取得する場合、格納先テーブルから前回更新時刻の最⼤を取得 その時刻を元にAPIリクエストを組み⽴てる。
  7. © LayerX Inc. 15 • Snowflake Marketplaceで、SaaSデータ連携 ⽤のStored ProcedureやUDFを取得できるこ とがある。

    • それらStored ProcedureやUDFを使⽤した SQLでデータ取得するパターン。 事例②: Stored ProcedureやUDFでETL バクラクにおけるETL/Reverse ETL事例 ※ Snowflake Marketplace はSnowflake上でデータ‧アプリケーションを配布するプラットフォーム ※ UDFは正確にはUDTF = User Defined Table Function
  8. © LayerX Inc. 17 • Pythonを使って外部APIなどへデータを書き 戻すパターン • dbt Python

    Modelは何らかのデータをDWH 側に返せば良いので、外部APIをCallしつつ、 実データとしては何も保存しない、といった 使い⽅ができる。 • バクラクでは、外部APIに送付したレコード を保存しておき、再実⾏時に既に送付済みの レコードは送付しないようにしている。 事例③: dbt Python Modelを使ったReverse ETL バクラクにおけるETL/Reverse ETL事例
  9. © LayerX Inc. 19 • dbt Python Modelは使⽤するadapterごとに実⾏環境が異なります。 ◦ BigQueryの場合はDataproc

    ◦ Snowflakeの場合はSnowpark ◦ Databricksの場合はPySpark ◦ … • いずれの実⾏環境もちょっとした設定を加えるだけで実⾏環境を⽤意することができます 嬉しさ①: 特別な実⾏環境が不要 dbtでETL/Reverse ETLする嬉しさ
  10. © LayerX Inc. 20 • dbtでETL/Reverse ETLを⾏うと、データ取得元からデータ送信先まで⼀気通貫で依存関係を構築で きます • エラー発⽣時にdbtの情報だけで影響範囲を特定できます

    • データ変更時に、下流のデータモデルへの影響がシュッと把握できるのも嬉しいポイントです 嬉しさ②: Data Lineageがdbt内で完結する dbtでETL/Reverse ETLする嬉しさ
  11. © LayerX Inc. 25 • TransformはCI/CDで関連モデルを全て実⾏したい • ⼀⽅、ETL/Reverse ETLは⾼頻度で実⾏出来ないケースもある ◦

    世の中には優しく叩かないといけないAPIが多い ETL/Reverse ETLと純粋なTransformはライフサイクルが異なる ⾟さ①: 実⾏ライフサイクル 安直に全モデルをビルドするのは危険! 1⽇1回の更新にして欲しい 変更のたびに更新したい
  12. © LayerX Inc. 26 • --select、--exclude、--selector の対象を、変更ファイルや実⾏コンテクストによって⾃動 的に⽣成するようにして解決 • dbtの実⾏は必ずTask

    Runner経由で⾏い、実⾏コンテクストはTask Runner内で⾃動判定している 解決策: バッチ実⾏時‧CI/CD時の実⾏対象モデルを⾃動⽣成 ⾟さ①: ライフサイクル ※ exclude models の⽣成スクリプトは運⽤ルールを知らないと読めないので割愛しています。 Pull RequestなContextで変更差分を取得するスクリプト ローカル環境なContextで変更差分を取得するスクリプト
  13. © LayerX Inc. 27 • dbt-labs/jaffle-shopでも使われてるTask Runner • YAMLでタスク定義を書けるので、学習コストが低い •

    細かい単位でタスクを定義するので、シェル芸⼈しかメンテできないスクリプトが⽣まれにくい 閑話休題: taskfile.devが便利 閑話休題
  14. © LayerX Inc. 29 • 5xxエラーやRate Limitなど外部要因のエラーによってdbtの実⾏が失敗する • また、⼤量のデータを取得‧送信するときに途中でエラーが起きるとゼロから再実⾏になる ◦

    dbtは処理途中のデータを保存しない ◦ 特にデータ送信では、データ重複の原因になるので避けたい 外部要因のエラーがそれなりに起きる ⾟さ②: エラーハンドリング
  15. © LayerX Inc. 31 • Snowflakeでdbt Python Modelを動かした場合、ログはEventテーブル※ に格納される •

    Eventテーブルに定期的にクエリを投げて、条件に合致したレコードをSlackに通知している エラーを検出して通知する(Snowflake編) ⾟さ②: エラーハンドリング ※ Snowflake Event table overview https://docs.snowflake.com/en/developer-guide/logging-tracing/event-table-setting-up
  16. © LayerX Inc. 33 • [CT-997] [Feature] Support dbt.var +

    dbt.env_var in Python models · Issue #5617 · dbt-labs/dbt-core · GitHub • Jinjaも使えないので、環境差分吸収が難しい dbt Python Modelはvarsが使えない ⾟さ③: 環境差分吸収 dbtはcompile時にPython Modelを実⾏して評価するわけではないので、こういった動的定義もエラーになる
  17. © LayerX Inc. 36 もし今日の話を聞いて「面白そうなやつだ」と思ったら x.com/civitaspo のフォローをお願いします! もし今日の話を聞いて「もっと話したい!」と思ったら「civitaspo layerx カジュアル面談」で検索!検索!

    データエンジニアもアナリティクスエンジニアもアナリストも全方位、採用強化中です! 興味のある方は「jobs.layerx.co.jp」から採用情報を見てみてください!! ご視聴ありがとうございました! おわりだよ〜 おわり