Какой самый эффективный способ вставить миллионы записей, скажем, 50 миллионов из фрейма данных Spark в таблицы Postgres. В прошлом я делал это от spark до MSSQL, используя опцию массового копирования и размера пакета, которая также была успешной.
Есть ли что-то подобное, что может быть здесь для Postgres?
Добавляем код, который я пробовал, и время, необходимое для запуска процесса:
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()
Таким образом, я применил вышеуказанный подход для 10 миллионов записей и имел 5 параллельных соединений, как указано в, numPartitions
а также пробовал размер пакета 200 КБ .
Общее время, затрачиваемое на процесс, составило 0: 14: 05.760926 (четырнадцать минут и пять секунд).
Есть ли другой эффективный подход, который бы сократил время?
Какой эффективный или оптимальный размер партии я могу использовать? Будет ли увеличение размера моей партии делать работу быстрее? Или открытие нескольких соединений, т. Е.> 5, поможет мне ускорить процесс?
В среднем 14 минут для 10 миллионов записей - это неплохо , но искать людей, которые сделали бы это раньше, чтобы помочь ответить на этот вопрос.
источник
Ответы:
Я фактически проделал такую же работу некоторое время назад, но с использованием Apache Sqoop.
Я бы сказал, что для ответа на эти вопросы мы должны попытаться оптимизировать взаимодействие между Spark и PostgresSQL, в частности, данные, передаваемые из Spark в PostgreSql.
Но будьте осторожны, не забудьте Spark Side. Не имеет смысла выполнять mapPartitions, если число разделов слишком велико по сравнению с количеством максимальных соединений, которые поддерживает PostgreSQL, если у вас слишком много разделов и вы открываете соединение для каждого из них, у вас, вероятно, будет следующая ошибка
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
,Чтобы настроить процесс вставки, я бы подошел к проблеме, выполнив следующие шаги:
coalesce
, как указано здесь .Наконец, нет серебряной пули, чтобы сделать эту работу. Вы можете использовать все советы, которые я упомянул выше, но это действительно зависит от ваших данных и вариантов использования.
источник