データ接続と統合パイプラインの最適化パイプラインの最適化Foundry使用最適化

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

Foundry の使用量の最適化

Foundry の使用量を最適化するためのベストプラクティス

このガイドでは、Foundry の使用量を最適化するための方法とベストプラクティスを紹介します。このドキュメントでは、まず Foundry の使用量がどのように算定されるかを説明し、次に無駄な使用量の特定方法とパイプラインの最適化について説明します。一般的な推奨事項は、組織のリソース消費量の監視と最適化に重点を置いているため、プロジェクトマネージャーやプラットフォーム管理者にも役立ちます。

ここに記載されたベストプラクティスに加えて、Linter は Foundry の状態をチェックしてアンチパターンを検出し、リソースの状態を改善するための独自の推奨事項を提示します。これらの推奨事項を評価して対応することで、コストの削減、オントロジーの最適化、パイプラインの安定性と回復力の向上を図れます。

最適化のタイミング

これらのベストプラクティスをワークフローに適用する方法を検討する際には、パイプラインやワークフローを早い段階で最適化してしまうという、よく知られた落とし穴に陥らないことが重要です。パイプラインの早すぎる最適化は避け、最適化に万能な戦略があるとは考えないでください。

アプローチが妥当かどうかを確認するため、次の順に検討することをお勧めします。

  • ワークフローは完成し、動作していますか?そうでない場合は、ワークフローの機能に影響を及ぼす可能性がある早すぎる最適化に注意してください。
  • この最適化には、可視化までの時間やコストなど、明確な目標がありますか?その目標を成功のメトリクスとして、その後の意思決定の指針にできますか?
  • 上記の目標に対するボトルネックはすでに特定されていますか?

これらの問いにまだ答えられないものがある場合、最適化を成功させるには、さらに事前準備が必要かもしれません。

これを踏まえて、最適化の取り組みの良い例と悪い例を以下に示します。

  • [良い例] 稼働中のパイプラインに $X のコストがかかっており、エンジニアはこのコストを削減できるか尋ねられます。Resource Management アプリで確認すると、コストの大半がコンピューティングリソースに関連していることがわかります。ビルド頻度を表示すると、毎日使用する人はいないにもかかわらず、スケジュールが毎日実行されていることがわかります。スケジュールの設定を変更して実行頻度を下げれば、消費量を約28%削減できます。その結果、このパイプラインはプラットフォーム上で最もコストの高いパイプラインではなくなり、エンジニアは次のボトルネックの改善に注力できます。
  • [悪い例] エンジニアは、パイプラインのストレージコストを最適化するために、多大な開発工数を要する高度な戦略の設計を依頼されます。戦略を実装すると、ストレージコストは減少しますが、インフラ全体の請求額は変わりませんでした。なぜでしょうか?コスト削減という目標に照らすと、ストレージをボトルネックと特定したことが誤りだったためです。データセットのストレージサイズは必要以上に大きかったものの、コンピューティングに比べてストレージのコストは低いため、この変更がワークフロー全体の使用コストに与える影響はわずかでした。

一般的なベストプラクティス

Foundry の使用量を最適化するための一般的なプラクティスには、次のようなものがあります。

  • Resource Management アプリケーションで使用量を追跡できるようにプロジェクトを設定する
  • リソースキューを活用する
  • 可能な限りインクリメンタル(差分処理)パイプラインを使用する
  • 組織の要件を満たし、かつ必要以上に実行されないようにスケジュールを管理する
  • Spark の使用を最適化する(実装への習熟度に応じて)

ステップ1:Foundry 使用量の構成要素を理解する

Foundry 使用量は、Foundry コンピュート、オントロジーボリューム、Foundry ストレージの3つの要素で構成されます。

大半のアカウントでは、この3つの指標からなるモデルを採用しています。ただし、一部のアカウントでは使用量の基準が異なる場合があります。Palantir の担当者と契約条件を確認してください。

1. Foundry コンピュート

Foundry コンピュートは、データの統合と分析に使用するツールによって発生します。Foundry コンピュートには、バッチ、インタラクティブ、ストリーミングの3つの主な種類があります。

バッチコンピュートは、「バッチ」方式で実行されるクエリやジョブを指します。つまり、特定のスケジュールに従って、または随時、バックグラウンドで実行されるようにトリガーされます。バッチコンピュートのジョブは、実行されていないときにはコンピュートを消費しません。バッチコンピュートの例には、すべてのトランスフォームジョブ、Contour からのデータセットのビルド、コードワークブック、Data Health チェック、オントロジー/インデックス化済みストレージへの同期があります。

インタラクティブコンピュートは、通常、インタラクティブなユーザーセッションの一部としてリアルタイムで評価されるクエリを指します。ユーザーに高速なレスポンスを提供するために、インタラクティブコンピュートのシステムは、待機状態のコンピュートを常時稼働させています。そのため、インタラクティブクエリは、バッチ評価よりも多くのコンピュートを消費する傾向があります。インタラクティブコンピュートの主な形態は Contour です。Contour のダッシュボード、分析、埋め込みの Contour チャートは、いずれもインタラクティブコンピュートの例です。

ストリーミングコンピュートは、メッセージを継続的に受信し、任意のロジックで処理する、常時稼働の処理ジョブを指します。ストリーミングコンピュートは、ストリームがメッセージを受信できる状態にある時間の長さに基づいて測定されます。ストリーミングコンピュートは、バッチコンピュートやインタラクティブコンピュートと比較して、最もコストが高くなります。ストリーミングコンピュートの例には、ストリーミング変換や Pipeline Builder のストリームがあります。

バッチ、インタラクティブ、ストリーミングのコンピュート使用量は、次の要因によって決まります。

  • データロジック: データに適用するロジックは、Foundry 使用量に影響する最大の要因の1つであり、ユーザーが最も大きく影響を与えられる要因です。
  • 変換速度: 変換速度は、ジョブを並列化することで高められます。Foundry は、数千台のマシンを同時に稼働させる規模まで拡張でき、大規模なデータセットに対する膨大な計算を迅速に処理できます。ただし、結果をより速く得ることやジョブを並列化することによって、オーバーヘッドや非効率が生じ、使用量が増える可能性があります。
  • 計算の種類: 同じデータに対する処理でも、計算の種類によって必要なコンピュート量は異なります。たとえば、バッチ処理は実行時間中にのみコンピュートを使用する一方、ストリーミングは常時稼働するため、バッチ処理はストリームデータ処理よりもコンピュート使用量が少なくなる傾向があります。
  • データの規模と種類: データが多いほど、処理に必要なコンピュート量も多くなります。
  • データの鮮度: 新しい結果を計算する頻度が高く、スケジュールされた変換が多いほど、実行に必要なコンピュート量も多くなります。

2. オントロジーボリューム

Foundry 使用量の2つ目の構成要素は、オントロジーボリュームです。Foundry 独自の機能の1つに、オントロジーレイヤーがあります。オントロジーは、企業データと組織が重視するオブジェクトの間をつなぐ変換レイヤーです。オントロジーはデータの世界を分類するもので、組織はデータを、その対象を記述する多数の行や列の集計としてではなく、「航空機」や「自動車」といった、より具体的なものとして捉えられます。オントロジーになじみがない場合は、ドキュメントで詳しくはこちら。

オントロジーボリュームは、次の要因によって決まります。

  • オブジェクト数: Foundry のオントロジーレイヤーは、オブジェクトタイプごとに数十億個のオブジェクトを扱う規模まで拡張できます。オブジェクトタイプのオントロジーボリュームの合計は、オブジェクトの総数に直接関係します。
  • オブジェクトのサイズ: オントロジーのオブジェクトは、それぞれ任意のデータ型のプロパティを数百個持つことができます。プロパティの数が多いオブジェクトや、より大きなプロパティ(たとえば、長いテキストや画像)を持つオブジェクトは、より多くのオントロジーボリュームを使用します。
  • オブジェクト間のリンク数: ほかのオブジェクトへのリンクが多いオブジェクトは、リンクのメタデータのサイズにより、より多くのオントロジーボリュームを使用する場合があります。

3. Foundry ストレージ

Foundry ストレージは、Foundry のオントロジー以外の変換レイヤーに保存された汎用データを測定します。これは「コールドストレージ」と呼ばれることもあります。

データセットのブランチや過去のトランザクション(およびビュー)は、1個のデータセットが消費するディスク容量に影響します。Foundry には、インスタンスを無駄のない状態に保つためのさまざまな保持ルールが用意されています。DELETE トランザクションによってビューからファイルを削除しても、基盤となるストレージからファイルが削除されるわけではないため、ストレージコストは引き続き発生します。サイズを削減する唯一の方法は、保持機能を使用して不要なトランザクションをクリーンアップすることです。DELETE トランザクションをコミットしたり、ブランチを更新したりしても、使用中のストレージは減りません。

Foundry 使用量の構成要素と、それに影響する要因を明確に理解することで、最適化の機会に関するインサイトが得られます。

Foundry アプリケーション使用量に影響する種類
Code RepositoriesFoundry コンピュート
Pipeline BuilderFoundry コンピュート
Code WorkbooksFoundry コンピュート
ContourFoundry コンピュート
ライブモデルFoundry コンピュート
オントロジーオントロジーボリューム
データセットFoundry ストレージ

ステップ2:Foundry 使用量を追跡する方法を理解する

Resource Management アプリケーションは、組織が Foundry 使用量を把握できるように、使用量を可視化し、透明性を確保します。このアプリケーションでは、Foundry 使用量を種類別(Foundry コンピュート、オントロジーボリューム、Foundry ストレージ)に確認できます。リソース(プロジェクト)、ソース(アプリケーション)、ユーザーごとに使用量を確認できます。

Foundry 使用量を最適化できる箇所を特定する際に、最初に確認すべき場所は Resource Management アプリケーションです。これにより、どのリソースが最も多くのコンピュートを消費しているかを確認し、ボトルネックがある箇所を特定できます。そこから、Foundry 使用量の最適化のベストプラクティスを活用して、使用量を削減できる可能性のある方法を特定できます。ただし、常にボトルネックに注目することを忘れないでください。

ステップ3:Foundry の使用量を追跡できるようにプロジェクトを設定する

プロジェクトと Resource Management アプリケーション

前述のとおり、Resource Management (RMA) では、デフォルトでコンピューティングリソースがプロジェクト単位で管理されます。RMA では、Foundry のコンピューティング、オントロジーのボリューム、Foundry のストレージのメトリクスをプロジェクト単位で確認できます。そのため、データパイプライン全体で使用量のメトリクスを効果的に追跡するには、プロジェクトを適切に設定することが極めて重要です。適切に設定することで、データエンジニアやプラットフォーム管理者は、パイプラインの主要な段階でこれらの使用量のメトリクスを監視し、最適化すべき箇所を特定できます。設定が不適切な場合、データパイプラインの中でリソース消費が多く、計算コストの高い部分を特定できなくなります。

Foundry の使用量を追跡するための推奨プロジェクト構造

適切に構造化されたデータパイプラインを実現するために、Foundry のプロジェクトを使用する必要があります。プロジェクト設定のベストプラクティスとパイプラインの段階については、推奨されるプロジェクトとチームの構造に関するドキュメントで詳しく説明しています。データソースからの生データのインポートから実際のワークフローに至るまで、プロジェクトが推奨される構造に従っていることを確認することで、ユーザーはパイプラインの主要な段階に沿ってコンピューティングとストレージのメトリクスを分析できます。

権限

使用量を削減するための方策を検討する際、管理者は、チーム内の誰にプロジェクトやリソースを作成する権限を与えるべきかを検討する必要があります。この権限を、設定のベストプラクティスを理解している必要最小限の人数に限定することで、プロジェクトやリソースの乱立を抑え、不要なストレージとコンピューティングの使用を削減できます。プラットフォーム上のすべてのユーザーにプロジェクトの作成を許可すると、使用量の追跡に推奨される構造に反するプロジェクトが作成される可能性が高くなります。その結果、不要でコストの高いパイプラインが生まれ、最終的に使用量が増加します。組織によって、プラットフォーム上のユーザー数やデータアクセスの制限に基づき、プロジェクト作成権限の管理方法が異なる場合があります。これらのリソースの使用量を適切に監視できるようにするため、権限を付与する対象を決定するプロセスを策定し、権限を持つユーザーに適切なプロジェクト構造について教育することを推奨します。

ステップ4:リソースキュー

Foundry での支出を制御できる Resource Management アプリケーションの主要な機能の1つが、リソースキューです。特定のプロジェクトまたは複数のプロジェクトに関連する計算能力を制限するには、プロジェクトをキューにまとめます。各キューには、同時に使用される vCPU の最大数を定義する、特定のリソース上限が割り当てられます。たとえば、キューに XXX vCPU を割り当てると、そのキューに割り当てられたプロジェクトで、任意の時点に稼働する vCPU の最大数がその値になります。これにより、各プロジェクトが消費する使用量を可視化し、把握できるようになります。

ステップ5:インクリメンタル(差分処理)パイプライン

インクリメンタルパイプラインは、時間の経過とともに大きく変化する入力データセットを処理するためによく使用されます。変更されていないデータのすべての行やファイルに対する不要な計算を避けることで、インクリメンタルパイプラインはコンピューティングコストを最小限に抑えながら、エンドツーエンドの遅延を低減できます。これを実現するには、SNAPSHOT トランザクションと APPEND トランザクションの違いを理解する必要があります。

SNAPSHOT トランザクション

デフォルトのトランザクションの種類は SNAPSHOT です。SNAPSHOT トランザクションは、データセット内のすべてのデータの置き換えとして扱われます。つまり、最新のトランザクションの種類が SNAPSHOT であるデータセットを開くと、プレビューにはその最新の SNAPSHOT トランザクションで受信したデータのみが含まれます。データトランスフォームや Contour 分析でそのデータセットを読み取る場合も同様で、最新のトランザクションのデータのみが表示されます。

SNAPSHOT は最も使いやすいため、デフォルトのトランザクションの種類になっています。同期が実行されるたびに、データベースクエリから返されたすべてのデータがダウンロードされ、データセット内にそれまで存在していたすべてのデータを実質的に置き換える SNAPSHOT トランザクションが作成されます。以前のトランザクションに存在するファイルは、もちろんデータセットの過去のバージョンで引き続き利用可能ですが、プレビューと、そのデータを使用する下流のトランスフォームは、デフォルトで新しいトランザクションにアクセスするようになります。

もちろん、SNAPSHOT トランザクションを正しく使用するのは簡単ですが、毎回すべてのデータをコピーすることは非常に非効率になり得ます。効率を改善する方法の1つとして、代わりに APPEND トランザクションを使用することが考えられます。

APPEND トランザクション

データセットが APPEND トランザクションで構成されている場合、デフォルトのビューはすべてのトランザクションを合わせたものになります。つまり、APPEND トランザクションを使用する場合、すでにアップロードしたファイルを同期する必要はなく、新しいデータのみが Foundry に同期されます。各トランザクションには追加されたファイルのみが含まれ、ソースシステムで利用可能なすべてのデータのスナップショットは含まれないため、Foundry のストレージ使用量が削減されます。

ステップ6:スケジュールを管理する

Foundry の使用量を最適化するもう1つの方法は、スケジュールを活用することです。スケジューラーツールで設定するスケジュールは、ビルドを定期的に実行し、Foundry 内でデータが継続的に流れるようにするために使用します。

スケジュールは組織の要件を満たすように設定する必要がありますが、Foundry の使用量を最適化するには、効率的に設定し、必要以上に実行しないことが不可欠です。たとえば、データセットを毎日午前8時に更新するスケジュールを設定していても、実際には毎日午前8時に最新のデータが必要でなければ、組織は Foundry の使用量を無駄に消費しています。代わりに、最新のデータが必要な頻度に合わせて、たとえば1日おきの午前8時にスケジュールを設定します。この調整により、Foundry の使用量を半分に削減できます。

スケジュールの最適化に関するベストプラクティスを考える際に留意すべき最も重要な2つのテーマは、1)重複するスケジュールの排除と、2)不要なスケジュールの排除です。

重複するスケジュールを排除する

冗長なスケジュールを特定するには、まず Data Lineage アプリケーションを開き、ノードの色分けをスケジュール件数に変更します。1つのノードに複数のスケジュールが関連付けられている場合は、そのノードを選択し、スケジュールを管理ツールを表示します。そこで、関連付けられたスケジュールを表示し、所有者を確認して、統合できるかどうかを判断できます。

ベストプラクティスは、パイプライン内の各データセットに関連付けられたスケジュール済みビルドが1つだけになるようにすることです。 2つの異なるスケジュールでデータセットをビルドすると、キューでの待機が発生し、両方のスケジュールの処理が遅くなるほか、バッチコンピューティングが無駄になる可能性があります。

冗長なスケジュールを減らすためのもう1つのベストプラクティスは、フルビルドを避け、代わりに接続ビルドを使用することです。たとえば、生データセット、クレンジング済みデータセット、データトランスフォームを含み、最終的にオントロジーに至るオントロジーパイプラインが挙げられます。生データセットで実行するスケジュール、クレンジング済みデータセットを実行するスケジュール、加工済みデータセットで実行するスケジュールという3つのスケジュールを設定する代わりに、生データセットをトリガー、オントロジーデータセットを対象とする1つのスケジュールだけで済みます。

不要なスケジュールを排除する

不要なスケジュールを特定するには、Data Lineage アプリケーションを開き、最終ビルドからの経過時間でノードを色分けします。これにより、どのデータが最も頻繁に更新されているかを確認し、その頻度が組織にとって最適かどうかを判断できます。

スケジュールの頻度とタイミングは、使用量を最適化するうえで重要な要素です。組織では、どの程度の頻度でデータを更新する必要がありますか?

  • スケジュールを毎日に設定している場合は、週末にも最新のデータが必要かどうかを検討します。必要なければ、月曜日から金曜日のみ更新するようにスケジュールを変更することで、そのパイプラインまたはデータセットの Foundry バッチコンピューティング使用量を約30%削減できる可能性があります。
  • スケジュールを1日3回実行するように設定している場合、組織は更新されたデータを1日3回使用していますか。それとも夜間の1回で十分ですか?
  • 時間ベースのトリガーが必要ですか。それとも条件ベースのトリガーで対応できますか?パイプラインを毎日午前2時に更新するようにスケジュールする必要がありますか。それとも、特定の入力データセットが更新されたときだけ更新すればよいですか?イベントベースのトリガーは、時間ベースのトリガーよりも効率的で、使用量をより多く削減できる傾向があります。

また、デバッグをより効率的に行い、コンピューティング使用量を抑えるために、すべてのビルドを同じ時刻にスケジュールしないことを推奨します。頻度とタイミングを検討する際は、組織の要件に立ち返り、設定する更新頻度が組織のニーズを満たしつつ、それを超えないようにすることが重要です。

最後に、スケジュールを設定する際は、詳細設定を確認することが重要です。無駄なバッチコンピューティングを減らすために、一つのジョブが失敗した時点で Build を中止するを有効にすることを検討します。また、失敗したジョブに許可する試行回数を更新して、最大5回ではなく3回以下にすることもできます。さらに、失敗の原因となった一時的な不具合が自然に解消する時間を確保するために、再ビルド間の間隔を少なくとも1~3分に設定することを推奨します。

ステップ7:Spark を最適化する

Spark は、大規模なデータ処理と分析を高速に行うためのオープンソースの分散クラスターコンピューティングフレームワークです。Spark は、処理を異なるシステムに分割し、すべての処理が順番に完了するのを待つのではなく並列で実行することで、コンピューターによる大量のデータ処理や分析をより簡単かつ高速にします。

最初の注意事項として、また最適化に関する一般的なベストプラクティスとして、Spark の設定を手動で調整するのは、特定のボトルネックが見つかった場合のみにとどめ、プラットフォーム全体で日常的に行わないことを推奨します。これは、手動のオーバーライドがないトランスフォームに対して、Foundry で新しい最適化機能が順次追加され、有効化されるためです。わかりやすい例として、Spark 3 で導入された動的割り当てがあります。以前はトランスフォームのエグゼキューター数を手動で設定することが非常に重要でしたが、現在は無駄を避けるため、実行時にこの数が自動で調整されます。

Spark の最適化は、Spark の概念に精通し、パイプライン内での使われ方を十分に理解しているユーザーのみが行うべきです。

Spark の最適化の第一歩は、Spark プロファイルを確認して理解することです。「Spark プロファイル」は、Foundry が分散コンピューティングリソース(ドライバーやエグゼキューターなど)に適切な量の CPU コアとメモリーを割り当てるために使用する設定です。ほとんどの場合、手動で調整するのではなく、自動プロファイルを使用することを推奨します。ただし、不要な大規模ドライバーが使用されていることを特定できる場合もあります。

Data Lineage の Spark 使用量による色分けを使用すると、より大きなプロファイルを使用している可能性のあるデータセットを特定できます。

最適化を始める前に理解しておくべき主要な Spark の概念と用語を以下に示します。

  • ドライバーのコア数: Spark ドライバーに割り当てる CPU コア数を制御します。
  • ドライバーのメモリー(JVM、オフヒープではない): Spark ドライバーに割り当てるメモリー量を制御します。
  • エグゼキューターのコア数: 各 Spark エグゼキューターに割り当てる CPU コア数を制御します。これにより、各エグゼキューターで同時に実行されるタスク数が制御されます。
  • エグゼキューターのメモリー: 各 Spark エグゼキューターに割り当てるメモリー量を制御します。このメモリーは、そのエグゼキューターが実行しているすべてのタスクで共有されます。
  • エグゼキューター数: ジョブの実行に要求するエグゼキューター数を制御します。

Spark プロファイルに加えて、Foundry の使用量を削減するために Spark を最適化する際は、以下のベストプラクティスが出発点となります。

  • コードの早い段階でデータを減らし、Spark のクエリオプティマイザーを支援します。
    • 順序が重要です。データの絞り込みが早い段階で行われるように、操作の順序を変更します。
    • 不要なデータを削除します。不要なデータの削除を最後まで待つと、Spark の処理能力と時間が消費されます。
  • 「シャッフル」とも呼ばれるエグゼキューター間のデータ交換に注意し、最小限に抑えます。
  • Spark アクション(count、collect、take など)の使用に注意し、最小限に抑えます。遅延実行される変換(filter、select など)とは異なり、アクションは計算グラフに制約を課し、最適化の可能性を制限します。
  • repartition(すべてのデータをシャッフルして再編成)と coalesce(既存のパーティションをマージ)の違いを理解します。
  • データの偏りを認識し、注意します。偏りを解消する手法は多数あり、ブロードキャスト結合の使用(左側のデータセットが十分に小さい場合)や「結合ソルティング」などがあります。
  • ジョブの並列性を把握し、最大化します。Spark の詳細インターフェースでは、各ステップの実行の並列性を確認できます。Spark の動的エグゼキューター割り当て(デフォルトで有効)を使用している場合、可能なときには不要なエグゼキューターが自動的にスケールダウンされ、無駄がなくなります。
  • Spark タスクの起動に伴うオーバーヘッドに注意します(Foundry の Spark の詳細インターフェースで確認できます)。非常に小さなタスクが大量にあると、オーバーヘッドと不要なデータ交換が発生します。目安として、タスクの実行時間は30秒から60秒が適切です(ステージの合計時間との兼ね合いを考慮する必要があります)。

ワークフローで複数の単一出力トランスフォームと複数出力トランスフォームのどちらを使用するか検討している場合は、複数出力トランスフォームを最適化するガイドを参照してください。