Was wäre der effizienteste Weg, um Millionen von Datensätzen einzufügen, beispielsweise 50 Millionen von einem Spark-Datenrahmen in Postgres-Tabellen. Ich habe dies in der Vergangenheit von Spark bis MSSQL getan, indem ich die Option für Massenkopien und Stapelgrößen verwendet habe, die ebenfalls erfolgreich war.
Gibt es etwas Ähnliches, das für Postgres hier sein kann?
Hinzufügen des Codes, den ich versucht habe, und der Zeit, die zum Ausführen des Prozesses benötigt wurde:
def inserter():
start = timer()
sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
.option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
.option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
end = timer()
print(timedelta(seconds=end-start))
inserter()
Also habe ich den obigen Ansatz für 10 Millionen Datensätze durchgeführt und 5 parallele Verbindungen wie in angegeben angegeben numPartitions
und auch eine Stapelgröße von 200 KB ausprobiert .
Die Gesamtzeit für den Vorgang betrug 0: 14: 05.760926 (vierzehn Minuten und fünf Sekunden).
Gibt es einen anderen effizienten Ansatz, der die Zeit verkürzen würde?
Was wäre die effiziente oder optimale Chargengröße, die ich verwenden kann? Wird das Erhöhen meiner Chargengröße die Arbeit schneller erledigen? Oder das Öffnen mehrerer Verbindungen, dh> 5, hilft mir, den Prozess zu beschleunigen?
Im Durchschnitt sind 14 Minuten für 10 Millionen Datensätze nicht schlecht , aber es gibt Leute, die dies zuvor getan hätten, um diese Frage zu beantworten.
quelle
Antworten:
Ich habe vor einiger Zeit tatsächlich die gleiche Arbeit gemacht, aber Apache Sqoop verwendet.
Ich würde sagen, dass wir zur Beantwortung dieser Fragen versuchen müssen, die Kommunikation zwischen Spark und PostgresSQL zu optimieren, insbesondere die Daten, die von Spark nach PostgreSql fließen.
Aber seien Sie vorsichtig, vergessen Sie nicht die Spark-Seite. Es ist nicht sinnvoll, mapPartitions auszuführen, wenn die Anzahl der Partitionen im Vergleich zur Anzahl der von PostgreSQL unterstützten maximalen Verbindungen zu hoch ist. Wenn Sie zu viele Partitionen haben und für jede eine Verbindung öffnen, tritt wahrscheinlich der folgende Fehler auf
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Um den Einfügevorgang zu optimieren, würde ich mich dem Problem mit den folgenden Schritten nähern:
coalesce
, wie erwähnt ist hier .Schließlich gibt es keine Silberkugel, um diesen Job zu erledigen. Sie können alle oben genannten Tipps verwenden, dies hängt jedoch wirklich von Ihren Daten und Anwendungsfällen ab.
quelle