JSON-ZerkleinerungCompatible with Milvus 2.6.2+

JSON Shredding beschleunigt JSON-Abfragen durch die Umwandlung traditioneller zeilenbasierter Speicherung in optimierte spaltenbasierte Speicherung. Während die Flexibilität von JSON für die Datenmodellierung beibehalten wird, führt Milvus hinter den Kulissen eine spaltenbasierte Optimierung durch, die den Zugriff und die Abfrageeffizienz erheblich verbessert.

JSON Shredding ist für die meisten JSON-Abfrageszenarien effektiv. Die Leistungsvorteile werden deutlicher bei:

  • Größere, komplexere JSON-Dokumente - Größere Leistungsgewinne mit zunehmender Dokumentgröße

  • Leselastige Arbeitslasten - Häufiges Filtern, Sortieren oder Suchen nach JSON-Schlüsseln

  • Gemischte Abfragemuster - Abfragen über verschiedene JSON-Schlüssel profitieren vom hybriden Speicheransatz

Wie das funktioniert

Der JSON-Shredding-Prozess erfolgt in drei verschiedenen Phasen, um die Daten für einen schnellen Abruf zu optimieren.

Phase 1: Ingestion & Schlüsselklassifizierung

Wenn neue JSON-Dokumente geschrieben werden, nimmt Milvus kontinuierlich Proben und analysiert sie, um Statistiken für jeden JSON-Schlüssel zu erstellen. Diese Analyse umfasst die Häufigkeit des Auftretens des Schlüssels und die Stabilität des Typs (ob der Datentyp in allen Dokumenten gleich ist).

Auf der Grundlage dieser Statistiken werden die JSON-Schlüssel für eine optimale Speicherung in die folgenden Kategorien eingeteilt.

Kategorien von JSON-Schlüsseln

Schlüssel Typ

Beschreibung

Typisierte Schlüssel

Schlüssel, die in den meisten Dokumenten vorkommen und immer denselben Datentyp haben (z. B. alle Ganzzahlen oder alle Zeichenketten).

Dynamische Schlüssel

Schlüssel, die häufig vorkommen, aber einen gemischten Datentyp haben (z. B. manchmal eine Zeichenkette, manchmal eine ganze Zahl).

Gemeinsame Schlüssel

Selten vorkommende oder verschachtelte Schlüssel, die unter einer konfigurierbaren Häufigkeitsschwelle liegen.

Beispiel einer Klassifizierung

Betrachten Sie die JSON-Beispieldaten, die die folgenden JSON-Schlüssel enthalten:

{"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

Basierend auf diesen Daten würden die Schlüssel wie folgt klassifiziert werden:

  • Getippte Schlüssel: a und f (immer eine ganze Zahl)

  • Dynamische Schlüssel: b (gemischte Zeichenkette/Ganzzahl)

  • Gemeinsame Schlüssel: e (selten vorkommender Schlüssel)

Phase 2: Speicheroptimierung

Die Klassifizierung aus Phase 1 gibt das Speicherlayout vor. Milvus verwendet ein spaltenförmiges Format, das für Abfragen optimiert ist.

Json Shredding Flow Json Shredding Fluss

  • Geschredderte Spalten: Für typisierte und dynamische Schlüssel werden die Daten in dedizierte Spalten geschrieben. Diese spaltenförmige Speicherung ermöglicht schnelle, direkte Scans bei Abfragen, da Milvus nur die benötigten Daten für einen bestimmten Schlüssel lesen kann, ohne das gesamte Dokument zu verarbeiten.

  • Gemeinsame Spalte: Alle gemeinsam genutzten Schlüssel werden zusammen in einer einzigen, kompakten binären JSON-Spalte gespeichert. Auf dieser Spalte wird ein invertierter Index für gemeinsame Schlüssel erstellt. Dieser Index ist entscheidend für die Beschleunigung von Abfragen nach Schlüsseln mit geringer Häufigkeit, da er Milvus ermöglicht, die Daten schnell zu beschneiden und so den Suchraum auf die Zeilen zu beschränken, die den angegebenen Schlüssel enthalten.

Phase 3: Ausführung der Abfrage

In der letzten Phase wird das optimierte Speicherlayout genutzt, um auf intelligente Weise den schnellsten Pfad für jedes Abfrageprädikat auszuwählen.

  • Schneller Pfad: Abfragen auf typisierte/dynamische Schlüssel (z. B. json['a'] < 100) greifen direkt auf dedizierte Spalten zu.

  • Optimierter Pfad: Abfragen auf gemeinsam genutzte Schlüssel (z. B. json['e'] = 'rare') verwenden einen invertierten Index, um relevante Dokumente schnell zu finden

JSON-Shredding aktivieren

Um die Funktion zu aktivieren, setzen Sie common.enabledJSONShredding in Ihrer Konfigurationsdatei milvus.yaml auf true. Neue Daten lösen automatisch den Schredderprozess aus.

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

Sobald die Funktion aktiviert ist, beginnt Milvus mit der Analyse und Umstrukturierung Ihrer JSON-Daten bei der Aufnahme, ohne dass ein weiterer manueller Eingriff erforderlich ist.

Einstellung der Parameter

Für die meisten Benutzer sind die Standardeinstellungen für andere Parameter ausreichend, sobald JSON Shredding aktiviert ist. Sie können jedoch das Verhalten des JSON-Shredding mit diesen Parametern unter milvus.yaml feineinstellen.

Parameter Name

Beschreibung

Standardwert

Tuning-Hinweis

common.enabledJSONShredding

Steuert, ob die JSON-Shredding-Prozesse zum Erstellen und Laden aktiviert sind.

false

Muss auf true gesetzt werden, um die Funktion zu aktivieren.

common.usingjsonShreddingForQuery

Legt fest, ob Milvus geschredderte Daten zur Beschleunigung verwendet.

true

Wird als Wiederherstellungsmaßnahme bei fehlgeschlagenen Abfragen auf false gesetzt, wobei der ursprüngliche Abfragepfad wiederhergestellt wird.

queryNode.mmap.jsonShredding

Legt fest, ob Milvus mmap beim Laden von Shredding-Daten verwendet.

Einzelheiten finden Sie unter mmap verwenden.

true

Diese Einstellung ist im Allgemeinen für die Leistung optimiert. Passen Sie sie nur an, wenn Sie spezielle Anforderungen an die Speicherverwaltung oder Einschränkungen auf Ihrem System haben.

dataCoord.jsonShreddingMaxColumns

Die maximale Anzahl von JSON-Schlüsseln, die in geshredderten Spalten gespeichert werden.

Wenn die Anzahl der häufig vorkommenden Schlüssel diese Grenze überschreitet, priorisiert Milvus die häufigsten Schlüssel für das Shredding, und die restlichen Schlüssel werden in der gemeinsamen Spalte gespeichert.

1024

Dies ist für die meisten Szenarien ausreichend. Für JSON mit Tausenden von häufig vorkommenden Schlüsseln müssen Sie diesen Wert möglicherweise erhöhen, aber überwachen Sie die Speichernutzung.

dataCoord.jsonShreddingRatioThreshold

Die minimale Häufigkeit, mit der ein JSON-Schlüssel vorkommen muss, damit er in einer Shredder-Spalte gespeichert werden kann.

Ein Schlüssel gilt als häufig vorkommend, wenn sein Verhältnis über diesem Schwellenwert liegt.

0.3

Erhöhen (z. B. auf 0,5), wenn die Anzahl der Schlüssel, die die Schredderkriterien erfüllen, den Grenzwert dataCoord.jsonShreddingMaxColumns überschreitet. Dadurch wird der Schwellenwert strenger und die Anzahl der Schlüssel, die für das Schreddern in Frage kommen, wird verringert.

Verringern Sie den Wert (z. B. auf 0,1), wenn Sie mehr Schlüssel schreddern möchten, die seltener als der Standardgrenzwert von 30 % auftreten.

Leistungs-Benchmarks

Unsere Tests zeigen deutliche Leistungsverbesserungen bei verschiedenen JSON-Schlüsseltypen und Abfragemustern.

Testumgebung und Methodik

  • Hardware: 1-Kern/8-GB-Cluster

  • Datensatz: 1 Million Dokumente von JSONBench

  • Durchschnittliche Dokumentgröße: 478,89 Bytes

  • Testdauer: 100 Sekunden, Messung von QPS und Latenz

Ergebnisse: getippte Schlüssel

Bei diesem Test wurde die Leistung bei der Abfrage eines in den meisten Dokumenten vorhandenen Schlüssels gemessen.

Abfrageausdruck

Schlüssel Wert Typ

QPS (ohne Schreddern)

QPS (mit Zerkleinerung)

Leistungssteigerung

json['time_us'] > 0

Ganzzahl

8.69

287.50

33x

json['kind'] == 'commit'

Zeichenkette

8.42

126.1

14.9x

Ergebnisse: Gemeinsame Schlüssel

Dieser Test konzentrierte sich auf die Abfrage von spärlichen, verschachtelten Schlüsseln, die in die Kategorie "gemeinsam genutzt" fallen.

Abfrageausdruck

Schlüssel Wert Typ

QPS (ohne Schreddern)

QPS (mit Zerkleinerung)

Leistungssteigerung

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

Verschachtelte Ganzzahl

4.33

385

88.9x

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

Verschachtelte Zeichenkette

7.6

352

46.3x

Einblicke in die Schlüssel

  • Gemeinsame Schlüsselabfragen zeigen die größten Verbesserungen (bis zu 89x schneller)

  • Typisierte Schlüsselabfragen bieten konsistente 15-30-fache Leistungssteigerungen

  • Alle Abfragetypen profitieren vom JSON Shredding ohne Leistungseinbußen.

FAQ

  • Wie kann ich überprüfen, ob JSON Shredding richtig funktioniert?

    1. Überprüfen Sie zunächst, ob die Daten mit dem Befehl show segment --format table im Birdwatcher-Tool erstellt wurden. Wenn dies erfolgreich war, enthält die Ausgabe shredding_data/ und shared_key_index/ unter dem Feld Json Key Stats.

      Birdwatcher Output Birdwatcher-Ausgabe

    2. Als nächstes überprüfen Sie, ob die Daten geladen wurden, indem Sie show loaded-json-stats auf dem Abfrageknoten ausführen. Die Ausgabe zeigt Details über die geladenen Daten für jeden Abfrageknoten an.

  • Was mache ich, wenn ein Fehler auftritt?

    Wenn der Erstellungs- oder Ladevorgang fehlschlägt, können Sie die Funktion schnell deaktivieren, indem Sie common.enabledJSONShredding=false einstellen. Um alle verbleibenden Aufgaben zu löschen, verwenden Sie den Befehl remove stats-task <task_id> in Birdwatcher. Wenn eine Abfrage fehlschlägt, setzen Sie common.usingjsonShreddingForQuery=false, um zum ursprünglichen Abfragepfad zurückzukehren und die geshredderten Daten zu umgehen.

  • Wie wähle ich zwischen JSON-Shredding und JSON-Indizierung?

    • JSON Shredding ist ideal für Schlüssel, die häufig in Ihren Dokumenten vorkommen, insbesondere für komplexe JSON-Strukturen. Es kombiniert die Vorteile der spaltenweisen Speicherung und der invertierten Indizierung und eignet sich daher gut für leselastige Szenarien, in denen Sie viele verschiedene Schlüssel abfragen. Es wird jedoch nicht für sehr kleine JSON-Dokumente empfohlen, da der Leistungsgewinn minimal ist. Je kleiner der Anteil des Schlüsselwerts an der Gesamtgröße des JSON-Dokuments ist, desto besser ist die Leistungsoptimierung durch Shredding.

    • DieJSON-Indizierung eignet sich besser für die gezielte Optimierung spezifischer schlüsselbasierter Abfragen und hat einen geringeren Speicher-Overhead. Sie ist für einfachere JSON-Strukturen geeignet. Beachten Sie, dass JSON Shredding keine Abfragen auf Schlüssel innerhalb von Arrays abdeckt, so dass Sie einen JSON-Index benötigen, um diese zu beschleunigen.

    Einzelheiten finden Sie in der JSON-Feldübersicht.