Quel serait le moyen le plus efficace d'insérer des millions d'enregistrements, par exemple 50 millions d'une trame de données Spark dans des tables Postgres. J'ai fait cela de spark à MSSQL dans le passé en utilisant l' option de copie en bloc et de taille de lot qui a également réussi.
Y a-t-il quelque chose de similaire qui peut être ici pour Postgres?
Ajout du code que j'ai essayé et du temps qu'il a fallu pour exécuter le processus:
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()
J'ai donc fait l'approche ci-dessus pour 10 millions d'enregistrements et j'ai eu 5 connexions parallèles comme spécifié dans numPartitions
et j'ai également essayé une taille de lot de 200k .
Le temps total nécessaire pour le processus était de 0: 14: 05.760926 (quatorze minutes et cinq secondes).
Existe-t-il une autre approche efficace qui réduirait le temps?
Quelle serait la taille de lot efficace ou optimale que je peux utiliser? L'augmentation de la taille de mon lot fera-t-elle le travail plus rapidement? Ou ouvrir plusieurs connexions, c'est-à-dire> 5, m'aider à accélérer le processus?
En moyenne, 14 minutes pour 10 millions d'enregistrements, ce n'est pas mal , mais chercher des gens qui auraient fait cela avant pour répondre à cette question.
la source
Réponses:
En fait, j'ai fait un peu le même travail il y a quelque temps, mais en utilisant Apache Sqoop.
Je dirais que pour répondre à ces questions, nous devons essayer d'optimiser la communication entre Spark et PostgresSQL, en particulier les données circulant de Spark vers PostgreSql.
Mais attention, n'oubliez pas le côté Spark. Il n'est pas logique d'exécuter mapPartitions si le nombre de partitions est trop élevé par rapport au nombre de connexions maximum prises en charge par PostgreSQL, si vous avez trop de partitions et que vous ouvrez une connexion pour chacune, vous aurez probablement l'erreur suivante
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Afin de régler le processus d'insertion, j'aborderais le problème en suivant les étapes suivantes:
coalesce
, comme mentionné ici .Enfin, il n'y a pas de solution miracle pour faire ce travail. Vous pouvez utiliser tous les conseils que j'ai mentionnés ci-dessus, mais cela dépendra vraiment de vos données et de vos cas d'utilisation.
la source