2014-10-30 14 views
15

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!

+1

sono andato per 3 # perché # 1 e # 2 sembra non essere possibile – cruppstahl

risposta

0

Hai mai pensato di mettere in coda (buffer), quindi utilizzare lo spark sparking per il dequeue e utilizzare il formato di output per scrivere.