Sto cercando di integrare un database di valori-chiave in Spark e avere alcune domande. Sono un principiante Spark, ho letto molto ed eseguito alcuni campioni, ma niente di troppo complesso .Spark: eseguire InputFormat come singleton
Scenario:
sto usando un piccolo gruppo HDFS per memorizzare i messaggi in arrivo in un database. Il cluster ha 5 nodi e i dati sono suddivisi in 5 partizioni. Ogni partizione è memorizzata in un file di database separato. Ogni nodo può quindi elaborare la propria partizione dei dati.
Il problema:
L'interfaccia verso il software database in base JNI, il database stesso viene implementato in C. Per ragioni tecniche, il software di database può mantenere una sola connessione attiva per volta . Può esserci solo un processo JVM che è connesso al Database.
A causa di questa limitazione, la lettura e la scrittura nel database devono passare allo tramite lo stesso processo JVM.
(Informazione: il database è incorporato nel processo E 'basato su file, e solo un processo può aprire alla volta ho potuto farlo funzionare in un processo separato , ma che sarebbe più lento.. . a causa del sovraccarico IPC la mia applicazione eseguirà molte scansione completa della tabella scrive supplementari saranno raggruppate e sono non il tempo-critico)
la soluzione:..
ho un paio di idee in mente come solv E questo, ma non so se funzionano bene con Spark.
Forse è possibile configurare magicamente Spark di avere una sola istanza di mia InputFormat proprietaria per nodo.
Se il mio InputFormat viene utilizzato per la prima volta, avvia una filettatura separata che creerà la connessione al database. Questo thread continuerà quindi come un daemon e vivrà finché vivrà la JVM. Funzionerà solo se c'è solo una JVM per nodo. Se Spark avvia più JVM sullo stesso nodo , ognuno avvierebbe il proprio thread di database, che non funzionerebbe .
Sposta la connessione del mio database a un processo JVM separato per nodo, e il mio InputFormat utilizza quindi IPC per connettersi a questo processo. Come ho detto, vorrei evitare questo.
O forse avete un'altra idea migliore?
La mia soluzione preferita sarebbe la # 1, seguita da vicino da # 2.
Grazie per qualsiasi commento e risposta!
sono andato per 3 # perché # 1 e # 2 sembra non essere possibile – cruppstahl