Qual seria a maneira mais eficiente de inserir milhões de registros, digamos 50 milhões, de um dataframe Spark para o Postgres Tables. Eu fiz isso do spark ao MSSQL no passado, usando a opção de cópia em massa e tamanho do lote, que também teve êxito.
Existe algo semelhante que pode estar aqui para o Postgres?
Adicionando o código que tentei e o tempo que levou para executar o processo:
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()
Então, eu fiz a abordagem acima para 10 milhões de registros e tive 5 conexões paralelas, conforme especificado numPartitions
e também tentei o tamanho do lote de 200k .
O tempo total que levou para o processo foi 0: 14: 05.760926 (catorze minutos e cinco segundos).
Existe alguma outra abordagem eficiente que reduza o tempo?
Qual seria o tamanho do lote eficiente ou ideal que posso usar? Aumentar o tamanho do meu lote fará o trabalho mais rápido? Ou abrir várias conexões, ou seja,> 5 me ajudar a tornar o processo mais rápido?
Em média, 14 minutos para 10 milhões de registros não é ruim , mas procurar pessoas por aí que teriam feito isso antes para ajudar a responder a essa pergunta.
fonte
Respostas:
Na verdade, eu fiz o mesmo trabalho há algum tempo, mas usando o Apache Sqoop.
Eu diria que, para responder a essas perguntas, precisamos tentar otimizar a comunicação entre o Spark e o PostgresSQL, especificamente os dados que fluem do Spark para o PostgreSql.
Mas tenha cuidado, não se esqueça do lado Spark. Não faz sentido executar mapPartitions se o número de partições for muito alto em comparação com o número máximo de conexões suportadas pelo PostgreSQL, se você tiver muitas partições e estiver abrindo uma conexão para cada uma delas, provavelmente terá o seguinte erro
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Para ajustar o processo de inserção, abordaria o problema seguindo as próximas etapas:
coalesce
, como mencionado aqui .Finalmente, não há uma bala de prata para fazer este trabalho. Você pode usar todas as dicas que mencionei acima, mas isso realmente depende dos seus dados e casos de uso.
fonte