Inserimenti contemporanei a MySQL o scrivere su tabelle separate e consolidarlo?

1

Sto lavorando su Apache Storm (ma anche chiunque conosca bene MySQL può aiutare). La topologia è così:

Beccuccio singolo ---- emit --- > Istanze multiple di un bullone

Ogni istanza del Bullone inserisce una serie di righe nella tabella ABC. La tabella del database si trova su un singolo server. Le istanze di Bolt potrebbero essere distribuite su più server.

Obiettivo: essere in grado di speed su e ridimensiona il programma aumentando il numero di istanze di Bolt (es .: se l'elaborazione di x quantità di dati e la scrittura su MySQL richiede 1 ora con 5 Bolts, dovrebbero impiegare forse 35 minuti se uso 10 bulloni).

Problema:
1. Non importa quanti bulloni io uso, il tempo di elaborazione si ridurrà, ma ogni Bolt dovrà aspettare che gli altri bulloni n-1 finiscano di inserire , prima che possa essere inserito (non perché il programma la logica lo fa aspettare, ma poiché SQL non consente a un processo / bullone di scrivere su SQL mentre un altro processo / bullone scrive sulla stessa tabella ). Questo tempo di attesa non consente la scalabilità del programma.
2. Un lungo tempo di attesa causerà Zookeeper al timeout .
3. Prima che questa topologia inizi, la tabella ABC ha già dati esistenti e qualsiasi nuovo inserimento verrà eventualmente aggiunto alla tabella ABC.

Una soluzione a cui ho pensato:
Per consentire a ogni Bolt di scrivere sulla propria tabella temporanea
ABC_TempBolt1
ABC_TempBolt2
ABC_TempBolt3
ABC_TempBolt4
ABC_TempBolt5
e quando lo Spout è finito, usa il comando INSERT INTO di SQL per prendere il contenuto delle tabelle Temp e inserirlo in ABC.

È questo il più efficiente & & veloce & & modo scalabile per realizzare questo o c'è un design migliore || tecnica?

ps: Se ci sono altri database (anche i DB noSQL) che possono aiutare ad accelerare l'applicazione consentendo inserimenti concomitanti, sono aperto all'idea.

    
posta Nav 25.07.2016 - 13:53
fonte

2 risposte

1

Se il meccanismo di blocco è presente nella tabella nel database, non è possibile la scrittura simultanea in esso, quindi non c'è altro modo per parallelizzare la scrittura. Semplicemente, il database è il collo di bottiglia. L'unico vantaggio che si ottiene è che l'elaborazione eseguita dai bulloni prima che i dati vengano scritti nel database viene eseguita in parallelo.

Pertanto, l'approccio che hai usato è praticamente ottimale. L'unico modo in cui vedo che è possibile velocizzare gli inserti è utilizzando inserimenti batch e modificando il database in modo che sia ottimizzato per ciò che si sta tentando di fare. Dai uno sguardo ai seguenti link:

Caricamento di dati in blocco per tabelle InnoDB

Inserisci velocità per lotti di grandi dimensioni

Per quanto riguarda gli inserimenti simultanei, questo potrebbe aiutare:

Inserti simultanei MySQL

Credo che questo potrebbe interessarti:

If there are multiple INSERT statements, they are queued and performed in sequence

Fondamentalmente, non è possibile inserire due record contemporaneamente. Verranno sempre accodati, il che significa che il meccanismo di blocco è implicitamente inserito.

Spero che questo aiuti.

    
risposta data 26.07.2016 - 09:09
fonte
1

Se il tempo di elaborazione è molto più del tempo speso per scrivere sul db per ciascun bullone, è possibile utilizzare una coda di output. Ogni bullone può scrivere i risultati in coda e continuare l'elaborazione.

Potresti usare un processo separato per scrivere le voci dalla coda alla tabella.

    
risposta data 26.07.2016 - 09:59
fonte

Leggi altre domande sui tag