02_応用

セクション5 応用:データワークロードの保守と自動化 🔧🎯

このファイルは 🔧 実践(中堅)🎯 発展(シニア) レベル。 「どう運用判断するか」「トレードオフは何か」「試験のひっかけ」に焦点を当てます。基礎概念は 01_基礎.md を参照。


5.1 リソース最適化の判断

🔧 Dataproc:永続 vs ジョブ単位(ephemeral)の判断

判断の軸
  ジョブが断続的(夜間バッチ等)+ アイドル時間が長い ──► ephemeral クラスタ(完了後破棄)
  クラスタを常に対話的に使う + ほぼ常時稼働 ─────────► 永続クラスタも検討

🔧 プリエンプティブル / Spot VM を使ってよいか

使ってよい 使ってはいけない
再実行可能なバッチ(冪等) ステートフルな低レイテンシ処理
Dataprocのセカンダリワーカー 単一障害で全体が止まる構成
大量並列で一部中断を許容 ストリーミングの主役・本番DB

🔧🎯 BigQuery:オンデマンド vs 容量ベース(Editions/予約)

観点 オンデマンド 容量ベース(Editions + 予約)
課金 スキャン量(TB単位) 確保したスロット時間
予算の読みやすさ 読みにくい(クエリ次第) 読みやすい(固定/上限)
向くケース 散発的・小〜中量・読めない 大量・継続・予測可能
コスト暴走リスク 大きなスキャンで急増 上限スロットで頭打ちにできる

🎯 ビジネスクリティカル処理へのリソース確保


5.2 自動化と再現性の設計判断

🔧 Composer DAG 設計のベストプラクティス

🔧 Composer / Workflows / Cloud Scheduler の使い分け

質問1: 多数タスクの複雑な依存・分岐・リトライ・バックフィルが要る?
  YES ──► Cloud Composer(Airflow / DAG)
質問2: 数個のAPI/サービスを順番に呼ぶ軽量な編成?
  YES ──► Workflows(サーバーレス・YAML/JSON)
質問3: 「定期的にトリガーする」だけ?
  YES ──► Cloud Scheduler(cron)

🎯 再現性(reproducibility)の作り込み


5.3 ワークロード編成の判断

🔧 インタラクティブ vs バッチ クエリの判断

状況 選択
ダッシュボード/対話分析、すぐ結果が要る インタラクティブ(デフォルト)
夜間の大量集計、急がない バッチ(スロット空き次第)
同時実行上限/スロット競合を避けたい バッチに回して平準化

🔧🎯 Editions の選択とコミットメント

Standard ────► まず使う・基本分析・小規模
Enterprise ──► 一般企業・機能とコミットメントが必要
Enterprise Plus ► 最高水準の機能・コンプライアンス・DR要件

5.4 監視とトラブルシューティングの判断

🔧 何で何を見るか(切り分けの型)

メトリクス(傾向・閾値) ──► Cloud Monitoring(CPU/スロット/スループット/エラー率)+ アラート
ログ(個別事象・原因) ───► Cloud Logging(エラーメッセージ/スタック/監査)
BigQuery固有の分析 ──────► INFORMATION_SCHEMA / 管理リソースチャート
コスト ──────────────────► 予算アラート / 請求のBigQueryエクスポート

🔧 BigQuery トラブルシュートの定番

症状 調べ方 / 対処
クエリが遅い INFORMATION_SCHEMA.JOBS でスキャン量・スロット・ステージを確認。パーティション/クラスタリング・スロット不足を疑う
コストが高い スキャン量の多いクエリを特定、SELECT * を避ける、パーティションプルーニング、容量ベースへ移行
スロット待ちで詰まる 予約のスロット不足。autoscaling/コミットメント増、バッチ化、予約分離
ジョブが失敗 エラーメッセージ+クォータ(同時実行/APIレート)を確認

🔧 クォータ・課金・エラーの切り分け

🎯 計画使用量の監視(capacity planning)


5.5 障害軽減(DR)の設計判断

🔧 冗長レベルの選び方(RPO/RTOで決める)

要件 構成例
RPO/RTO ほぼゼロ(無停止) Spannerマルチリージョン、Cloud SQL HA + クロスリージョンリードレプリカ、BigQueryマルチリージョン
RPO数分許容 リードレプリカ昇格、Datastreamで別リージョン複製
コスト優先・RPO数時間 定期バックアップ/エクスポートをGCSマルチリージョンへ

🔧 Cloud SQL:HA とリードレプリカの違い

HA構成 リードレプリカ
目的 可用性(自動フェイルオーバー) 読み取りスケール / DR
配置 同一リージョンの別ゾーン(スタンバイ) 同一/別リージョン
自動切替 あり なし(手動で昇格 = promote)

🔧 Memorystore (Redis) の冗長

🎯 データ破損・欠損への備え(サービス別カード)

誤って大量削除/更新した(BigQuery) ──► タイムトラベル(7日) で復元、超過分はスナップショットで保護
ストリーミングを取りこぼした(Pub/Sub) ──► シークで過去タイムスタンプへ巻き戻し再配信
Dataflowのストリーミング状態を保持/移行 ──► スナップショットから復元
DBを特定時点へ戻したい(Cloud SQL) ──► 自動バックアップ + PITR
GCSのオブジェクト上書き/削除 ──► バージョニングで復元

🎯 統合シナリオ演習(考え方の練習)

シナリオ:あるEC企業の運用課題。①毎晩、Spark変換ジョブを実行しているがDataprocの常時稼働クラスタのコストが高い。②BigQueryの月額費用が変動して読めず、重要なETLがアナリストのアドホッククエリでスロット不足になることがある。③ETLは多数のタスクが依存し、失敗時に手動でやり直していて再現性がない。④本番DB(Cloud SQL)がゾーン障害で一度停止した。⑤先週、分析者が誤って本番テーブルを上書きし、復旧に苦労した。⑥ジョブが時々失敗するが原因がすぐ分からない。

設計の骨子(解答例)

  1. Dataprocコスト:常時稼働を廃止し、ジョブ単位(ephemeral)クラスタ + データはGCSに。セカンダリワーカーをSpot VMに。完了後に自動削除。
  2. BigQueryコストとETL確保容量ベース(Editions + コミットメント)で月額を固定・上限化。予約を prod-etladhoc に分離し、重要ETLのスロットを確保。アドホックは別予約 + 急がないものはバッチクエリ
  3. 再現性:手作業をやめ、Cloud Composer の DAGでオーケストレーション。冪等設計(パーティション上書き/MERGE) + リトライ/タイムアウトで、失敗時に安全に再実行・バックフィル
  4. DB可用性:Cloud SQLをHA構成(別ゾーンにスタンバイ→自動フェイルオーバー)に。リージョン災害対策としてクロスリージョンのリードレプリカも配置。
  5. データ破損復旧BigQueryタイムトラベル(7日)で即時復元、重要テーブルはスナップショットで7日超も保護。
  6. 可観測性Cloud Monitoringでスロット使用率・エラー率にアラート、Cloud Loggingで失敗ジョブのエラーを追跡、INFORMATION_SCHEMAで高コスト/低速クエリとクォータを分析。

この「運用課題を、コスト最適化・自動化・キャパシティ・DR・監視の各カードに割り当てる」思考が本番の運用問題そのものです。


まとめ:このセクションの運用判断の型

03_要点と暗記.md で記憶を固めましょう。