JSONシュレッダーCompatible with Milvus 2.6.2+

JSONシュレッディングは、従来の行ベースのストレージを最適化されたカラム型ストレージに変換することで、JSONクエリを高速化します。Milvusは、JSONのデータモデリングにおける柔軟性を維持しながら、舞台裏でカラム単位の最適化を行い、アクセスとクエリの効率を劇的に改善します。

JSONシュレッダーは、ほとんどのJSONクエリシナリオに有効です。パフォーマンスの利点は、以下の場合に顕著になります:

  • より大きく、より複雑な JSON ドキュメント- ドキュメントサイズが大きくなるほど、パフォーマンスが向上します。

  • 読み取り負荷の高いワークロード- JSONキーの頻繁なフィルタリング、ソート、検索

  • 混合クエリパターン- 異なるJSONキーにまたがるクエリは、ハイブリッドストレージアプローチの恩恵を受けます。

仕組み

JSONのシュレッダー処理は、3つのフェーズで行われ、データを最適化して高速な検索を実現します。

フェーズ1:取り込みとキーの分類

新しいJSONドキュメントが書き込まれると、Milvusは継続的にサンプリングと分析を行い、各JSONキーの統計情報を作成します。この分析には、キーの出現率と型の安定性(データ型が文書間で一貫しているかどうか)が含まれます。

これらの統計に基づき、JSONキーは最適な保存のために以下のように分類されます。

JSONキーの分類

キーの種類

説明

型付きキー

ほとんどのドキュメントに存在し、常に同じデータ型を持つキー(例:すべての整数またはすべての文字列)。

動的なキー

頻繁に出現するが、データ型がまちまちなキー(例えば、文字列のときもあれば整数のときもある)。

共有キー

設定可能な頻度のしきい値を下回る、出現頻度の低いキーやネストしたキー

分類の例

以下のJSONキーを含むサンプルJSONデータを考えてみましょう:

{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}  
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4}       // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"}  // e appears infrequently

このデータに基づいて、キーは以下のように分類される:

  • 型付きキー:af (常に整数)

  • 動的キー:b (文字列と整数の混合)

  • 共有キーe (出現頻度の低いキー)

フェーズ2:ストレージの最適化

フェーズ1の分類により、ストレージのレイアウトが決定される。milvusはクエリに最適化されたカラム形式を使用する。

Json Shredding Flow Jsonシュレッダーフロー

  • 細断されたカラム型付き キーと 動的 キーの場合、データは専用のカラムに書き込まれる。このカラム型ストレージにより、Milvusはドキュメント全体を処理することなく、指定されたキーに必要なデータのみを読み出すことができるため、クエリ時に高速でダイレクトなスキャンが可能となる。

  • 共有カラム:すべての共有キーは単一のコンパクトなバイナリJSONカラムにまとめて格納される。このカラムには共有キーの転置インデックスが構築される。このインデックスは、Milvusがデータを迅速に刈り込み、検索空間を指定されたキーを含む行のみに効果的に絞り込むことで、頻度の低いキーのクエリを高速化する上で極めて重要である。

フェーズ 3:クエリの実行

最終フェーズでは、最適化されたストレージレイアウトを活用し、各クエリ述語の最速パスをインテリジェントに選択します。

  • 高速パス:型付き/動的キー(例:json['a'] < 100 )に対するクエリは、専用カラムに直接アクセスします。

  • 最適化されたパス:共有キー(例:json['e'] = 'rare' )に対するクエリは、転置インデックスを使用して関連ドキュメントを迅速に検索する。

JSONシュレッダーを有効にする

この機能を有効にするには、milvus.yaml 設定ファイルでcommon.enabledJSONShreddingtrue に設定します。新しいデータは自動的にシュレッダー処理のトリガーとなります。

# milvus.yaml
...
common:
  enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...

この機能を有効にすると、MilvusはJSONデータの解析と再構築を開始します。

パラメータ調整

JSONシュレッダーを有効にすると、他のパラメータはデフォルト設定で十分です。しかし、milvus.yaml のこれらのパラメータを使用して、JSONシュレッダーの動作を微調整することができます。

パラメータ名

説明

デフォルト値

チューニング・アドバイス

common.enabledJSONShredding

JSON 破砕のビルドとロードのプロセスを有効にするかどうかを制御します。

false

機能を有効にするにはtrueに設定する必要があります。

common.usingjsonShreddingForQuery

Milvusが高速化のためにシュレッダーされたデータを使用するかどうかを制御します。

true

クエリが失敗した場合、元のクエリパスに戻すリカバリ手段としてfalseに設定します。

queryNode.mmap.jsonShredding

Milvusが細断データをロードする際にmmapを使用するかどうかを決定します。

詳細については、mmapを使用するを参照してください。

この設定は一般的にパフォーマンスに最適化されています。特定のメモリ管理が必要であったり、システムに制約がある場合にのみ調整してください。

dataCoord.jsonShreddingMaxColumns

細断カラムに格納されるJSONキーの最大数。

頻繁に出現するキーの数がこの上限を超えた場合、Milvusは最も頻繁に出現するキーを優先的にシュレッダーにかけ、残りのキーは共有カラムに保存されます。

1024

ほとんどのシナリオではこれで十分です。数千のキーが頻繁に出現するJSONの場合、これを増やす必要があるかもしれませんが、ストレージの使用状況を監視してください。

dataCoord.jsonShreddingRatioThreshold

JSONキーが細断カラムへの細断を考慮されるために必要な最小出現率。

キーは、その比率がこのしきい値を超えている場合、頻繁に出現するとみなされる。

0.3

細断基準を満たすキーの数がdataCoord.jsonShreddingMaxColumns の制限を超えた場合に増加させる(例えば0.5に)。これにより、閾値が厳しくなり、シュレッダーの対象となる鍵の数が減る。

デフォルトのしきい値30%より出現頻度の低い鍵をより多く細断する場合は、 0.1に減らす

性能ベンチマーク

私たちのテストでは、さまざまな JSON キーのタイプとクエリのパターンで、パフォーマンスが大幅に向上していることが実証されています。

テスト環境と方法

  • ハードウェア: 1コア/8GBクラスタ

  • データセット JSONBenchからの100万ドキュメント

  • 平均ドキュメントサイズ:478.89バイト

  • テスト時間100秒間でQPSとレイテンシーを測定

結果: タイプされたキー

このテストでは、ほとんどのドキュメントに存在するキーをクエリしたときのパフォーマンスを測定しました。

クエリー表現

キーの値の種類

QPS(シュレッダーなし)

QPS(シュレッダーあり)

パフォーマンス・ブースト

json['time_us'] > 0

整数

8.69

287.50

33x

json['kind'] == 'commit'

文字列

8.42

126.1

14.9x

結果:共有キー

このテストでは、"共有 "カテゴリーに分類される、疎なネストされたキーのクエリに焦点を当てた。

クエリ式

キー値のタイプ

QPS(シュレッダーなし)

QPS(シュレッダーあり)

パフォーマンス向上

json['identity']['seq'] > 0

入れ子の整数

4.33

385

88.9x

json['identity']['did'] == 'xxxxx'

入れ子文字列

7.6

352

46.3x

キーインサイト

  • 共有キークエリが最も劇的な改善を示す(最大89倍高速化)

  • 型付きキークエリは一貫して15~30倍のパフォーマンス向上を実現

  • すべてのクエリタイプがJSON Shreddingの恩恵を受け、パフォーマンスの低下は見られない。

よくある質問

  • JSONシュレッダーが正しく機能するかどうかを確認するにはどうすればよいですか?

    1. まず、Birdwatcherツールのshow segment --format table コマンドを使用して、データが構築されているかどうかを確認します。成功すれば、Json Key Statsフィールドの下にshredding_data/shared_key_index/ が出力されます。

      Birdwatcher Output Birdwatcherの出力

    2. 次に、クエリーノードでshow loaded-json-stats を実行して、データがロードされたことを確認します。出力には、各クエリーノードについてロードされた細断データの詳細が表示されます。

  • エラーが発生したら?

    ビルドまたはロード・プロセスが失敗した場合、common.enabledJSONShredding=false を設定することで、この機能をすぐに無効にすることができます。残っているタスクを消去するには、Birdwatcherの remove stats-task <task_id> コマンドを使用します。クエリが失敗した場合、common.usingjsonShreddingForQuery=false を設定すると、シュレッダーされたデータをバイパスして、元のクエリパスに戻ります。

  • JSONシュレッダーとJSONインデックスの選択方法は?

    • JSONシュレッダーは、ドキュメントに頻繁に現れるキー、特に複雑なJSON構造に最適です。JSONシュレッダーは、カラム型ストレージと転置インデックスの利点を兼ね備えているため、多くの異なるキーをクエリするような、読み取り負荷の高いシナリオに適しています。しかし、非常に小さなJSONドキュメントに対しては、パフォーマンス向上がわずかであるため、推奨されない。JSONドキュメントの総サイズに占めるキーの値の割合が小さいほど、シュレッダーによるパフォーマンスの最適化は向上する。

    • JSONインデクシングは、特定のキーベースのクエリの最適化に適しており、ストレージのオーバーヘッドも低くなります。より単純なJSON構造に適しています。JSONシュレッダーは、配列内のキーに対するクエリには対応していないため、これらのクエリを高速化するにはJSONインデックスが必要であることに注意してください。

    詳細については、「JSONフィールドの概要」を参照してください。