本文へ移動

ホーム / Data / 第3部 データパイプライン

第3部 データパイプライン・第8章

オーケストレーションと運用

★★☆ 重要6トピック・面接 3問

パイプラインの実行の順番・時刻・失敗したときの動きを管理する方法を押さえる。

ひとことで

処理の依存関係・スケジュール・失敗時の再実行を管理する(Airflow・Dagster など)。

データの処理は「取り込みが終わったら変換、変換が終わったらテストとダッシュボードの更新」のようにつながっています。オーケストレーターは、この依存関係とスケジュールを管理し、失敗したら再実行し、通知を出す道具です。Airflow・Dagster・Prefect などがあり、クラウドの管理サービスもあります。

依存の順に実行し、失敗したら下流は待つ取り込み:注文取り込み:顧客取り込み:広告費staging3モデルmartfct_orders などテストBI 更新各タスクに再試行の回数・間隔・タイムアウト。対象の期間(データの日付)を引数で受け取る
オーケストレーターが管理する DAG の例

DAG(有向非巡回グラフ)は、処理(タスク)を矢印でつないだ図で、「戻る矢印がない」ので必ず終わりがあります。Airflow では Python で DAG を書き、各タスクの再試行の回数・間隔・タイムアウトを設定します。Dagster は「どのテーブル(アセット)がどのテーブルから作られるか」を中心に書くので、データの依存関係とそのまま対応します。

オーケストレーターの中で重い処理をしないのも大事です。実際の計算は DWH や Spark にさせ、オーケストレーターは「指示して、結果を待つ」役に徹します。

面接ではこう答える

オーケストレーターは、取り込みが終わったら変換、変換が終わったらテストとダッシュボードの更新、という処理の依存関係とスケジュールを管理し、失敗したら再試行し、通知を出す道具で、Airflow や Dagster があります。処理のつながりは戻る矢印のない DAG で表します。重い計算は DWH や Spark にさせ、オーケストレーターは指示して結果を待つ役に徹するのが基本です。

8.2バックフィル

用語★★☆ 重要
ひとことで

過去の期間をさかのぼって処理し直すこと。対象の期間を引数で受け取る冪等な処理にしておく。

日付を引数で渡し、同時に流す数を絞る11/0111/0211/0311/0411/0511/0611/0711/0811/0911/10完了実行中(同時に3つまで)待ち各日の処理は冪等なので、失敗した日だけ流し直せる
バックフィルの流し方(同時実行を3に絞った例)

バックフィルは、過去の期間をさかのぼって処理し直すことです。ロジックを直したとき、新しいパイプラインを過去分まで埋めるとき、障害で抜けた日を埋めるときに使います。うまくやるコツは次のとおりです。

  • タスクを「対象の期間(Airflow ではデータの期間・論理日付)」を受け取る形にし、実行した日時(今日)を処理の中で使わない。こうすれば過去の日付を渡すだけで再現できます。
  • 各期間の処理を冪等にしておく(何度流しても同じ結果)。
  • 同時に流す数を絞る。一気に100日分流すと、DWH の料金や業務 DB への負荷が跳ね上がります。

流す前に、何日分を、どの順で、何並列で、いくらかかりそうかを見積もり、下流の利用者に「この期間の数字が変わる」と知らせます。終わったら、作り直す前と後で件数と主な指標を比べます。

面接ではこう答える

バックフィルは、ロジックを直したときや障害で抜けた日を埋めるときに、過去の期間をさかのぼって処理し直すことです。うまくやるには、処理を「対象の期間」を引数で受け取る形にして今日の日付を中で使わないこと、各期間の処理を冪等にすること、同時に流す数を絞ってコストや業務 DB の負荷を抑えることが大事です。流す前に利用者へ数字が変わる期間を知らせます。

再試行は間隔を広げながら、回数を決めて行う0分1分5分20分1回目 失敗2回目 失敗3回目 失敗4回目 成功
一時的なエラーは自動の再試行で吸収し、回数を超えたら人に知らせる
設定・考え方することないと困ること
依存関係上流が成功したときだけ下流を流す取り込み途中のデータで集計してしまう
再試行回数と間隔を決めて自動でやり直す一時的なエラーで毎朝人が呼ばれる
タイムアウト・SLA決めた時間に終わらなければ知らせる止まったまま誰も気づかない
対象の期間を引数で渡す「どの日のデータか」を処理の外から決めるバックフィルで今日の日付が混ざる
同時実行の上限バックフィルで流す数を絞るDWH の料金や業務 DB の負荷が跳ね上がる

再試行してよいのは、処理が冪等なときだけです。冪等でない処理を自動で再試行すると、重複が増えます。また、データの中身の問題(テストの失敗)は再試行しても直らないので、再試行せずにすぐ知らせます。

「毎朝 6時に変換を流す」だけだと、上流の取り込みが遅れた日に、昨日のデータのまま、あるいは途中までのデータで集計してしまいます。

時刻で動かすか、データの到着で動かすか時刻(cron)毎朝 6:00 に実行作りが簡単上流が遅れると空のデータで動くデータの到着(センサー・イベント)上流のテーブルが更新されたら実行待ち時間が無駄にならない仕組みが少し複雑
上流が別のチームや外部なら、到着を確かめてから動かす
やり方内容
同じ DAG の中で依存させる取り込みのタスクが成功したら変換を流す。いちばん確実
センサーファイルの到着やテーブルの更新を、決まった間隔で確かめて待つ
データを単位にした実行Airflow のデータセット(アセット)や Dagster のアセットのように、上流のデータが更新されたら下流を動かす
鮮度の確認動く前に元のテーブルの最新の時刻を確かめ、古ければ止めて知らせる(dbt の source freshness など)

DAG は大きすぎても細かすぎても運用しにくくなります。「一緒に失敗して、一緒にやり直すもの」を1つの DAG にまとめるのが目安です。

考え方良い例困る例
元ごとに取り込みを分ける注文 DB・広告 API・イベントで別の DAG1つの API の失敗で全部が止まる
変換は dbt にまかせるAirflow は dbt build を呼ぶだけ。モデルの依存は dbt が持つdbt のモデル1つずつを Airflow のタスクに手で書き、依存が二重管理になる
オーケストレーターで重い処理をしない計算は DWH や Spark に指示するAirflow の作業用のマシンで大きな DataFrame を処理して落ちる
持ち主を決めるDAG ごとに担当チームと通知先がある誰の DAG か分からず、失敗が放置される

パイプラインは毎日どこかで失敗します。失敗したときに誰が・何を見て・どう判断するかを決めておくと、毎朝の対応が短くなります。

決めておくこと内容
通知の先と強さ利用者に影響する DAG は担当者に通知、それ以外はチャンネルに流すだけ
手順書よくある失敗(API の制限・認証の期限切れ・上流の遅れ)ごとの確かめ方と直し方
再実行の判断冪等なら失敗したタスクから再実行。データの問題なら直してからバックフィル
利用者への連絡鮮度の約束(SLA)に間に合わないときは、先に知らせる
振り返り同じ失敗が週に何度も起きるなら、再試行の設定や上流との取り決めを直す

毎朝の「失敗の確認と再実行」に時間を取られているなら、それは仕組みで減らすべき作業です。失敗の種類と回数を記録して、多いものから直します。

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • DAG・依存関係・再試行・タイムアウト
  • 再現できるバックフィルの作り方
  • 時刻で動かすか、データの到着で動かすか
  • オーケストレーターと DAG:処理の依存関係・スケジュール・失敗時の再実行を管理する(Airflow・Dagster など)。
  • バックフィル:過去の期間をさかのぼって処理し直すこと。対象の期間を引数で受け取る冪等な処理にしておく。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1過去1年分のデータをバックフィルするとき、何に気をつけますか?

模範回答

まず、処理が対象の期間を引数で受け取り、処理の中で「今日」を使っていないかを確かめます。そうでないと、過去の日付で流しても今日のデータが混ざります。各期間の処理が冪等であることも前提で、途中で失敗してもその日だけやり直せるようにします。

次に、同時に流す数を絞ります。一気に365日分を流すと、DWH の料金が跳ね上がったり、取り込み元の業務 DB に負荷をかけたりします。事前に1日分の料金と時間を測って全体を見積もり、利用者には「この期間は数字が変わる」と知らせます。終わったら、件数や合計を元のデータと突き合わせて確かめます。

深掘りされたら

  • バックフィル中に、毎日の通常の処理とぶつかったら?

見られているポイント冪等性・負荷・コスト・告知への配慮

Q2毎朝の集計のジョブが、上流の取り込みの遅れで空のデータのまま流れてしまいました。どう防ぎますか?

模範回答

時刻だけで動かしているのが原因なので、データの到着を確かめてから動くようにします。取り込みと集計が同じ DAG なら依存関係でつなぎ、別のチームや外部が上流なら、センサーやアセット単位の実行で、上流のテーブルが更新されたことを確かめてから流します。

あわせて、集計の前に元のテーブルの鮮度と件数をチェックし、古い・少なすぎるときは止めて知らせます。決めた時刻までに上流が届かなければ、利用者に遅れを先に伝えます。

深掘りされたら

  • 上流がいつまでも届かないときは、何時まで待ちますか?

見られているポイント時刻ではなくデータの状態で動かす発想

Q3Airflow と dbt を一緒に使うとき、役割をどう分けますか?

模範回答

Airflow にはいつ・何の後に動かすかと、取り込みや外部への書き戻しなど DWH の外の処理を任せ、DWH の中のモデルの依存関係とテストは dbt に任せます。Airflow からは dbt build を必要な範囲で呼ぶだけにします。

dbt のモデルを1つずつ Airflow のタスクに手で書くと、依存関係を二重に管理することになり、ずれて壊れます。モデルごとに再実行したい場合は、dbt の情報から自動でタスクを作る仕組みを使います。

深掘りされたら

  • dbt のモデルの一部だけを再実行したいときは?

見られているポイント道具ごとの責任の分け方と二重管理の回避