Jaki byłby najbardziej efektywny sposób wstawiania milionów rekordów, mówi 50 milionów z ramki danych Spark do tabel Postgres. Robiłem to od Spark do MSSQL w przeszłości, korzystając z opcji kopiowania zbiorczego i opcji wielkości partii , która również się powiodła.
Czy istnieje coś podobnego dla Postgres?
Dodanie kodu, który próbowałem i czasu potrzebnego do uruchomienia procesu:
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()
Więc zastosowałem powyższe podejście dla 10 milionów rekordów i miałem 5 równoległych połączeń, jak określono w, numPartitions
a także próbowałem wielkości partii 200k .
Całkowity czas potrzebny na proces wyniósł 0: 14: 05.760926 (czternaście minut i pięć sekund).
Czy istnieje inne skuteczne podejście, które skróciłoby czas?
Jakiego efektywnego lub optymalnego rozmiaru partii mogę użyć? Czy zwiększenie wielkości mojej partii przyspieszy pracę? Czy otwieranie wielu połączeń, tj.> 5, pomaga mi przyspieszyć proces?
Na zasadzie średnio 14 minut na 10 milionów płyt nie jest złe , ale patrząc na ludzi, którzy tam zrobiłby to wcześniej, aby pomóc odpowiedzieć na to pytanie.
źródło
Odpowiedzi:
Właściwie zrobiłem trochę taką samą pracę jakiś czas temu, ale używając Apache Sqoop.
Powiedziałbym, że aby odpowiedzieć na te pytania, musimy spróbować zoptymalizować komunikację między Spark a PostgresSQL, w szczególności dane przepływające ze Spark do PostgreSql.
Ale bądź ostrożny, nie zapomnij o stronie Spark. Wykonywanie mapPartitions nie ma sensu, jeśli liczba partycji jest zbyt wysoka w porównaniu z maksymalną liczbą połączeń obsługiwanych przez PostgreSQL, jeśli masz zbyt wiele partycji i otwierasz połączenie dla każdej z nich, prawdopodobnie wystąpi następujący błąd
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Aby dostroić proces wstawiania, podszedłbym do problemu, wykonując następujące kroki:
coalesce
, jak wspomniano tutaj .Wreszcie, nie ma srebrnej kuli do wykonania tej pracy. Możesz skorzystać ze wszystkich wskazówek, o których wspomniałem powyżej, ale tak naprawdę będzie to zależeć od twoich danych i przypadków użycia.
źródło