データ統合パイプラインの最適化とビルドパイプラインの最適化Foundry の使用最適化

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

Foundry の使用最適化

Foundry 使用最適化のベストプラクティス

以下のガイドは、Foundry の使用を最適化する方法とベストプラクティスを提供することを目指しています。この文書ではまず、Foundry での使用がどのように決定されるか、次に、使用の無駄やパイプラインの最適化をどのように特定するかについて説明します。一般的な推奨事項は、組織の使用消費を監視し、最適化することに注力しているプロジェクトマネージャーやプラットフォーム管理者にとっても関心があるかもしれません。

いつ最適化するべきか

これらのベストプラクティスをどのように実装するかを考える際、パイプラインやワークフローを早期に最適化するというよく知られた落とし穴に陥らないように重要です。ユーザーはパイプラインを早期に最適化することを避け、最適化のための一律の戦略を期待すべきではありません。

以下のメンタルステップをチェックして、ユーザーのアプローチの妥当性を確認することをお勧めします:

  • ワークフローは完成して動作していますか?そうでない場合、ワークフローの機能に影響を与える可能性のある早期の最適化に注意してください。
  • この最適化には明確な目的がありますか、例えば視覚化までの時間やコストなど、これを成功の指標としてさらなる決定を推進するものですか?
  • すでに上記の目的に対する明確なボトルネックが定義されていますか?

これらの質問のいくつかにまだ答えが出ていない場合、成功した最適化の努力をするためには、さらなる前準備が必要であることを示しているかもしれません。

これを念頭に置いて、以下に最適化の努力の良い例と悪い例を示します:

  • [良い例] 動作するパイプラインが $X のコストがかかっており、エンジニアにこれを減らすことができるかどうか尋ねられます。リソース管理 アプリは、コストの大部分が計算リソースに関連していることを示しています。ビルド頻度を表示すると、エンジニアはそれが毎日実行されていることを見つけますが、誰もそれを毎日使用していません。スケジュール設定をより頻繁に実行しないように変更すると、消費量が約 28% 減少します。その後、パイプラインはもはやプラットフォーム上で最も高価なものではなくなり、エンジニアは次のボトルネックを改善することに焦点を当てることができます。
  • [悪い例] エンジニアにパイプラインのストレージコストを最適化するための高度な戦略を設計するように頼まれ、大量のエンジニアリング時間が必要となります。戦略が実装されると、ストレージコストは減少しますが、全体的なインフラストラクチャの請求は同じままです。なぜでしょうか?ボトルネック、ストレージは、コストを節約するという目的に基づいて間違って識別されました。データセットのストレージサイズが不必要に高かったにもかかわらず、ストレージのコストが比較的低いため、変更はワークフローの総使用コストに対してほんのわずかな影響しか持たなかったのです。

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

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

  • リソース管理アプリケーションで使用状況を追跡できるようにプロジェクトを設定する
  • リソースキューを活用する
  • 可能な限りインクリメンタルパイプラインを使用する
  • スケジュールを管理して、組織の要件を満たし、それを超えないように実行していることを確認する
  • スパークの使用を最適化する(実装に対する快適さに応じて)

ステップ 1:Foundry 使用のコンポーネントを理解する

Foundry の使用は、Foundry 計算、オントロジー量、Foundry ストレージの3つのコンポーネントで構成されています。

ほとんどのアカウントはこの3次元モデルに基づいていますが、一部のアカウントでは使用基準が異なる場合があります。Palantir の代表との条件を確認してください。

1. Foundry 計算

Foundry 計算は、データ統合と分析のツールによって推進されます。Foundry 計算には3つの主要なタイプがあります:バッチ、インタラクティブ、ストリーミング。

バッチ計算は、"バッチ"容量で実行されるクエリやジョブを表します。つまり、特定のスケジュールの頻度またはアドホックな基準でバックグラウンドで実行するようにトリガーされます。バッチ計算のジョブは、実行していないときは計算を消費しません。バッチ計算の例としては、すべての変換ジョブ、Contour からのデータセットのビルド、コードワークブック、データ健康チェック、オントロジー/インデックス化ストレージへの同期などがあります。

インタラクティブ計算は、リアルタイムで評価されるクエリを表します。これは通常、インタラクティブなユーザーセッションの一部として行われます。ユーザーに迅速な応答を提供するために、インタラクティブ計算システムは常にオンのアイドル計算を維持します。つまり、インタラクティブクエリはバッチ評価よりも多くの計算を使用する傾向があります。インタラクティブ計算の主な形式は Contour - Contour のダッシュボード、分析、埋め込み Contour チャートはすべてインタラクティブ計算の例です。

ストリーミング計算は、常にオンの処理ジョブを表し、連続してメッセージを受信し、任意のロジックを使用してそれらを処理します。ストリーミング計算は、ストリームがメッセージを受信する準備ができている時間の長さについて測定されます。ストリーミング計算は、バッチとインタラクティブ計算に比べて最も高いコストを持っています。ストリーミング計算の例としては、ストリーミング変換と Pipeline Builder ストリームがあります。

バッチ、インタラクティブ、ストリーミングの計算使用量は、以下の要素によって推進されます:

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

2. オントロジー量

Foundry 使用の第二のコンポーネントは オントロジー量です。Foundry の最もユニークな機能の一つはオントロジーレイヤーです。オントロジーは、エンタープライズデータと組織が関心を持つオブジェクトとの間の翻訳レイヤーです。オントロジーは、データの世界をカテゴライズすることで、組織がそのデータを「航空機」や「車」などのより具体的な用語で考えることを可能にします。これは、それらを説明する多くの行と列の集約体ではなく。オントロジーに馴染みがない場合は、文書化から詳細を学ぶことができます。

オントロジー量は以下の要素によって推進されます:

  • オブジェクトの数:Foundry のオントロジーレイヤーは、オブジェクトタイプごとに数十億のオブジェクトまでスケールアップすることができます。オブジェクトタイプの総オントロジー量は、オブジェクトの総数に直接関連しています。
  • オブジェクトのサイズ:オントロジーオブジェクトは、それぞれが任意のタイプの数百のプロパティを持つことができます。より多くのプロパティや大きなプロパティ(例えば、長いテキストや画像)を持つオブジェクトは、より多くのオントロジー量を使用します。
  • オブジェクト間のリンク数:他のオブジェクトへのリンクが多いオブジェクトは、リンクメタデータのサイズが大きいため、より多くのオントロジー量を使用する可能性があります。

3. Foundry ストレージ

Foundry ストレージは、Foundry の非オントロジー変換レイヤーで格納される汎用データを測定します。これは時々 "コールドストレージ"と呼ばれます。

データセットのブランチと以前のトランザクション(およびビュー)は、単一のデータセットが消費するディスクスペースの量に影響を与えます。Foundry は、Foundry インスタンスを軽量に保つための様々な保持ルールを提供します。ファイルが DELETE トランザクションでビューから削除されると、ファイルは基礎となるストレージから削除されず、その結果、ストレージコストが継続的に発生します。サイズを減らす唯一の方法は、不必要なトランザクションをクリーンアップするために保持を使用することです。 DELETE トランザクションをコミットしたり、ブランチを更新したりすると、使用されるストレージは減少しません。

Foundry 使用の構成要素とそれが何に影響を与えるかを明確に理解することは、最適化の機会を理解するための洞察を提供できます。

Foundry アプリケーション使用影響のタイプ
コードリポジトリFoundry 計算
Pipeline BuilderFoundry 計算
Code WorkbookFoundry 計算
ContourFoundry 計算
ライブモデルFoundry 計算
オントロジーオントロジー量
データセットFoundry ストレージ

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

リソース管理アプリケーションは、組織が Foundry の使用消費を理解するための可視性と透明性を提供します。このアプリケーションを使うと、ユーザーは各 Foundry 使用タイプ(Foundry 計算、オントロジー量、Foundry ストレージ)ごとに分割された Foundry 使用消費を見ることができます。ユーザーはリソース(プロジェクト)、ソース(アプリケーション)、ユーザーごとに使用状況を見ることができます。

Foundry 使用をどこで最適化できるかを特定しようとする場合、最初にチェックするのはリソース管理アプリケーションです。これにより、最も計算を消費しているリソースを見ることができ、ボトルネックがどこにあるかを特定することができます。ここから、Foundry 使用最適化のベストプラクティスを活用して使用を減らす可能性のある方法を特定することができますが、常に覚えておいてください - ボトルネックに焦点を当てます

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

プロジェクトとリソース管理アプリケーション

上述したように、リソース管理(RMA)内でデフォルトではプロジェクトレベルでコンピューティングリソースが管理されています。RMA内では、プロジェクトごとに Foundry のコンピューティング、オントロジーのボリューム、および Foundry のストレージメトリックスが測定されます。したがって、データパイプライン全体で使用状況メトリックスを効果的に追跡するためには、適切なプロジェクト設定が非常に重要です。適切な設定により、データエンジニアやプラットフォーム管理者が、パイプラインの主要なフェーズでこれらの使用状況メトリックスを監視し、最適化すべき領域を特定できます。不適切な設定では、リソースが重く、計算コストが高いデータパイプラインの部分を特定できなくなります。

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

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

権限

使用状況削減戦略を検討する際、管理者はチーム内で誰がプロジェクトとリソースを作成する権限を持つべきかを検討する必要があります。設定のベストプラクティスに精通した最小限の人数にこのアクセスを制限することで、プロジェクトとリソースの広がりが抑えられ、不要なストレージとコンピューティングが削減されます。プラットフォーム上で任意のユーザーがプロジェクトを作成できるようにすると、使用状況を追跡するための推奨される構造に反してプロジェクトが作成され、不要で費用のかかるパイプラインが増えることになります。組織は、プラットフォーム上のユーザー数やデータアクセス制限に基づいて、プロジェクト作成アクセスを異なる方法で管理する場合があります。このアクセスを決定し、アクセスを持つ人々に適切なプロジェクト構造を教育するプロセスを開発することが、これらのリソースの適切な使用状況監視を可能にするために推奨されます。

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

リソース管理アプリケーション内で Foundry の支出を制御するための主要な機能は、リソースキューです。特定のプロジェクトや複数のプロジェクトに関連するコンピューティングパワーの量を制限するために、プロジェクトをキューにまとめることができます。各キューには、一度に使用される最大 vCPU 数を定義する特定のリソース制限が割り当てられます。たとえば、特定のキューに XXX 個の vCPU を割り当てることができ、これが割り当てられたプロジェクトで一度に実行される最大の vCPU 数になります。これにより、各プロジェクトが消費する使用量の可視性と認識が得られます。

ステップ 5: インクリメンタル・パイプライン

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

スナップショットトランザクション

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

スナップショットは、デフォルトのトランザクションタイプである理由は、使用が最も簡単であるためです。同期が実行されるたびに、データベースクエリから返されるすべてのデータをダウンロードし、以前のデータセットにあったすべてのデータを効果的に置き換えるスナップショットトランザクションを作成します。以前のトランザクションに存在したファイルは、もちろんデータセットの歴史的バージョンで引き続き利用可能ですが、プレビューやデータを使用した下流の変換は、デフォルトで新しいトランザクションにアクセスします。

もちろん、スナップショットトランザクションは正しく使用するのが簡単ですが、毎回すべてのデータをコピーすることは非常に非効率的です。効率改善の可能性のある1つの方法は、代わりに APPEND トランザクションタイプを使用することです。

追加トランザクション

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

ステップ 6: スケジュールの管理

Foundry の使用状況を最適化するもう1つの方法は、スケジュールを通じてです。スケジュールは、スケジューラツールで設定され、ビルドを定期的に実行して、Foundry を通じてデータが一貫して流れるようにします。

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

スケジュールを最適化するためのベストプラクティスを考慮する際の 2 つの大きなテーマは、1) 重複するスケジュールの削除と 2) 不要なスケジュールの削除です。

重複するスケジュールの削除

重複するスケジュールを特定するには、まずデータフローアプリケーションにアクセスし、ノードの色を Schedule Count に変更します。特定のノードに関連付けられた複数のスケジュールがある場合、そのノードを選択し、スケジュールの管理ツールを表示します。そこでは、関連するスケジュールを表示し、所有者を確認し、それらを統合できるかどうかを判断できます。

**ベストプラクティスは、パイプライン内の各データセットに対して、関連する 1 つのスケジュールビルドがあることを確認することです。**データセットが 2 つの異なるスケジュールでビルドされると、キューイングや両方のスケジュールの遅延、および無駄なバッチ計算が発生します。

重複するスケジュールを削減するためのもう1つのベストプラクティスは、完全なビルドを避けて、代わりに接続ビルドを使用することです。例えば、オントロジーパイプラインには、生のデータセット、クリーンなデータセット、データ変換が含まれ、最終的にオントロジーで終了する場合があります。生のデータセットで実行するスケジュール 1 つ、クリーンなデータセットで実行する 2 つ目のスケジュール、そして変換されたデータセットで実行する 3 つ目のスケジュールを設定する代わりに、生のデータセットがトリガーでオントロジーデータセットがターゲットである 1 つのスケジュールだけが必要です。

不要なスケジュールの削除

不要なスケジュールを特定するには、データフローアプリケーションにアクセスし、ノードの色を Time since last built に変更します。これにより、最も頻繁に更新されるデータを表示し、これが組織にとって最適な頻度かどうかを判断できます。

頻度とタイミングは、使用量を最適化する上で重要な要素です。組織はどのくらいの頻度でデータを更新する必要がありますか?

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

また、すべてのビルドを同時にスケジュールしようとしないでください。これにより、デバッグがより効率的になり、コンピューティングが少なくなります。頻度とタイミングを考える際には、組織の要件に戻って確認し、設定する更新レートが組織のニーズを満たすようにすることが重要です。

最後に、スケジュールを設定する際に詳細オプションを確認することが重要です。失敗時にビルドを中止を強制することを検討し、無駄なバッチ計算を削減してください。また、失敗したジョブの許可される試行回数を更新して、最大 5 回の試行に比べて 3 回以下に設定できます。また、ビルド間の分数を少なくとも 1 ~ 3 分に設定して、失敗の原因となったグリッチが解決する時間を与えることも推奨されます。

ステップ 7: Spark の最適化

Sparkは、高速で大規模なデータ処理と分析のためのオープンソースの分散クラスターコンピューティングフレームワークです。Spark は、複数のシステム間で作業を分割し、それらを並行して処理することで、コンピュータが大量のデータや分析をより簡単かつ迅速に処理できるようにします。

最初に断っておきますが、最適化に関する一般的なベストプラクティスとして、特定のボトルネックが特定された場合にのみ、手動で Spark の設定を調整することをお勧めします。これは、手動でオーバーライドされていない変換用に Foundry で新しい最適化機能が順次追加および有効化されているためです。簡単な例として、Spark 3 のダイナミックアロケーションが挙げられます。以前は、変換の実行者数を手動で設定することが非常に重要でしたが、現在では、実行時にこの数が自動的に調整されるため、無駄がなくなりました。

Spark の最適化は、Spark の概念に精通しており、パイプライン内での使用方法をよく理解しているユーザーによってのみ行う必要があります。

Spark の最適化の第一歩は、Spark プロファイルの確認と理解です。「Spark プロファイル」は、Foundry が分散コンピューティングリソース(ドライバーや実行者など)を適切な CPU コア数とメモリ量で設定するために使用する設定です。ほとんどの場合、手動で調整しようと試みるよりも自動プロファイルを使用することをお勧めします。ただし、場合によっては、必要のない大きなドライバーの使用が特定できることがあります。

Spark の使用状況の色付けをデータフローで使用して、より高いプロファイルを使用しているデータセットを特定できます。

以下は、最適化を開始する前に理解しておくべき、いくつかの主要な Spark の概念 と用語です。

  • ドライバーコア:Spark ドライバーに割り当てられる CPU コア数を制御します
  • ドライバーメモリ(JVM、オフヒープではない):Spark ドライバーに割り当てられるメモリ量を制御します
  • 実行者コア:各 Spark 実行者に割り当てられる CPU コア数を制御し、各実行者で並行して実行されるタスク数を制御します
  • 実行者メモリ:各 Spark 実行者に割り当てられるメモリ量を制御し、実行中のすべてのタスク間で共有されます
  • 実行者の数:ジョブを実行するためにリクエストされる実行者の数を制御します

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

  • コードの初期段階でデータを早期に削減することで、Spark のクエリオプティマイザを支援します。
    • 順序が重要です - データのフィルタリングが早い段階で行われるように、操作の順序を入れ替えます。
    • 必要のないものは削除します - データを最後まで待ってから削除すると、Spark の処理能力と時間がかかります。
  • 実行者間のデータ交換を最小限に抑えることを意識し、シャッフルと呼ばれるものを最小限に抑えます。
  • Spark アクション(countcollecttake など)の使用を意識し、最小限に抑えます。変換(filterselect など)が遅延実行されるのに対して、アクションは計算グラフに制約を加え、潜在的な最適化を防ぎます。
  • repartition(シャッフルしてすべてのデータを再構成)と coalesce(既存のパーティションをマージ)の違いを意識してください。
  • スキューを意識し、注意してください。スキューを解決するための多くの手法が存在し、その中には、左側のデータセットが十分に小さい場合にブロードキャスト結合を使用する方法や、「結合ソルティング」の手法があります。
  • ジョブの並行性を最大限に活用することを意識してください。Spark の詳細インターフェースは、各ステップでの実行並行性のビューを提供します。注意していただきたいのは、Spark のダイナミックな実行者割り当てを使用している場合(デフォルトで有効)、不要な実行者は可能な場合に自動的にスケールダウンされるため、無駄がありません。
  • Spark タスクの開始オーバーヘッド(Foundry の Spark Details インターフェースで表示可能)に注意してください。大量の小さなタスクはオーバーヘッドと不必要なデータ交換をもたらします。指標として、30 秒~60 秒が適切な数値です(ステージの合計時間と比較してください)。