Triturazione JSONCompatible with Milvus 2.6.2+

La triturazione JSON accelera le query JSON convertendo l'archiviazione tradizionale basata sulle righe in archiviazione colonnare ottimizzata. Pur mantenendo la flessibilità di JSON per la modellazione dei dati, Milvus esegue un'ottimizzazione colonnare dietro le quinte che migliora notevolmente l'accesso e l'efficienza delle query.

La triturazione di JSON è efficace per la maggior parte degli scenari di query JSON. I vantaggi in termini di prestazioni diventano più evidenti con:

  • Documenti JSON più grandi e complessi - Maggiori guadagni di prestazioni con l'aumentare delle dimensioni del documento

  • Carichi di lavoro pesanti in lettura - Filtri, ordinamenti o ricerche frequenti su chiavi JSON

  • Modelli di query misti - Le query su diverse chiavi JSON traggono vantaggio dall'approccio di archiviazione ibrida.

Come funziona

Il processo di triturazione JSON avviene in tre fasi distinte per ottimizzare i dati per un rapido recupero.

Fase 1: Ingestione e classificazione delle chiavi

Quando vengono scritti nuovi documenti JSON, Milvus li campiona e li analizza continuamente per costruire statistiche per ogni chiave JSON. Questa analisi include il rapporto di occorrenza della chiave e la stabilità del tipo (se il suo tipo di dati è coerente tra i documenti).

Sulla base di queste statistiche, le chiavi JSON vengono classificate nelle seguenti categorie per una conservazione ottimale.

Categorie di chiavi JSON

Tipo di chiave

Descrizione

Chiavi digitate

Chiavi che esistono nella maggior parte dei documenti e che hanno sempre lo stesso tipo di dati (ad esempio, tutti i numeri interi o tutte le stringhe).

Chiavi dinamiche

Chiavi che compaiono frequentemente ma che hanno un tipo di dati misto (ad esempio, a volte una stringa, a volte un intero).

Chiavi condivise

Chiavi che compaiono di rado o che si annidano al di sotto di una soglia di frequenza configurabile.

Esempio di classificazione

Consideriamo i dati JSON di esempio contenenti le seguenti chiavi 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

In base a questi dati, le chiavi verrebbero classificate come segue:

  • Chiavi digitate: a e f (sempre un intero)

  • Chiavi dinamiche: b (misto stringa/integro)

  • Chiavi condivise: e (chiave che appare raramente).

Fase 2: ottimizzazione dello storage

La classificazione della fase 1 determina il layout di memorizzazione. Milvus utilizza un formato colonnare ottimizzato per le query.

Json Shredding Flow Flusso di triturazione Json

  • Colonne triturate: Per le chiavi digitate e dinamiche, i dati vengono scritti in colonne dedicate. Questa archiviazione a colonne consente scansioni rapide e dirette durante le interrogazioni, poiché Milvus può leggere solo i dati necessari per una determinata chiave senza elaborare l'intero documento.

  • Colonna condivisa: Tutte le chiavi condivise sono memorizzate insieme in un'unica colonna JSON binaria e compatta. Su questa colonna viene costruito un indice inverso a chiave condivisa. Questo indice è fondamentale per accelerare le query sulle chiavi a bassa frequenza, consentendo a Milvus di sfrondare rapidamente i dati, restringendo di fatto lo spazio di ricerca alle sole righe che contengono la chiave specificata.

Fase 3: Esecuzione delle query

La fase finale sfrutta il layout di archiviazione ottimizzato per selezionare in modo intelligente il percorso più veloce per ogni predicato della query.

  • Percorso veloce: Le query su chiavi digitate/dinamiche (ad esempio, json['a'] < 100) accedono direttamente alle colonne dedicate.

  • Percorso ottimizzato: Le query su chiavi condivise (ad esempio, json['e'] = 'rare') utilizzano l'indice invertito per individuare rapidamente i documenti pertinenti.

Abilitazione della triturazione JSON

Per attivare la funzione, impostare common.enabledJSONShredding su true nel file di configurazione milvus.yaml. I nuovi dati attivano automaticamente il processo di distruzione.

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

Una volta abilitato, Milvus inizierà ad analizzare e ristrutturare i dati JSON al momento dell'ingestione senza ulteriori interventi manuali.

Regolazione dei parametri

Per la maggior parte degli utenti, una volta abilitata la triturazione JSON, le impostazioni predefinite per gli altri parametri sono sufficienti. Tuttavia, è possibile regolare con precisione il comportamento della triturazione JSON utilizzando questi parametri in milvus.yaml.

Parametro Nome

Descrizione

Valore predefinito

Consigli per la messa a punto

common.enabledJSONShredding

Controlla se i processi di creazione e caricamento di JSON shredding sono abilitati.

Falso

Deve essere impostato su true per attivare la funzione.

common.usingjsonShreddingForQuery

Controlla se Milvus utilizza i dati triturati per l'accelerazione.

vero

Impostato su false come misura di recupero in caso di errore delle query, per tornare al percorso originale della query.

queryNode.mmap.jsonShredding

Determina se Milvus usa mmap quando carica i dati triturati.

Per i dettagli, consultare Usa mmap.

vero

Questa impostazione è generalmente ottimizzata per le prestazioni. Regolatela solo se avete esigenze o vincoli specifici di gestione della memoria sul vostro sistema.

dataCoord.jsonShreddingMaxColumns

Il numero massimo di chiavi JSON da memorizzare nelle colonne triturate.

Se il numero di chiavi che compaiono frequentemente supera questo limite, Milvus darà priorità a quelle più frequenti per la triturazione e le chiavi rimanenti saranno memorizzate nella colonna condivisa.

1024

Questo limite è sufficiente per la maggior parte degli scenari. Per JSON con migliaia di chiavi frequenti, potrebbe essere necessario aumentare questo limite, ma è necessario monitorare l'utilizzo della memoria.

dataCoord.jsonShreddingRatioThreshold

Il rapporto minimo di ricorrenze che una chiave JSON deve avere per essere considerata per la triturazione in una colonna tritata.

Una chiave è considerata frequente se il suo rapporto è superiore a questa soglia.

0.3

Aumenta (ad esempio, a 0,5) se il numero di chiavi che soddisfano i criteri di triturazione supera il limite di dataCoord.jsonShreddingMaxColumns. In questo modo si rende più severa la soglia, riducendo il numero di chiavi che si qualificano per la triturazione.

Diminuire (ad esempio, a 0,1) se si desidera distruggere un numero maggiore di chiavi che appaiono meno frequentemente della soglia predefinita del 30%.

Parametri di riferimento delle prestazioni

I nostri test dimostrano miglioramenti significativi delle prestazioni su diversi tipi di chiavi JSON e modelli di query.

Ambiente e metodologia di test

  • Hardware: cluster da 1 core/8GB

  • Set di dati: 1 milione di documenti da JSONBench

  • Dimensione media del documento: 478,89 byte

  • Durata del test: 100 secondi per misurare QPS e latenza

Risultati: chiavi digitate

Questo test ha misurato le prestazioni quando si interroga una chiave presente nella maggior parte dei documenti.

Espressione della query

Tipo di valore della chiave

QPS (senza triturazione)

QPS (con triturazione)

Incremento delle prestazioni

json['time_us'] > 0

Intero

8.69

287.50

33x

json['kind'] == 'commit'

Stringa

8.42

126.1

14.9x

Risultati: chiavi condivise

Questo test si è concentrato sull'interrogazione di chiavi rade e annidate che rientrano nella categoria "condivise".

Espressione della query

Tipo di valore della chiave

QPS (senza triturazione)

QPS (con triturazione)

Incremento delle prestazioni

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

Intero annidato

4.33

385

88.9x

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

Stringa annidata

7.6

352

46.3x

Approfondimenti sulle chiavi

  • Lequery a chiave condivisa mostrano i miglioramenti più evidenti (fino a 89 volte più veloci)

  • Le query con chiave digitata forniscono un aumento costante delle prestazioni di 15-30 volte

  • Tutti i tipi di query traggono vantaggio dal JSON Shredding senza regressioni di prestazioni

DOMANDE FREQUENTI

  • Come posso verificare se la triturazione JSON funziona correttamente?

    1. Per prima cosa, verificare se i dati sono stati costruiti utilizzando il comando show segment --format table nello strumento Birdwatcher. In caso di successo, l'output conterrà shredding_data/ e shared_key_index/ nel campo Json Key Stats.

      Birdwatcher Output Output di Birdwatcher

    2. Quindi, verificare che i dati siano stati caricati eseguendo show loaded-json-stats sul nodo della query. L'output mostrerà i dettagli dei dati triturati caricati per ogni nodo di query.

  • Cosa succede se si verifica un errore?

    Se il processo di creazione o di caricamento non riesce, è possibile disattivare rapidamente la funzione impostando common.enabledJSONShredding=false. Per cancellare i compiti rimanenti, utilizzare il comando remove stats-task <task_id> in Birdwatcher. Se una query non va a buon fine, impostare common.usingjsonShreddingForQuery=false per tornare al percorso originale della query, aggirando i dati triturati.

  • Come si fa a scegliere tra la triturazione JSON e l'indicizzazione JSON?

    • Latriturazione JSON è ideale per le chiavi che appaiono frequentemente nei documenti, soprattutto per le strutture JSON complesse. Combina i vantaggi dell'archiviazione colonnare e dell'indicizzazione invertita, rendendola adatta a scenari di lettura intensiva in cui si interrogano molte chiavi diverse. Tuttavia, non è consigliata per documenti JSON molto piccoli, poiché il guadagno in termini di prestazioni è minimo. Quanto minore è la proporzione del valore della chiave rispetto alla dimensione totale del documento JSON, tanto migliore sarà l'ottimizzazione delle prestazioni grazie alla triturazione.

    • L'indicizzazione JSON è migliore per l'ottimizzazione mirata di query specifiche basate su chiavi e ha un minore overhead di memorizzazione. È adatta alle strutture JSON più semplici. Si noti che la triturazione JSON non copre le query su chiavi all'interno di array, per cui è necessario un indice JSON per accelerarle.

    Per maggiori dettagli, consultare la panoramica dei campi JSON.