Dataflow コストの確認と最適化に関するガイド
Google Cloud Japan Team
※この投稿は米国時間 2023 年 6 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。
Dataflow は、業界をリードするプラットフォームであり、バッチ処理機能とストリーミング データ処理機能が統合されており、さまざまな分析や ML のユースケースを支えています。また、Dataflow は柔軟な開発オプション(Flex テンプレートや Notebooks から、Java、Python、および Go 用の Apache Beam SDK まで)と充実した内蔵管理ツールを備えた、フルマネージド サービスです。Dateflow は、Pub/Sub、BigQuery、Vertex AI、GCS、Spanner、BigTable など Google Cloud のプロダクトだけでなく、Kafka や AWS S3 などのサードパーティ サービスともシームレスに統合し、分析や ML のニーズに最適な形でお応えします。
Dataflow は、ここ数年で急速に普及し、今では多くのお客様に、小規模な概念実証の設計から大規模な本番環境への展開まで、あらゆる工程でご利用いただいています。お客様は経費を最適化し、より少ない経費でより多くの成果を上げたいと常に考えているため、当然ながら、Dataflow のコスト最適化に関してご質問をいただくことがあります。
この記事では、Dataflow のコストと業務上の成果を把握し最適化するために、実例とプロダクトに関する知識に基づき、お客様が実践できるアクションを取りまとめました。まず、現在および直近のコストを把握する方法からご説明します。その後、Dataflow のパイプラインを長期にわたって、継続的に評価し、最適化する方法をお伝えします。それでは詳しく見ていきましょう。
現在および直近のコストを把握する
多くの場合、コストの最適化は、まず現状を把握することから始まります。Dataflow の場合、以下を効率的に行うことができるか否かに関わってきます。
Dataflow のコストの構成要素を理解する
今後見込まれるジョブにかかるコストを予測する
送信したジョブのコストをモニターする
Dataflow のコストの構成要素を理解する
Dataflow のジョブには、直接コストと間接コストがあります。直接コストは、ジョブにより消費されるリソースを反映したコストで、間接コストは、Dataflow のパイプラインにより可能になっている広範な分析や ML に対し生じるコストです。間接コストには、パイプラインから呼び出されるさまざまな API の使用などが含まれます。API の例としては、以下のようなものがあります。
BigQuery Storage Read API および BigQuery Storage Write API
Cloud Storage API
BigQuery のクエリ
Pub/Sub サブスクリプションおよび Pub/Sub へのパブリッシュ
下り(外向き)ネットワーク(ある場合)
直接コストと間接コストは、Dataflow パイプラインの総コストに影響します。そのため、両コストを直感的に理解し、その知識を活用して、分析や ML ソリューション全体の構造とコストを真に最適化するための戦略やテクニックを導入することが重要です。Dataflow の料金の詳細については、Dataflow の料金のページをご覧ください。
今後見込まれるジョブにかかるコストを予測する
今後見込まれる Dataflow のジョブのコストを予測するには、まず最初にそのジョブを小さいスケールで実行します。小さいスケールのジョブが正常に完了したら、その結果をもとに、本番環境のパイプラインのリソース消費量を推定します。それらの推定を Google Cloud 料金計算ツールに入力すると、本番環境パイプラインのコストの予測が算出されます。見込まれるジョブにかかるコストの予測の詳細については、こちらのブログ投稿、Dataflow ジョブのコストの予測をご覧ください(古いブログ投稿ですが、非常に有効です)。
送信したジョブのコストをモニターする
Dataflow 導入後すぐに利用可能なシンプルなツールをいくつか使用して、Dataflow ジョブの全体的なコストをモニターすることができます。また、このブログ投稿でご紹介する方法を利用するなどして、既存のパイプラインを最適化する際に、加えた変更がパイプラインのパフォーマンスやコスト、その他ユーザーが重要視する側面に与える影響も、モニターできます。Dataflow パイプラインをモニターする便利な方法として、以下のようなものがあります。
Dataflow UI の指標を使用して、パイプラインの主要な側面をモニターします。
CPU 使用率の高いパイプラインの場合、パイプラインをプロファイルし、パイプライン全体で CPU リソースがどのように使用されているかを把握します。
すぐに利用可能であり、ジョブにかかるコストを予測するうえでの良い基準になりうるDataflow ジョブの指標に関するモニタリング アラートを作成することで、リアルタイムでコストを管理できます。これらのアラートは、実行中のパイプラインに関連する指標が所定の基準を超えた場合に、リアルタイムで通知を行います。通知疲れを防ぐため、重要なパイプラインについてのみ、モニタリング アラートを作成することをおすすめします。
BiqQuery への課金データのエクスポートを有効にし、Dataflow コストの詳細なアドホック分析を行います。これによりコストの主要因だけでなく、これらの要因が時間とともにどのように推移しているかを確認できます。
ラベルの分類を作成し、Dataflow ジョブにラベルを追加すると、BigQuery を使用した Dataflow コストデータのアドホック分析の際に、コスト配分が容易になります。この方法について、こちらのブログ投稿で、いくつか例をご紹介していますので、ご覧ください。
Dataflow ジョブを実行する際にカスタム サービス アカウントを使用します。セキュリティの観点から有益であるだけでなく、Dataflow ジョブが使用する API を簡単に識別できるようになるという利点もあります。
Dataflow のコストを最適化する
Dataflow のコストが把握できたら、次のステップとして、最適化の可能性を探ります。コスト最適化のこの段階で検討すべき項目は以下のとおりです。
最適化の目標
パイプラインのコストを左右する主な要因
最適化されたバッチ パイプラインおよびストリーミング パイプラインの開発において考慮すべき点
では、これらのトピックを詳しく見てみましょう。
目標
「パイプラインのコストを削減する」というコスト最適化の目標は、疑う余地がないかもしれません。しかし、ビジネスによっては、コスト削減の目標とのバランスを取り、慎重に考慮すべき他の優先事項があるかもしれません。Dataflow をご利用いただいているお客様との会話から、多くの場合、コスト最適化には次の 2 つの主な目標があることがわかりました。
1. パイプラインのコストを削減する
2. ビジネスで必要とされるサービスレベル契約(SLA)を継続的に満たす
コスト要因
Dataflow パイプラインのコストを最適化できるかは、コストを左右する主な要因によります。これらの要因のほとんどは、現在および直近のコストを把握することで特定できますが、その中でも頻繁に繰り返し発生するコスト要因を特定し、3 つのカテゴリーに分類しました。それは Dataflow の構成、パフォーマンス、ビジネス要件の 3 つです。
Dataflow の構成に分類される要因の例は次のとおりです。
ストリーミング パイプラインかバッチ パイプラインのどちらにすべきか。
Streaming Engine や FlexRS のような Dataflow のサービスを利用しているか。
適切なマシンタイプやディスクサイズを使用しているか。
パイプラインに、GPU を使用するべきか。
初期ワーカー数および最大のワーカー数は適切か。
パフォーマンスに分類される要因の例は次のとおりです。
SDK のバージョン(Java、Python、Go)は、最新か。
IO コネクタを効率的に使用しているか: Apache Beam の強みの一つは、さまざまなストレージやキューイング システムへつなぐ IO コネクタの大規模なライブラリがあることです。Apache Beam の IO コネクタは、最大限のパフォーマンスを発揮するよう最適化されています。しかし、コストとパフォーマンスの間で妥協点を見つけなければいけない場合もあります。たとえば BigQueryIO には、書き込みのメソッドがいくつかありますが、それぞれパフォーマンスとコストの特性が異なります。詳細については、コストの最適化に関する Beam Summit セッションのスライド 19~22 ページをご覧ください。
効率的なコーダーを使っているか: コーダーは、パイプラインの中間のステージにおいて、ディスクに保存する必要があるデータや、専用のシャッフル サービスに転送する必要があるデータのサイズに影響し、コーダーによっては、他のコーダーよりも効率的なものがあります。処理されたシャッフル データやストリーミング データの合計などの、指標は、より効率的なコーダーを使用できる余地を特定するのに役立ちます。一般的なルールとして、パイプラインに表示されるデータに、重複するデータが含まれていないかどうかを検討する必要があります。重複データは、できるだけ早い段階で未使用の列をフィルタリングし、AvroCoder や RowCoder などの効率的なコーダーを使用することで取り除くことができます。また、パイプラインのステージが融合されている場合は、中間ステップのコーダーは不要となることを覚えておいてください。
パイプラインに並列読み込みをする十分な余地があるか: 実行詳細タブと、並列読み込み処理キーなどの指標は、パイプライン コードが Apache Beam の大規模に並列処理する機能を最大限活用できているかを判断するのに役立ちます(詳細については、並列読み込みをご覧ください)。たとえば、各入力レコードに対して複数のレコードを出力する変換(「高いファンアウトの変換」)があり、Dataflow の融合最適化を使ってパイプラインが自動的に最適化されている場合、パイプラインの並列読み込みは最適でない可能性があり、融合を防ぐことが有益な可能性があります。もう 1 つ注意すべき点は、「ホットキー」です。こちらのブログ投稿で詳しくご紹介しています。
カスタム変換は効率的か: パイプラインのプロファイリングや関連指標の確認など、ジョブのモニター方法を活用することで、カスタム変換の非効率な使用を特定し、修正することができます。たとえば、Java 変換で、データが特定の正規表現パターンにマッチするかどうかを確認する必要がある場合、setup メソッドでそのパターンをコンパイルし、「要素処理」のメソッドでコンパイル済みのパターンを使用してマッチングを行う方がはるかに効率的です。よりシンプルですが、非効率な方法として、「要素処理」のメソッド内で、String.matches() を呼び出す方法があります。この場合、毎回パターンをコンパイルする必要があります。カスタム変換に関して、もうひとつ考慮すべき点は、外部サービスを呼び出すための要素をグループ化することです。これにより、外部 API を呼び出すためのリクエスト バッチを最適化できます。最後に、ステップが複数ある処理を実行する変換(たとえば、API クライアントを作成したり閉じたりするための大規模な処理が必要な外部 API の呼び出しなど)では、これらの処理を分割して ParDo の別のメソッドで呼び出すことで、最適化できる場合が多いです(詳細については、ParDo ライフサイクルをご覧ください)。
過剰なロギングをしていないか: ログを取ることは大切です。デバッグに役立ち、デベロッパーの生産性を大幅に向上させることができます。その一方で、過剰なロギングは、パイプラインのパフォーマンスに悪影響を与える可能性があります。
ビジネス要件も、パイプラインの設計に影響を与え、コストを増加させる可能性があります。ビジネス要件に分類される要因の例は次のとおりです。
低レイテンシのエンドツーエンドの取り込み
極めて高いスループット
受信遅延データの処理
ストリーミング データのスパイクの処理
最適化されたデータ パイプラインの開発において考慮すべき点
これまでのお客様とのやり取りをもとに、Dataflow のコストを効果的に最適化するために容易に利用および実践することができるガイドラインをまとめました。ガイドラインの項目の例は次のとおりです。
バッチ パイプラインおよびストリーミング パイプライン:
Dataflow ジョブを入出力元および入出力先のサービスと同じリージョンに置くことを検討する。
ディープ ラーニング推論のような特別なユースケースでは、GPU の使用を検討する。
メモリやコンピューティングを多用するワークロードでは、それらに特化したマシンタイプの使用を検討する。
Dataflow ジョブに、ワーカーの最大数を設定することを検討する。
パイプラインの依存関係を事前にインストールし、ワーカーの起動時間を短縮するために、カスタム コンテナを使用することを検討する。
必要に応じて、ワーカー VM のメモリをチューニングする。
テストのパイプラインとステージングのパイプラインの数を減らし、不要になったパイプラインは忘れずに停止する。
バッチ パイプライン:
開始時間と実行時間に柔軟性のあるユースケースでは、FlexRS の使用を検討する。
より大きなデータセットに対して、より少ないパイプラインを実行する(パイプラインの開始と停止には、コストが発生し、非常に小さなデータセットをバッチ パイプラインで処理することは、非効率になる可能性があります)。
ビジネスに価値を提供することなく実行し続ける制御不能なジョブを排除できるように、ジョブの最大実行時間を設定することを検討する。
まとめ
この投稿では、Dataflow パイプラインに関連する現在および直近のコストを把握するのに役立つ、一連の知識とテクニックをご紹介しました。また、現在だけでなく、今後ビジネスが発展していく中でも Dataflow パイプラインの最適化に役立つ検討事項を共有しました。この投稿でご紹介したリソースが、皆様のお役に立つことを願っています。コスト削減や、お客様が顧客とビジネスのために提供することができる革新的なソリューションについて、皆様からのご意見をお待ちしております。
- ソリューション アーキテクト、Sergei Lilichenko



