メインコンテンツまでスキップ

外部コレクションの作成

外部コレクションは、Zilliz Cloud におけるデータコレクションの一種であり、AWS S3 や Iceberg などの外部ストレージシステムやデータベーステーブルのデータを、Zilliz Cloud にコピーすることなく参照できます。データレイクに対するクエリレイヤーとして機能し、Zilliz Cloud のクエリインターフェイスとの互換性を維持します。

📘Notes

外部コレクションを作成できるのは、オンデマンドコンピューティング用データベースに限られます。サービング Dedicated クラスターでの外部コレクション作成サポートは、近日公開予定です。

概要

一般的な AI データパイプラインでは、AWS S3 などのストレージシステムに Parquet 形式などでデータがすでに保存されているケースが多く見られます。Zilliz Cloud でこれらの外部データを利用するには、通常、Extract-Transform-Load(ETL)パイプラインを用いて Zilliz Cloud 独自のストレージにデータをインポートする必要があります。

このようにデータを Zilliz Cloud に取り込むワークフローでは、同期が困難な冗長なデータが生じ、データの一貫性を保つためのエンジニアリング上の保守負担も増大します。

YQXWwPQ3vheYa4b8398cWoPNnyN

こうした課題を解決するため、Zilliz Cloud は外部コレクションを提供しています。これにより、データの同期や ETL パイプラインを意識することなく、Zilliz Cloud から外部ストレージ上のデータにアクセスできます。

Q6F4wtcd2h3PnKbnMxncw3urn3f

外部コレクションを作成すると、データは元の保存場所に保持されたまま直接アクセスできるようになります。バックグラウンドでは、Zilliz Cloud がマニフェストファイルを作成し、Zilliz Cloud のメタデータと外部データファイル内の行の対応関係を記録します。マニフェストファイルの準備が整えば、通常のマネージドコレクションと同様に、外部コレクションにもインデックスを作成できます。

データに変更があった場合は、手動でサブ秒級のリフレッシュを実行することでメタデータが更新され、Zilliz Cloud を常に最新の状態に保てます。

外部コレクションは、オンデマンドコンピューティング用データベースで利用可能です。

ステップ 1: スキーマの作成

マネージドコレクションの場合と同様に、外部コレクションの作成前にもスキーマを定義する必要があります。ただし、その内容はマネージドコレクションのスキーマとは一部異なります。

事前準備

  • オンデマンドコンピューティング用データベースに外部コレクションを作成できる十分な権限を持つ API キーを取得していること。

    詳細については、API キー を参照してください。

  • オブジェクトストレージバケットが Zilliz Cloud と連携済みであること。

    詳細については、AWSGCP、および Azure のドキュメントを参照してください。

  • バケット連携に基づき外部ボリュームを作成済みであること。また、当該ボリュームに対象のデータファイルが含まれていることを確認してください。

    詳細については、外部ボリューム を参照してください。

サポートされるデータソース

Zilliz Cloud は以下のデータソースに対応しています。選択した形式に応じて、対応する外部ソースを指定してください。

  • parquet

    external_source には、対象の Parquet ファイルが格納されたフォルダーを指定します。

  • vortex,

    external_source には、バージョン 0.56 の Vortex カラムナーファイルが格納されたフォルダーを指定します。

  • lance-table

    external_source には、_transactions_versionsdata といったサブフォルダーを含むフォルダーパスを指定します。

  • iceberg-table

    external_source には Iceberg テーブルの metadata.json ファイルを指定し、以下のようにスナップショット ID を渡します。

    python
    external_spec={
    "format": "iceberg-table",
    "snapshot_id": "473984310232959286"
    }
  • milvus-table

    external_source には、具体的な Milvus スナップショットメタデータ JSON ファイルを指定します。詳細については、スナップショットをデータソースとして使用する を参照してください。

スキーマの設定

対象データファイルを含む外部ボリュームを用意したら、コレクションのカラムを Parquet ファイル(parquet)、Lance テーブル(lance-table)、Iceberg テーブル(iceberg-table)、または 0.56.0 形式の Vortex ファイル(vortex)にマッピングするためのスキーマを作成します。

📘Notes

外部ソースの末尾には、フォルダーであることを示すスラッシュ(/))を付ける必要があります。

python
from pymilvus import MilvusClient, DataType

schema = MilvusClient.create_schema(
external_source='volume://my_volume/path/to/a/folder/',
external_spec='{"format": "parquet"}'
)

ステップ 2: フィールドの追加

スキーマの準備ができたら、以下のようにフィールドを追加できます。

python
schema.add_field(
field_name="product_id",
datatype=DataType.INT64,
# highlight-next
external_field="id" # field name in the external data file
)
schema.add_field(
field_name="product_name",
datatype=DataType.VARCHAR,
max_length=512,
# highlight-next
external_field="name"
)
schema.add_field(
field_name="embedding",
datatype=DataType.FLOAT_VECTOR,
dim=768,
# highlight-next
external_field="vector"
)

ステップ3: コレクションの作成

スキーマにすべてのフィールドを追加したら、外部コレクションを作成できます。

📘Notes

外部コレクションは、通常オンデマンドクラスターに関連付けられているプロジェクトレベルのデータベースに作成できます。

python
# connect the database
client = MilvusClient(
uri="https://{project-id}.{region}.vectordb.zillizcloud.com",
token="YOUR_API_KEY"
)

client.use_database(
db_name="my_database"
)
# create the collection
client.create_collection(
collection_name="test_collection",
schema=schema
)

ステップ4: インデックスの作成

マネージドコレクションと同様に、外部コレクションのカラムに対してもインデックスを作成できます。

python
index_params = client.prepare_index_params()
# Add indexes
index_params.add_index(
field_name="embedding",
index_type="AUTOINDEX",
metric_type="COSINE"
)
index_params.add_index(
field_name="product_name",
index_type="AUTOINDEX"
)
client.create_index(
db_name="my_database",
collection_name="test_collection",
index_params=index_params
)

ステップ5: データのリフレッシュ

コレクションの準備ができたら、データのメタデータとインデックスを作成するためにリフレッシュを実行します。

python
job_id = client.refresh_external_collection(
db_name="my_database",
collection_name="test_collection"
)
while True:
progress = client.get_refresh_external_collection_progress(job_id=job_id)
print(f" {progress.state}: {progress.progress}%")
if progress.state == "RefreshCompleted":
elapsed = progress.end_time - progress.start_time
print(f" Completed in {elapsed}ms")
break
elif progress.state == "RefreshFailed":
print(f" Failed: {progress.reason}")
break
time.sleep(2)

リフレッシュ操作は非同期で実行されるため、進行状況を監視する反復処理を設定する必要があります。

📘Notes
  • リフレッシュ操作ではデータファイルのメタデータをスキャンし、それに基づいてマニフェストファイルを生成します。通常、150〜250 ms かかります。

  • マニフェストファイルには、Milvus 内のメタデータと外部ファイル内の行とのマッピングが記録されます。

  • ソースデータが更新された場合は、手動でリフレッシュを再実行して Zilliz Cloud を最新の状態に保つ必要があります。

  • 挿入を伴わずにすべてのアクティブなメタデータを削除するリフレッシュは拒否されます。

  • オンデマンドコンピューティング用データベース内の外部コレクションは、手動でロードおよびリリースする必要はありません。

次のステップ

外部コレクションをリフレッシュすると、オンデマンドコンピューティング用のデータベース内のコレクションは、検索とクエリのためにオンデマンドクラスターにアタッチする必要がある点を除き、任意のマネージドコレクションと同様に、外部コレクションで類似検索とクエリを実行できます。詳細については、オンデマンドクラスターの作成とその関連ページを参照してください。

search、query、get、ハイブリッド検索などの DQL 操作を実行する前に、オンデマンドクラスターのコンピューティングリソースをアタッチするためのセッションを作成する必要があります。詳細については、オンデマンド DQL 操作を参照してください。

Snapshot as Source

スナップショットのメタデータ JSON パスを `externalsource` として使用し、`externalspec.format` を `"milvus-table"` に設定することで、Milvus スナップショットから外部コレクションを作成できます。 | BYOC

Ctrl I