Slide 1

Slide 1 text

Session Title BigQueryのコンピューティングリ ソース管理の取り組み Go Kojima Merpay Data Management

Slide 2

Slide 2 text

Go Kojima / @gouki ITシステム全般の研究開発からキャリアをスタート し、BigData、機械学習システムに関わるコンサル ティングやソフトウェア開発・運用支援業務に携わ る。 2021年8月 メルペイ入社。 機械学習システムの基盤開発に携わったのち、 Data managementチームに異動。主にBigQuery のコンピューティングリソース最適化を担当中。 株式会社メルペイ ソフトウェアエンジニア

Slide 3

Slide 3 text

● BigQueryとは ○ 課金モデル、SLOTについて ● 我々のSLOT管理における課題 ● 解決に向けた工夫・取り組み ● 今後の取り組み Mercari / MerpayのBigQueryの コンピューティングリソース管理の取り組み

Slide 4

Slide 4 text

BigQueryとは = Googleが提供するデータウェアハウスサービス https://cloud.google.com/bigquery/docs/introduction より BigQuery は、機械学習、地理空間分析、ビジネス インテリジェンスなどの組み込み機能を使用して データの管理と分析を支援する、フルマネージドのエンタープライズ データ ウェアハウスです。 BigQuery のサーバーレス アーキテクチャにより、SQL クエリを使用して、インフラストラクチャ管理な しで組織の最も大きな課題に対応できます。 BigQuery のスケーラブルな分散型分析エンジン を使用 すると、数テラバイト、数ペタバイトのデータに対し、数秒もしくは数分でクエリを完了できます。

Slide 5

Slide 5 text

BigQueryの課金モデル 処理 オンデマンド型 処理データ量に基づいて課金 ○ 毎月1TBまで無料 ○ ただし一度に利用できる SLOT は2000まで 定額型 処理に使う仮想CPUの 一定期間利用権を予約購入 ○ 月単位 ○ 年単位 ○ Flex Slots: 秒単位 (最初の60秒をすぎると  キャンセル可能) ※ただし料金体系は今後変更になる予定 ● 処理: BigQuery Editions (3レベルStandard, Enterprise, Enterprise Plus / 自動スケールSLOT) ● ストレージ: Compressed Storage ストレージ 保存領域ごとのデータ量で課 金 ○ アクティブストレージ ○ 長期保存

Slide 6

Slide 6 text

BigQueryのSLOTとは = SQLクエリを処理する仮想CPU 定額型の課金モデルは一定期間一定数の SLOTの利用料金を支払う方式 ● 使っていなくても料金はかかる ● クエリごとにどれだけSLOTが必要なのかはBigQueryが実行時に判断 => 一定期間に必要な分だけのSLOTを予約しておくことが重要 余計に買ってしまうと無駄になる (足りない分を補完するのがFLEX SLOTや自動スケールSLOTだが、   通常のSLOTよりも単価は高い)

Slide 7

Slide 7 text

SLOT管理の三つの概念 ● Commitment: 予約したSLOT ● Reservation: 利用するSLOTを割り当てるグループ ○ 複数のprojectを割り当て可能(1project - 1group) ● Assign: ReservationにコミットメントからSLOTを割り当てること

Slide 8

Slide 8 text

Reservation 利用例 https://cloud.google.com/bigquery/docs/reservations-workload-management より - 合計で 1,000 スロットのCommitment - データ サイエンス、ELT、BI という 3 つのワークロードの種類 - ReservationへのAssign: ds 500 スロット、elt 300 スロット、bi 200 スロット Reservation Aで利用していないSLOTがあるとき、 Reservation B, CからそのSLOTを利用できる

Slide 9

Slide 9 text

BigQuery SLOT管理の課題 ● Mercari/MerpayのBigQuery環境 ○ 定額 = コンピューティング容量ベースの料金モデル ○ 規模(過去90日間内でアクセスされている範囲、システムアクセス含む) ■ データセット数:1500超、JOB数: 30万超job/日、ユーザ数: 700人超/日 ● BigQueryが便利すぎるがゆえの課題 ○ SQLさえ書けば、大量データでもパフォーマンスを気にした書き方の工夫をさほどせずとも 欲しいデータを得ることができる ○ => ユーザ多数、自由なクエリ多数、 ○ どれだけクエリを実行してもなんのペナルティもないのでとても便利に使われている ○ => 大量のSLOT消費発生 => SLOT枯渇により全体のクエリ実行のパフォーマンスが低下 => CS業務や分析業務で必要なクエリが業務時間内に完了しない問題が発生 => 追加のSLOTコミットメントが必要に …

Slide 10

Slide 10 text

BigQuery SLOT管理のために ● まずは状況把握 ○ ダッシュボード整備 ○ 異常状態の通知 ● 管理効率化 ○ Reservationの整理 ● SLOT消費削減 ○ 無駄なJOBの停止 ○ SLOT消費を削減する技術 /機能活用 ○ 中間テーブルの作成・活用

Slide 11

Slide 11 text

状況把握 ● ReservationごとのCapacity要件を定義 ○ 「重さ」を表現するメトリクス ■ データ処理量あたりの実行時間 ■ 一定SLOTを消費するのにかかる時間 ○ 事象として避けたい要件のメトリクス ■ タイムアウト発生有無 ● 定めたCapacity要件をモニタリング ○ モニタリング用のWeb UIもあるが、規定のメトリクスのみ ○ 便利なJOBビュー / タイムスライス別ビュー ■ JOBS_BY_ORGANIZATION view ■ JOBS_TIMELINE_BY_ORGANIZATION view GCP提供のモニタリング用の Web UI

Slide 12

Slide 12 text

状況把握に便利なView ○ JOBS_BY_ORGANIZATION view ■ Organizationの範囲で1job 1レコード => job単位の状態把握に活用 ○ JOBS_TIMELINE_BY_ORGANIZATION view ■ Organizationの範囲で1jobの1秒間の状況 1レコード => 時間帯単位の状況把握に活用

Slide 13

Slide 13 text

JOBビュー / タイムスライス別ビュー利用例 DECLARE base_time TIMESTAMP; SET base_time = TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 MINUTE); WITH errors AS ( SELECT TIMESTAMP_TRUNC(end_time, SECOND) AS time_sec , reservation_id , COUNT(DISTINCT job_id) AS num_errors FROM `region-us`.INFORMATION_SCHEMA.JOBS_BY_ORGANIZATION WHERE base_time <= creation_time AND base_time <= end_time GROUP BY 1, 2 ) , jobs AS ( SELECT period_start AS time_sec , reservation_id , COUNT(DISTINCT job_id) AS num_jobs , SUM(period_slot_ms) / 1000 AS slots FROM `region-us`.INFORMATION_SCHEMA.JOBS_TIMELINE_BY_ORGANIZATION WHERE base_time <= period_start GROUP BY 1, 2 ) SELECT * except(num_errors) , coalesce(num_errors, 0) AS num_errors FROM jobs LEFT OUTER JOIN errors USING(time_sec, reservation_id) ORDER BY time_sec, reservation_id 一定時間枠ごと、Reservationごとのjob数、エラー発生数、利用 SLOT数

Slide 14

Slide 14 text

JOBビュー / タイムスライス別ビュー利用例(結果) time_sec reservation_id num_jobs slots num_errors 1 2023-06-15 10:14:10 UTC bi 4 378.957 0 2 2023-06-15 10:14:10 UTC ds 7 43.047 0 3 2023-06-15 10:14:10 UTC elt 4 2424.004 0 4 2023-06-15 10:14:11 UTC bi 1 0.058 0 5 2023-06-15 10:14:11 UTC ds 5 372.278 0 6 2023-06-15 10:14:11 UTC elt 15 10820.851 3

Slide 15

Slide 15 text

Capacity要件の状況把握 ● Capacity要件の状況をモニタリング ○ ダッシュボード作成 => 管理者・ユーザに公開 ○ ● Capacity要件違反をSlack通知 ○ 10分間隔でチェックして違反判明次第即通知 ○ 24時間単位でサマリ通知

Slide 16

Slide 16 text

管理効率化/Reservationの整理 一つのReservationで使い方が大きく二種類に別れていた ● Ad-hocな分析 ● システム用途のデータパイプラインの開発 観点 Ad-hocな分析 システム開発用途 使われ方 比較的処理時間短め、 素早く結果を得て活用する システムが必要とするデータを 整備するパイプラインを開発する SLOT消費の特徴 SLOT消費が少ない大量のJOB SLOT消費の大きい 少量のJOB 要件 長時間クエリを禁止してSLOT消費を抑え、素早 くデータが得られるように維持したい 長時間かかっても安定的にデータ処理群を運 用したい => 異なる要件が目的のプロジェクトが一つの Reservationに同居しておりSLOT管理がしづらい状態に ● 「SLOT管理」例: SLOT配分の増減、ダッシュボード・通知、強制 JOB停止 ● => 目的に応じてReservationを分割することで適切なReseravtion単位でSLOT管理を実施可能に

Slide 17

Slide 17 text

SLOT消費削減に向けた取り組み 無駄なSLOT消費をしている可能性のあるJOBに注意喚起・停止相談の通知 ● 通知対象 ○ SLOT消費の大きなJOB ■ => 注意喚起、クエリの工夫・停止を促す ○ SLOT消費の大きなテーブル作成 JOBでそのテーブルのアクセスがないもの ■ => 必要性の確認、JOBの停止を促す ● 実装 ○ JOBS_BY_ORGANIZATIONを使ってSLOT消費の大きいjobをモニタリング ○ Job作成者のuser_emailからslackのuser idを取得し、@mention付きで通知 ○ 通知対象(SQLで表現)や通知メッセージ( jinja2 templateで表現)をカスタマイズ可能な仕組みをフ レームワーク化して @mention付きの通知を容易に拡充

Slide 18

Slide 18 text

SLOT消費削減に向けた取り組み ● SLOT消費を削減する技術/機能活用 ○ Partition filter requirement ○ BI Engine ● 中間テーブルの作成・活用 ○ dbt ○ => よく使うテーブル群をあらかじめ作成しておくことでクエリの重複実行を削減 ● ダッシュボードの活用(Looker) ○ 閲覧者が多い情報に対してキャッシュ利用しやすい(クエリ実行自体が不要に) ○ 分析作業用にも利用 ■ SQLを記述しなくても済む分析作業には、効率的なクエリ実行にしやすい

Slide 19

Slide 19 text

今後の課題 ● Auto scaling SLOTの活用 ○ 新料金体系 BigQuery Enterprise / Enterprise plusの機能 ○ コミットメントから設定する固定の baseline slotに加え、baseline slotおよび他reservationのidle slotでSLOTが不足した場合に利用される auto scaling slot(の上限)を設定できる ○ Auto scaling slot分は利用されたSLOTの分だけ課金(通常よりも単価高い) ⇒ Baseline SLOTおよびAuto scaling SLOTのコスト最適設定 ● BI Engineの活用 ○ インメモリキャッシュ機能 ○ 指定した容量分(BI Engine Reservation)のインメモリを利用し、 クエリ処理上キャッシュヒットする分については SLOTを消費しない ○ 実行時間短縮効果以上に SLOT消費低減効果があることがわかってきている ⇒ BI Engine ReservationおよびReservationごとのSLOT 割り当てのコスト最適設定

Slide 20

Slide 20 text

No content