Set di dati geospaziali di grandi dimensioni (> 22 trilioni di articoli) con prestazioni di query di lettura rapida (<1s)


20

Sto progettando un nuovo sistema per un set di dati geospaziale di grandi dimensioni che richiederà prestazioni di query di lettura rapida. Pertanto, voglio vedere se qualcuno pensa che sia possibile o abbia esperienza / consulenza su DBMS, struttura dati o metodi alternativi adeguati per ottenere le prestazioni richieste nella seguente situazione:

I dati saranno continuamente prodotti da dati radar satellitari elaborati, che avranno una copertura globale. Sulla base della risoluzione satellitare e della copertura del pianeta, stima il set completo di dati per produrre valori in 75 miliardi di località discrete nel globo. Nel corso della vita di un singolo satellite, l'output produrrà fino a 300 valori in ciascuna di queste posizioni (quindi un set di dati totale di> 22 trilioni di valori). Questo è per un satellite, e ce n'è già un secondo in orbita, con altri due previsti nei nuovi anni. Quindi ci saranno molti dati! Un singolo elemento di dati è molto semplice e consisterà solo di (longitudine, latitudine, valore), ma a causa del numero di elementi che stima un singolo satellite per produrre fino a 100 TB.

I dati scritti non dovrebbero mai essere aggiornati, poiché cresceranno solo con l'elaborazione di nuove acquisizioni satellitari. La performance di scrittura non è importante, ma la performance di lettura è cruciale. L'obiettivo di questo progetto è di essere in grado di visualizzare i dati attraverso una semplice interfaccia come un livello su google maps, in cui ogni punto ha un valore colorato basato sulla sua media, gradiente o alcune funzioni nel tempo. (demo alla fine del post).

Da questi requisiti, il database deve essere scalabile e probabilmente cercheremo soluzioni cloud. Il sistema deve essere in grado di gestire query geospaziali come "punti near (lat, lon)" e "points Within (box)" e avere prestazioni di lettura di <1s per localizzare un singolo punto e poligoni che contengono fino a 50.000 punti (sebbene siano preferibili fino a 200.000 punti).

Finora ho un set di dati di test di circa 750 milioni di voci di dati in 111 milioni di località. Ho provato un'istanza postgres / postGIS, che ha funzionato bene, ma senza la possibilità di sharding non lo faccio, questo sarà in grado di far fronte alla crescita dei dati. Ho anche provato un'istanza di mongoDB, che di nuovo sembra OK, quindi lontano e con lo sharding potrebbe essere sufficiente scalare con il volume di dati. Recentemente ho imparato qualcosa su elasticsearch, quindi qualsiasi commento su questo sarebbe utile in quanto è nuovo per me.

Ecco una rapida animazione di ciò che vogliamo ottenere con il set completo di dati: Tileserver che serve alla visualizzazione di 750 milioni di elementi di dati.

Questa gif (dalla mia prova postgres) sta servendo (6x3) riquadri raster pre-calcolati, ciascuno contenente ~ 200.000 punti e impiegando ~ 17 secondi per generarli. Facendo clic su un punto, il grafico viene creato estraendo tutti i valori storici nella posizione più vicina in <1 s.

Ci scusiamo per il lungo post, tutti i commenti / consigli sono i benvenuti.

Risposte:


4

Puoi frammentare per posizione. Partiziona il globo in una griglia e disponi ogni quadrato in quella griglia su un server. Da quando hai citato il cloud, sarebbe adatto al cloud. Ovviamente dovrai unire manualmente i risultati da più server.

In questo modo puoi utilizzare qualsiasi soluzione di database che ti piace. Non deve essere scalabile da solo.

I singoli quadrati avranno diverse quantità di dati. Puoi usare macchine di dimensioni diverse per loro (dato che si tratta di cloud), oppure metti più piccoli frammenti sulla stessa macchina.

Questo schema di sharding è ottimo per il tipo di query che esegui perché ogni query dovrà solo toccare pochissimi frammenti. La frammentazione nel tempo è peggiore perché per ogni query è necessario toccare tutti i frammenti di tempo. Lo sharding casuale ha lo stesso problema.

Tutto sommato, questo è un caso di sharding facile perché il modello di query si adatta così bene allo schema di sharding.

In realtà, mi chiedo se hai bisogno di un database per questo. Forse puoi dividere il globo in riquadri 1000x1000 o più piccoli e avere un file flat nell'archivio BLOB per ogni riquadro. L'archiviazione BLOB non dispiace affatto per i BLOB 1M.

L'esecuzione di una query è concettualmente molto semplice con questo schema di archiviazione. È possibile archiviare i dati in modo ridondante anche in più risoluzioni della griglia.


La suddivisione per regione è l'approccio che ho esaminato con MongoDB e, con il rilascio tempestivo di MongoDB Atlas, mi sto sporgendo in quella direzione (utilizzando valori aggregati precalcolati). Al momento non sono sicuro di quanti server di replica / shard avrei bisogno, quindi il costo potrebbe diventare un problema. Anche la tua proposta di utilizzare l'archiviazione BLOB è interessante e tu sei la seconda persona a proporlo. Tuttavia, l'uso di BLOB è completamente nuovo per me, quindi ho bisogno di leggere ulteriormente, eventuali fonti utili che conosci? Grazie per la risposta.
Azwok,

I BLOB sono banali da usare. La complessità deriverà dalla necessità di implementare funzionalità di database come serializzazione, query, transazioni, backup, HA, DA. Tutto ciò è fattibile ma forse non saggio. Forse puoi archiviare i BLOB in una tabella di Postgres. Ciò automatizza tutto ciò tranne la serializzazione e la query. Perf potrebbe essere migliore dell'archiviazione BLOB e forse è anche più economico. I BLOB e le VM non sono addebitati in base al costo, hanno un buon margine (prova: il mio webhoster locale addebita 3-5 volte in meno per la stessa potenza di calcolo del cloud. Ciò implica elevati margini del cloud).
usr

Nota che puoi eseguire più frammenti sulla stessa istanza di mongo. Puoi "sovraccaricare". In questo modo è possibile bilanciare i server.
usr

1
Non sono sicuro che abbiate bisogno di alcuna caratteristica spaziale. Puoi calcolare tutto ciò nell'app. Hai solo bisogno della possibilità di interrogare tutti i dati per un rettangolo. Questo può essere fatto suddividendo manualmente il globo in una griglia (o più griglie di risoluzione). Penso che il tuo DB non debba supportare lo spazio.
usr

8

Quanto devono essere aggiornate le tue query di lettura?

È possibile partizionare il database per tempo se la mappa deve solo mostrare la misurazione più recente. Ciò ridurrebbe il carico di query per la mappa.

Per la cronologia di un determinato punto, puoi tenere un secondo negozio per xey mostrando la cronologia. Questo potrebbe essere fatto con un aggiornamento / aggiornamento notturno poiché i dati storici non cambieranno.

Quindi è possibile pre-calcolare le medie a risoluzioni più grossolane per l'integrazione con le mappe a diversi livelli di zoom. Ciò ridurrebbe il numero di punti da recuperare per le aree della mappa di grandi dimensioni (zoom indietro). Risoluzioni più precise verrebbero utilizzate per mappe più ingrandite che richiedevano aree più piccole. Se hai davvero bisogno di accelerarlo, puoi calcolare i riquadri come BLOB e interpretarli nella tua applicazione.

Poiché ciò implicherebbe un nuovo calcolo delle informazioni aggregate, vi sarebbe una certa latenza nei risultati delle query. A seconda della latenza accettabile, è possibile utilizzare questo tipo di approccio per ottimizzare le letture.

OK, quindi i tuoi punti devono essere calcolati medie nel tempo. Con questo calcolo immagino che le tue query effettive scendano abbastanza da 22 trilioni di articoli poiché i valori raster possono essere pre-calcolati per l'interrogazione.


Le query di lettura possono avere un po 'di ritardo (un giorno o due), quindi l'elaborazione in batch è un'opzione valida. In una determinata posizione, un nuovo valore verrà aggiunto solo ogni 6 giorni al più veloce (il successivo pass satellitare). L'output sulla mappa non è solo l'ultimo valore, ma viene calcolato in base all'intera cronologia dei valori in quella posizione, ad es. È media, o gradiente o una funzione personalizzata. Per livelli più ingranditi, sto già lavorando su una struttura di clustering / piramide in modo da disporre di una tabella / raccolta con valori medi in modo che nessun riquadro (query) abbia> 200.000 (o 50.000) elementi di posizione.
Azwok,

Penso che la chiave di pre-calcolo degli aggregati sia la chiave: i tuoi calcoli temporali possono ancora essere messi in batch. Questo è il modo in cui i sistemi OLAP ottengono prestazioni di query veloci e probabilmente dovrai adottare questo tipo di approccio. Particolarmente rilevante se riesci a convivere con dati vecchi di un giorno per le tue query.
ConcernedOfTunbridgeWells

Se stai eseguendo una query sui valori medi calcolati, in quante posizioni discrete stai prendendo i campioni, ovvero qual è la risoluzione della bitmap effettiva al massimo livello di zoom?
ConcernedOfTunbridgeWells

Sono d'accordo che gli aggregati precalcolati sembrano molto probabilmente la strada da percorrere. Le medie calcolate con lo zoom più alto non sono medie su un'area, è la media dei valori nel tempo in 1 posizione. Solo quando si ingrandisce avrò tabelle / raccolte separate che faranno la media delle aree per garantire che nessuna query / riquadro abbia troppi punti di posizione al suo interno (massimo 50.000-200.000). La risoluzione massima di qualsiasi riquadro è 256x256 pixel.
Azwok,

3

Sembra che ci siano due classi di query: una per capire quali posizioni si trovano nella finestra della vista corrente e una seconda per fornire la statistica desiderata per quei punti. Il mio suggerimento è di utilizzare strumenti separati e specializzati per ciascuno.

Suppongo che tutte le misurazioni si riferiscano allo stesso insieme di punti da 75 miliardi. Questi lat / long, una volta stabiliti, sono quindi statici. Possono essere raggruppati, aggregati e indicizzati a un costo unico. Pertanto suggerirei la suddivisione per regione e livello di zoom. La dimensione di ciascun frammento sarà determinata dalle prestazioni che possono essere ottenute da ciascuna istanza GIS.

Il GIS restituirà una serie di punti passati a un database di serie temporali. Questo contiene i valori misurati ed esegue aggregati. KDB è uno di cui sono a conoscenza. Si rivolge al trading di titoli, che avrà meno chiavi ma più punti dati per chiave rispetto al tuo scenario.

Ci sarà un costo per il trasferimento dei valori chiave dal server GIS al DB della serie temporale. La mia ipotesi è che questo costo sarà rimborsato dall'elaborazione più rapida nel DB di serie temporali specifico dell'attività. Dalla formulazione della domanda sembra che una singola istanza non sarà in grado di contenere tutti i dati, quindi un po 'di traffico tra server sembra inevitabile. Data la velocità relativa dei componenti sembra probabile che l'invio di un keyset a un server remoto che abbia i dati memorizzati nella cache sia più veloce della lettura dei dati dal disco locale.

Se le parti di ricerca del punto e di calcolo del valore possono essere locali l'una con l'altra, ovviamente mi aspetto che la risposta sia più veloce. La mia (limitata) comprensione è che trovare gli N vicini più vicini a un determinato punto è un compito non banale. Questo è il motivo per cui ho suggerito di utilizzare un software specifico per eseguirlo. Se il rilevamento del punto può essere ridotto a

where latitude between x1 and x2
and logitude between y1 and y2

quindi quella parte potrebbe essere gestita dal software di memorizzazione del valore e il GIS eliminato dall'architettura.

Non ho implementato un tale sistema. Sto davvero solo pensando ad alta voce qui. A livello di petabyte non ci sono soluzioni standard. Esistono tuttavia numerosi fornitori di dati satellitari, quindi il tuo problema è trattabile. In bocca al lupo.


D'accordo, ci sono due classi. 1) fare una foto dei singoli valori da molte posizioni, 2) ottenere tutti i valori storici in una posizione. Tutte le misurazioni sono correlate agli stessi miliardi di posizioni, l'unica modifica sarà il numero di valori storici in ciascun punto. La frammentazione per regione è l'approccio che sto cercando di adottare, per le ragioni che hai affermato. Non avevo considerato di passare i valori restituiti in un DB di serie storiche separato. Avrei pensato che la selezione e il trasferimento in un database di serie temporali avrebbero aggiunto troppo tempo per renderla un'opzione praticabile, a meno che non avessi frainteso la tua proposta.
Azwok,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.