Azure Synapse Link for Azure Cosmos DB でのカスタム パーティション分割

適用対象: NoSQL MongoDB Gremlin

カスタム パーティション分割を使うと、分析クエリでフィルターとして一般的に使われるフィールドで分析ストア データをパーティション分割して、クエリ パフォーマンスを向上させることができます。

この記事では、分析ワークロードに不可欠なキーを使用して Azure Cosmos DB 分析ストアでデータをパーティション分割する方法について説明します。 パーティション排除によるクエリ パフォーマンスの向上を活用する方法についても解説されています。 また、ワークロードで多数の更新または削除が行われるときに、カスタム パーティション分割によってクエリのパフォーマンスがどのように向上するのかについても説明します。

Note

カスタム パーティション分割を利用するには、Azure Cosmos DB のアカウントとコンテナーで Azure Synapse Link が有効になっている必要があります。

それはどのように機能するのでしょうか。

分析ストアのパーティション分割は、トランザクション ストアのパーティション分割に依存しません。 既定では、分析ストアはパーティション分割されません。 日付、時刻、カテゴリなどのフィールドに基づいて分析ストアのクエリを頻繁に実行する場合は、カスタム パーティション分割を使って、これらのキーに基づいてパーティション分割されたストアを別に作成できます。 分析ストアのパーティション キーとして、データセットの 1 つのフィールドまたは複数のフィールドの組み合わせを選ぶことができます。

Azure Synapse Link を使って、Azure Synapse Spark ノートブックからパーティション分割をトリガーすることができます。 バックグラウンド ジョブとして 1 日に 1、2 回実行するようにスケジュールできますが、必要に応じてより頻繁に実行することもできます。

Note

パーティション分割ストアは、Azure Synapse ワークスペースにリンクされている ADLS Gen2 プライマリ ストレージ アカウントを指します。

Architecture of partitioned store in Azure Synapse Link for Azure Cosmos DB

パーティション分割ストアには、パーティション分割ジョブを最後に実行したタイムスタンプまでの Azure Cosmos DB 分析データが格納されます。 パーティション キー フィルターを使って分析データのクエリを実行すると、Synapse Link は、パーティション分割されたストアのデータと、分析ストア内の最新の変更を、自動的にマージします。 このようにして、クエリの最新の結果が得られます。 データはクエリの実行前にマージされますが、差分はパーティション分割ストアに書き戻されません。 分析ストアのデータとパーティション分割ストアの間の差分が拡大するにつれて、パーティション分割されたデータのクエリ時間が変わります。 パーティション分割ジョブをより頻繁にトリガーすると、この差分は減少します。 パーティション ジョブを実行するたびに、完全なデータ セットではなく、分析ストア内の増分変更のみが処理されます。

使用する局面

Azure Cosmos DB の分析データに対してクエリを実行する場合、パーティション分割ストアの使用は省略できます。 Synapse Link を使用して、既存の分析ストアと同じデータに対して直接クエリを実行することができます。 次の要件がある場合は、パーティション分割ストアを有効にすることをお勧めします。

  • パーティション列として使われる可能性がある一般的な分析クエリ フィルター
  • カーディナリティの低いパーティション列
  • パーティション列により、データが複数のパーティションに均等に分散される
  • 更新または削除操作の量が多い
  • データ インジェストが遅い

パーティション キーとは異なるクエリ フィルターを使ってライブ データのクエリを実行する場合は、直接分析ストアのクエリを実行することをお勧めします。

メリット

パーティション排除によるデータ スキャンの削減

一意の各パーティション キーに対応するデータがパーティション分割ストアに併置されているため、クエリ フィルターとしてパーティション キーを使用すると、クエリ実行で基になるデータを取り除いて、必要なデータのみをスキャンできます。 パーティション排除では、限定されたデータをスキャンして、分析クエリのパフォーマンスを向上します。

分析データの柔軟なパーティション分割

特定の分析ストア コンテナーに対して複数のパーティション分割戦略を設定できます。 クエリの要件に基づいて、複合または個別のパーティション キーを使えます。

クエリ パフォーマンスの向上

パーティションの排除によるクエリ機能の向上に加えて、カスタム パーティション分割では次のワークロードのクエリ パフォーマンスが向上します。

  • 更新/削除負荷の高いワークロード - 分析ストア内で複数バージョンのレコードを追跡し、クエリの実行時に毎回それらを読み込む代わりに、パーティション分割ストアには最新バージョンのデータのみが含まれます。 この機能により、更新や削除が多いワークロードがあるときに、クエリのパフォーマンスが大幅に向上します。

  • 低速のデータ インジェスト ワークロード - パーティション分割によって分析データが圧縮されるため、低速のデータ インジェストを含むワークロードでは、この圧縮によってクエリ パフォーマンスが向上する可能性があります。

トランザクション保証

カスタム パーティション分割では完全なトランザクション保証が確保されることに注意してください。 パーティション分割の実行中は、クエリ パスがブロックされません。 各クエリ実行では、前回成功したパーティション分割から、パーティション分割されたデータを読み取ります。 分析ストアから最新のデータを読み取ることで、パーティション分割ストアの使用時に、常に最新の使用可能なデータがクエリによって返されます。

セキュリティ

分析ストアに対してマネージド プライベート エンドポイントを構成した場合は、パーティション分割されたストアにもマネージド プライベート エンドポイントを追加することをお勧めします。 パーティション分割ストアは、Synapse ワークスペースに関連付けられているプライマリ ストレージ アカウントです。

同様に、分析ストアでカスタマー マネージド キーを構成した場合は、パーティション分割ストアである Synapse ワークスペース プライマリ ストレージ アカウントでも、それを直接有効にする必要があります。

パーティション分割戦略

分析データには 1 つ以上のパーティション キーを使えます。 複数のパーティション キーを使っている場合、データのパーティション分割方法に関して次のような推奨事項があります。

  • 複合キーを使う:

    たとえば、Key1 と Key2 に基づいて頻繁にクエリを実行するとします。

    たとえば、"ReadDate = '2021-10-08' かつ Location = 'Sydney' であるすべてのレコードのクエリを実行する" とします。

    この場合、ReadDate が一致するレコードと、その ReadDate 内の Location が一致するレコードをすべて検索するには、複合キーを使うといっそう効率的です。

    サンプル構成オプション:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    これで、"Location" フィルターに基づいてクエリを実行できます。

    • 分析ストアに直接クエリを実行したい場合もあります。 パーティション分割されたストアにより、最初に ReadDate、次に Location によって、すべてのレコードがスキャンされます。 そのため、分析データのワークロードとカーディナリティによっては、分析ストアに直接クエリを実行した方が良い結果が得られる場合があります。
    • また、別のパーティション ジョブを実行して、同じパーティション分割ストアで 'Location' に基づいてパーティション分割することもできます。
  • 複数のキーを個別に使う:

    たとえば、あるときは 'ReadDate' に基づいて、またあるときは 'Location' に基づいて、頻繁にクエリを実行するとします。

    たとえば、次のように入力します。

    • ReadDate = '2021-10-08' であるすべてのレコードのクエリを実行する
    • Location = 'Sydney' であるすべてのレコードのクエリを実行する

    このシナリオでは、次のように定義されたパーティション キーを持つ 2 つのパーティション ジョブを実行します。

    ジョブ 1:

    .option("spark.cosmos.asns.partition.keys", "ReadDate String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    ジョブ 2:

    .option("spark.cosmos.asns.partition.keys", "Location String") \
    .option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \
    

    上のパーティション分割では、"ReadDate" と "Location" のフィルターを一緒に使って頻繁にクエリを実行するのは効率的ではないことに注意してください。 そのような場合は、複合キーを使うとクエリのパフォーマンスが向上します。

制限事項

  • カスタム パーティション分割は、Azure Synapse Spark でのみ使用できます。 現在、サーバーレス SQL プールではカスタム パーティション分割はサポートされていません。

  • 現在、パーティション分割ストアでは、Synapse ワークスペースに関連付けられているプライマリ ストレージ アカウントのみを指定できます。 現時点では、カスタム ストレージ アカウントの選択はサポートされていません。

  • カスタム パーティション分割は Azure Cosmos DB の NoSQL 用 API にのみ使えます。 MongoDB、Gremlin、Cassandra 用の API は現時点でプレビュー段階です。

価格

カスタム パーティション分割を使うと、Azure Synapse Link の価格に加えて、次の料金が発生します。

  • 分析ストアでパーティション分割ジョブを実行するときに、Synapse Apache Spark プールの使用に対して課金されます。

  • パーティション分割されたデータは、Azure Synapse Analytics ワークスペースに関連付けられているプライマリ Azure Data Lake Storage Gen2 アカウントに格納されます。 ADLS Gen2 ストレージとトランザクションの使用に関連するコストが発生します。 これらのコストはそれぞれ、パーティション分割された分析データに必要なストレージと、Synapse の分析クエリに対して処理されるデータによって決まります。 価格の詳細については、「Azure Data Lake Storage の価格」ページを参照してください。

よく寄せられる質問

カスタム パーティション分割ジョブは、どのくらいの頻度で実行する必要がありますか。

カスタム パーティション分割ジョブを実行する頻度は、増分データの量、クエリ待機時間の要件など、いくつかの要因によって決まります。 1 日 1 回、または数時間ごとに 1 回実行することができます。 受信データ量が多く、予想されるクエリの待機時間が短い場合は、パーティション分割ジョブの頻度を増やしてスケジュール設定することをお勧めします。 また、パーティション排除を有効にするには、まず分析ストアに増分データを蓄積する必要があります。

パーティション分割ジョブの実行中、クエリ結果に最新のデータは含まれますか。

はい。カスタム パーティション分割では、完全なトランザクション保証が提供されます。 そのため、任意の時点のクエリ結果では、既存のパーティション分割されたデータと末尾のデータが結合され、最新の分析ストア データセットが返されます。

カスタム パーティション分割では、Azure Synapse Analytics でリンクされたサービスの認証を使用できますか。

はい。リンクされたサービスの認証は、分析ストアのパーティション分割に使用できます。

特定のコンテナーのパーティション キーを、後から変更することはできますか。

はい。特定のコンテナーのパーティション キーを変更できます。新しいパーティション キーを定義すると新しいパーティション分割ストアが作成されます。

Note

パーティション キーの定義は、パーティション分割されたストア パスに含まれます。

複数のパーティション キーで同じ BasePath を指定することはできますか。

はい、次のように、同じパーティション分割ストアに複数のパーティション キーを指定できます。

.option("spark.cosmos.asns.partition.keys", "ReadDate String, Location String") \
.option("spark.cosmos.asns.basePath", "/mnt/CosmosDBPartitionedStore/") \

次のステップ

詳しく学習するために、次のドキュメントを参照してください。