BigData: numero di parole basato sul tempo

1

Che cosa stiamo cercando di fare:

Stiamo cercando di creare un sistema che conterrà il numero di voci uniche per un determinato periodo di tempo. Funziona bene fino a quando i dati crescono o il tempo aumenta, quindi riceviamo qualche OOM Exception o la risposta è troppo lenta.

Per semplificare è più o meno il classico conteggio delle parole ma con i tempi.

# timestamp - userId - count
111111 - 12345 - 1
222222 - 67890 - 1
333333 - 67890 - 1
444444 - 12345 - 1
555555 - 12345 - 1

Se l'utente chiede il "top" tra (100.000,400000) la risposta dovrebbe essere "67890 - 2", altrimenti se chiede il "top" tra (100.000,600000) la risposta dovrebbe essere "12345 - 3" .

Siamo nell'ordine di milioni di voci (da 1 a 10, più o meno).

Cosa abbiamo fatto:

In questo momento stiamo memorizzando i dati su MongoDB, divisi per ore. Ottenere i documenti (che sono abbastanza grandi) è piuttosto lento, circa un minuto per ottenere 168 documenti per una settimana. Abbiamo provato Redis ad accelerare un po 'le cose, ma siamo ancora fuori dal nostro obiettivo.

Che cosa ho provato:

Per sperimentare un po 'ho scritto un file di testo con un paio di milioni di voci (circa 50mb) e ho cercato semplicemente di leggere e contare da esso, filtrando per il timestamp. Sembra essere "incredibilmente" più veloce, circa 2 secondi per passare attraverso tutte le voci.
Lo svantaggio è che, anche per i piccoli intervalli di tempo, dovremmo analizzare tutto il file. Per risolvere questo problema, possiamo pensare di dividere i file ogni giorno.

Ho provato anche Spark, ma per cose così piccole sembra eccessivo e lento.

Ad ogni modo, mi sembra strano che il modo più veloce per farlo sia leggere un file di testo! C'è qualche disegno, quadro che mi manca?

Dichiarazione di non responsabilità: Non sono sicuro se ho esposto il problema abbastanza chiaramente o se è adatto per questo sito, ma sto perdendo il sonno da 3 settimane alle prese con questo e questo sembra essere uno dei miei ultimi scatti.

    
posta Enrichman 17.12.2015 - 11:03
fonte

1 risposta

1

"Is there any design,framework that I am missing?"

Utilizza un database relazionale.

I database di documenti e oggetti (tra cui MongoDB) sono fantastici quando i tuoi dati sono "pesanti". Cioè, eccellono se hai intenzione di recuperare dati in una particolare forma: acquisisci un intero ordine con i suoi elementi pubblicitari, prendi un utente con le loro preferenze, prendi una classe con i suoi studenti (o uno studente con le loro classi).

Gli archivi di chiavi / valori stanno urlando velocemente quando si recupera sempre per chiave.

Il problema è che non stai usando nessuna di queste strategie. La forma dei tuoi dati dipende completamente da ciò che un utente richiede. Non c'è scorciatoia per i dati; semplicemente non è disponibile. Detto questo, dovresti schiacciare le prestazioni del tuo file di testo con un database relazionale. Se non lo fai, stai facendo qualcosa di sbagliato. Assicurati di aver compreso indici e partizionamento . (È qui che un file di testo si sfalda. Non usare un file di testo come database, per favore.) Se non lo fai, assumi qualcuno che lo faccia.

Mentre sto scrivendo questo, mi rendo conto che potrei portarti fuori strada. Nello specifico, è del tutto possibile avere successo con MongoDB. Hai detto che stai memorizzando i conteggi delle parole per ora. Questo non deve essere un'ipotesi efficiente data la quantità di tempo e di memoria necessari per completare una query. Con la giusta esperienza, potresti creare un modello MongoDB efficace. Se non hai esperienza, prendilo.

Fino ad allora ...

Utilizza un database relazionale.

    
risposta data 18.12.2015 - 04:58
fonte

Leggi altre domande sui tag