¿Cuál sería la forma más eficiente de insertar millones de registros? Por ejemplo, 50 millones de un marco de datos de Spark a tablas de Postgres. He hecho esto desde la chispa a MSSQL en el pasado haciendo uso de la opción de copia masiva y tamaño de lote que también fue exitosa.
¿Hay algo similar que pueda estar aquí para Postgres?
Agregué el código que probé y el tiempo que tomó ejecutar el proceso:
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()
Así que hice el enfoque anterior para 10 millones de registros y tuve 5 conexiones paralelas como se especifica en numPartitions
y también probé un tamaño de lote de 200k .
El tiempo total que llevó el proceso fue 0: 14: 05.760926 (catorce minutos y cinco segundos).
¿Existe algún otro enfoque eficiente que reduzca el tiempo?
¿Cuál sería el tamaño de lote eficiente u óptimo que puedo usar? ¿Aumentar el tamaño de mi lote hará el trabajo más rápido? ¿O abrir varias conexiones, es decir,> 5 me ayuda a acelerar el proceso?
En promedio, 14 minutos para 10 millones de registros no está mal , pero buscar personas que hubieran hecho esto antes para ayudar a responder esta pregunta.
fuente
Respuestas:
Realmente hice el mismo trabajo hace un tiempo pero usando Apache Sqoop.
Diría que para responder a estas preguntas tenemos que intentar optimizar la comunicación entre Spark y PostgresSQL, específicamente los datos que fluyen de Spark a PostgreSql.
Pero ten cuidado, no te olvides del lado Spark. No tiene sentido ejecutar mapPartitions si el número de particiones es demasiado alto en comparación con el número máximo de conexiones que admite PostgreSQL, si tiene demasiadas particiones y está abriendo una conexión para cada una, probablemente tendrá el siguiente error
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Para ajustar el proceso de inserción, abordaría el problema siguiendo los siguientes pasos:
coalesce
, como se menciona aquí .Finalmente, no hay una bala de plata para hacer este trabajo. Puede usar todos los consejos que mencioné anteriormente, pero realmente dependerá de sus datos y casos de uso.
fuente