2016-05-11 3 views
0

Ich versuche multidplyr zu verwenden, um einen do Befehl auszuführen, der eine benutzerdefinierte Funktion ausführt, die eine Vertica-Datenbank mit RJDBC abfragt. Ich habe kein Problem, die multidplyr Beispiele ausgeführt wird oder direkt auf die Datenbank abfragen, aber wenn ich versuche, in multidplyr zu der Datenbank zu verbinden bekomme ich den Fehler:Multidplyr mit Datenbankverbindung

Error in checkForRemoteErrors(lapply(cl, recvResult)) : 3 nodes produced errors; first error: No running JVM detected. Maybe .jinit() would help.

Ich habe den Vorschlag im Kommentar versuche here zu dem mache Cluster manuell, übergibt das vertica Datenbankverbindungsobjekt, aber ich bekomme immer noch einen Fehler, dass "keine JVM erkannt wurde". Ich vermute, dass dies daran liegt, dass ich jedem Knoten sagen muss, dass er eine JVM starten soll, aber ich weiß jetzt nicht, wie ich das machen soll.

Mein Code, entschuldigt, dass es nicht reproduzierbar ist, da ich nicht die Datenbank teilen kann:

# set up DB connection 
vertica <- dbConnect(vDriver, ...connection info...) 

# create cluster 
cluster3 <- create_cluster(3) 
parallel::clusterExport(cl = cluster3, c("getData", "vertica")) 

# run function in parallel using multidplyr 
accounts_part <- multidplyr::partition(accounts, accountId, cluster = cluster3) 

accounts_data <- accounts_part %>% 
    group_by(accountId) %>% 
    do(getData(ac = .$accountId, vertica = vertica)) 

Antwort

0

ich nicht meine answere reproduzieren kann Ihren Code so basiert auf meiner Erfahrung (ich hatte ähnliches Problem mit assign (verschiedene) Zufallszahlen zu jedem Cluster) und unter sowohl this als auch this. Hoffe, dass es funktioniert.

Ich denke, Ihr Hauptproblem ist, dass Ihre Verbindung hergestellt wird, um Ihre Datenbank mit der tatsächlichen Sitzung zu verknüpfen, und Sie können es nicht auf jedem Knoten "kopieren", weil sie ihren eigenen "Weg" zu der DB benötigen.

Andererseits müssen Sie für jede Verbindung den gleichen Namen haben, um sie in einem einzigen (parallelen) Anruf verwalten zu können. Also, ich denke, Sie müssen die Verbindungen nur direkt in jeden Knoten erstellen, anstatt eine Verbindung in der aktuellen Sitzung zu erstellen und sie dann in die Knoten zu kopieren.

# create cluster 
cluster3 <- create_cluster(3) 

# export data, function, ... 
cluster_assign_value(cluster, 'getData', getData) 

# setup DB connection in each cluster (evaluated in each cluster) 
cluster_eval(cluster, vertica <- dbConnect(vDriver, ...connection info...)) 
# not 
# cluster_assign_value(cluster, 
#  'vertica', dbConnect(vDriver, ...connection info...) 
#) 
# which is evaluate locally and so it is the same as your code 

# run function in parallel using multidplyr 
accounts_part <- multidplyr::partition(accounts, accountId, 
    cluster = cluster3 
) 

accounts_data <- accounts_part %>% 
    # group_by(accountId) %>% # partition() have already grouped them 
    do(getData(ac = .$accountId, vertica = vertica)) # %>% 
    # collect() # if you have no more computations to do and want get back 
       # the results locally