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
このデータに基づいて、キーは以下のように分類される:
型付きキー:
aとf(常に整数)動的キー:
b(文字列と整数の混合)共有キー:
e(出現頻度の低いキー)
フェーズ2:ストレージの最適化
フェーズ1の分類により、ストレージのレイアウトが決定される。milvusはクエリに最適化されたカラム形式を使用する。
Jsonシュレッダーフロー
細断されたカラム:型付き キーと 動的 キーの場合、データは専用のカラムに書き込まれる。このカラム型ストレージにより、Milvusはドキュメント全体を処理することなく、指定されたキーに必要なデータのみを読み出すことができるため、クエリ時に高速でダイレクトなスキャンが可能となる。
共有カラム:すべての共有キーは単一のコンパクトなバイナリJSONカラムにまとめて格納される。このカラムには共有キーの転置インデックスが構築される。このインデックスは、Milvusがデータを迅速に刈り込み、検索空間を指定されたキーを含む行のみに効果的に絞り込むことで、頻度の低いキーのクエリを高速化する上で極めて重要である。
フェーズ 3:クエリの実行
最終フェーズでは、最適化されたストレージレイアウトを活用し、各クエリ述語の最速パスをインテリジェントに選択します。
高速パス:型付き/動的キー(例:
json['a'] < 100)に対するクエリは、専用カラムに直接アクセスします。最適化されたパス:共有キー(例:
json['e'] = 'rare')に対するクエリは、転置インデックスを使用して関連ドキュメントを迅速に検索する。
JSONシュレッダーを有効にする
この機能を有効にするには、milvus.yaml 設定ファイルでcommon.enabledJSONShredding をtrue に設定します。新しいデータは自動的にシュレッダー処理のトリガーとなります。
# milvus.yaml
...
common:
enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...
この機能を有効にすると、MilvusはJSONデータの解析と再構築を開始します。
パラメータ調整
JSONシュレッダーを有効にすると、他のパラメータはデフォルト設定で十分です。しかし、milvus.yaml のこれらのパラメータを使用して、JSONシュレッダーの動作を微調整することができます。
パラメータ名 |
説明 |
デフォルト値 |
チューニング・アドバイス |
|---|---|---|---|
|
JSON 破砕のビルドとロードのプロセスを有効にするかどうかを制御します。 |
false |
機能を有効にするにはtrueに設定する必要があります。 |
|
Milvusが高速化のためにシュレッダーされたデータを使用するかどうかを制御します。 |
true |
クエリが失敗した場合、元のクエリパスに戻すリカバリ手段としてfalseに設定します。 |
|
Milvusが細断データをロードする際にmmapを使用するかどうかを決定します。 詳細については、mmapを使用するを参照してください。 |
真 |
この設定は一般的にパフォーマンスに最適化されています。特定のメモリ管理が必要であったり、システムに制約がある場合にのみ調整してください。 |
|
細断カラムに格納されるJSONキーの最大数。 頻繁に出現するキーの数がこの上限を超えた場合、Milvusは最も頻繁に出現するキーを優先的にシュレッダーにかけ、残りのキーは共有カラムに保存されます。 |
1024 |
ほとんどのシナリオではこれで十分です。数千のキーが頻繁に出現するJSONの場合、これを増やす必要があるかもしれませんが、ストレージの使用状況を監視してください。 |
|
JSONキーが細断カラムへの細断を考慮されるために必要な最小出現率。 キーは、その比率がこのしきい値を超えている場合、頻繁に出現するとみなされる。 |
0.3 |
細断基準を満たすキーの数が デフォルトのしきい値30%より出現頻度の低い鍵をより多く細断する場合は、 0.1に減らす。 |
性能ベンチマーク
私たちのテストでは、さまざまな JSON キーのタイプとクエリのパターンで、パフォーマンスが大幅に向上していることが実証されています。
テスト環境と方法
ハードウェア: 1コア/8GBクラスタ
データセット JSONBenchからの100万ドキュメント
平均ドキュメントサイズ:478.89バイト
テスト時間100秒間でQPSとレイテンシーを測定
結果: タイプされたキー
このテストでは、ほとんどのドキュメントに存在するキーをクエリしたときのパフォーマンスを測定しました。
クエリー表現 |
キーの値の種類 |
QPS(シュレッダーなし) |
QPS(シュレッダーあり) |
パフォーマンス・ブースト |
|---|---|---|---|---|
|
整数 |
8.69 |
287.50 |
33x |
|
文字列 |
8.42 |
126.1 |
14.9x |
結果:共有キー
このテストでは、"共有 "カテゴリーに分類される、疎なネストされたキーのクエリに焦点を当てた。
クエリ式 |
キー値のタイプ |
QPS(シュレッダーなし) |
QPS(シュレッダーあり) |
パフォーマンス向上 |
|---|---|---|---|---|
|
入れ子の整数 |
4.33 |
385 |
88.9x |
|
入れ子文字列 |
7.6 |
352 |
46.3x |
キーインサイト
共有キークエリが最も劇的な改善を示す(最大89倍高速化)
型付きキークエリは一貫して15~30倍のパフォーマンス向上を実現
すべてのクエリタイプがJSON Shreddingの恩恵を受け、パフォーマンスの低下は見られない。
よくある質問
JSONシュレッダーが正しく機能するかどうかを確認するにはどうすればよいですか?
まず、Birdwatcherツールの
show segment --format tableコマンドを使用して、データが構築されているかどうかを確認します。成功すれば、Json Key Statsフィールドの下にshredding_data/とshared_key_index/が出力されます。
Birdwatcherの出力 次に、クエリーノードで
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フィールドの概要」を参照してください。