大規模計算基盤としてのBigQuery導入事例
株式会社enechain / ysysys1
メンバー / バックエンドエンジニア
利用プラン | ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
---|---|---|---|
オンデマンド | 10名以下 | 2023年7月 | B to B |
利用プラン | オンデマンド |
---|---|
ツールの利用規模 | 10名以下 |
ツールの利用開始時期 | 2023年7月 |
事業形態 | B to B |
アーキテクチャ
アーキテクチャの意図・工夫
計算ジョブはNestJSのStandalone Applicationとして起動され、BigQueryに対してジョブを投げます。 ジョブの結果は、そのままBigQueryのテーブルにinsertされるか、RDB(CloudSQL)やCSVとしてCloud Storageにアップロードされます。 全体のワークフローの管理にはArgo Workflowsを用いています。
計算ジョブは一回の計算で数十に及びます。 そのため、どこかで計算が失敗してもリトライが可能なように冪等性を意識した実装をしています。
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
弊社では、eScanというETRMツールを開発しております。ETRM(Energy Trading and Risk Management)とは、エネルギー取引にまつわるリスクを管理するソフトウェアで、電力の調達データ・販売量データ・電力市場の価格・燃料価格などを元にユーザが抱えるリスクを可視化し管理できます。
リスクの算出にあたっては、大規模なデータをもとに高度な計算を行う必要があります。
サービス開始当初は、Node.js上で計算処理が実装されていましたが、データ量の増加や機能拡充に伴い、次第にリソースを逼迫するようになり、またその処理自体の遅さが目立つようになりました。
あるときには、想定以上のインプットデータで計算が行われてOOMが発生するなど、限界が見えていました。
また、ユーザ数の増加に伴い計算が行われる頻度が上がっており、並列での処理が難しいNode.jsから他の基盤への移行を検討することになりました。
比較検討したサービス
- Spark
比較した軸
- 大量データの取り扱いが容易か
- 並列で処理が可能か
- リソースの管理を気にしなくてもいいか
選定理由
- 大量データの取り扱いが容易か
- テラバイト規模のデータも高速で処理できる
- 並列で処理が可能か
- 可能
- リソースの管理を気にしなくてもいいか
- フルマネージドなサービスなので任せることができる
その他にも下記の点が魅力的でした。
- JavaScript UDFを駆使してSQLだけでは対応が難しい複雑な処理を組み込めること
- 全社的にGoogle Cloudを利用している、かつBigQueryは他サービスで導入済みであったこと
導入の成果
計算基盤をBigQueryに移行した後は想定通り、計算をより高速に、またデータ量が増大しても、性能に大きな劣化がなく安定した状態で実行できるようになりました。 計算時間は移行前と比べて25倍以上の高速化に成功しています。
フルマネージドなので、リソースの心配もほぼなくなり、同時に複数個の計算を走らせても問題なく実行できる環境になりました。
計算の途中結果を残して置けることも大きな利点となりました。
Node.jsでの計算では、途中結果を何処かに保持する処理のオーバーヘッドが大きく実現することができなかったのですが、BigQueryに移行後は、計算を数十のステップに分割し、各ステップで途中結果をテーブルに保存し、次のステップでその結果を使って処理を行っていくような作りにしたことで、一連の計算結果を簡単に参照することが可能になりました。
また、他のGCPサービスとの連携のしやすさも優れた点です。
ユーザのインプットデータは基本的にはCloud SQL(PostgreSQL)に保存されており、計算時にはそれらを使用します。
BigQueryからCloud SQL 連携クエリ(いわゆるEXTERNAL QUERY)を用いることで、簡単にCloud SQL内のデータにアクセスすることができます。
さらに、計算結果をCSVとしてCloud Storageにエクスポートすることも難なく行うことが可能で、入口と出口をシームレスに繋ぐことができるのは大きな利点であると考えます。
導入時の苦労・悩み
当然といえば当然ではありますが、Node.js/TypeScriptで実装されていた処理を、SQLに書き換える膨大な作業を行う必要がありました。 移行後にも、一定期間古い基盤を生かしたまま並行稼働させ、計算ロジックに誤りがないかを確認して、万全を期しました。
また、どうしてもSQLで表現することが難しいロジックがあり、そこに対応できるかが危ぶまれました。 ただ、BigQueryにはユーザ定義関数をJavaScriptで実装し組み込むことができる機能があるので、それを活用することでロジックを移行することができました。
ローカルでの動作確認・テスト実行が難しい点も課題となりました。 実環境に向けて開発を行うと、どうしても費用面で懸念が発生します。 また、各開発者の環境の分離も上手くコントロールする必要があります。 そこで、eScanではBigQuery EmulatorというOSSを用いることにし、動作確認やテストを行っています。
導入に向けた社内への説明
上長・チームへの説明
導入については、すでに社内の他プロダクトで導入・運用されており大きな障壁なく導入が進みました。 チーム内外でも既存の計算手法では限界が見えていることは共通認識としてあったので、新計算基盤の方針や設計を固めた後は導入・移行に向けて着々と開発を進めていくことになりました。
活用方法
よく使う機能
- クエリの実行
- ユーザ定義関数(UDF)
- 特にSQLだけでは表現が難しいロジックをJavaScript UDFとして実装することができるのが非常に強力
- CSVエクスポート
ツールの良い点
- リソースの管理をほとんど意識する必要がない
- 他のGCPサービスとのシームレスな連携が可能
ツールの課題点
- 開発時の動作確認・テストが難しい
- データ量によっては予期せぬ料金が発生する可能性がある
ツールを検討されている方へ
BigQueryはDWHとしての使い方が一般的だと思いますが、eScanではこのように、優れた高速性や分散処理性能を活かして、大規模なデータに対する複雑な計算を任せています。 活用していくなかで感じるのは、他のGCPサービスとの連携のしやすさです。 すでにGCPを使っているのであれば、BigQueryを選択するメリットは大きいのではないかと思います。
株式会社enechain / ysysys1
メンバー / バックエンドエンジニア
よく見られているレビュー
株式会社enechain / ysysys1
メンバー / バックエンドエンジニア
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法