Apa yang akan menjadi cara paling efisien untuk menyisipkan jutaan catatan katakan 50 juta dari bingkai data Spark ke Postgres Tables. Saya telah melakukan ini dari percikan ke MSSQL di masa lalu dengan memanfaatkan salinan massal dan opsi ukuran batch yang berhasil juga.
Adakah sesuatu yang serupa yang bisa ada di sini untuk Postgres?
Menambahkan kode yang telah saya coba dan waktu yang diperlukan untuk menjalankan proses:
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()
Jadi saya melakukan pendekatan di atas untuk 10 juta catatan dan memiliki 5 koneksi paralel sebagaimana ditentukan dalam numPartitions
dan juga mencoba ukuran batch 200k .
Total waktu yang dibutuhkan untuk proses ini adalah 0: 14: 05.760926 (empat belas menit dan lima detik).
Apakah ada pendekatan efisien lain yang akan mengurangi waktu?
Berapa ukuran batch yang efisien atau optimal yang dapat saya gunakan? Apakah meningkatkan ukuran batch saya melakukan pekerjaan lebih cepat? Atau membuka banyak koneksi, misalnya> 5 membantu saya membuat proses lebih cepat?
Rata - rata 14 menit untuk 10 juta catatan tidak buruk , tetapi mencari orang di luar sana yang akan melakukan ini sebelumnya untuk membantu menjawab pertanyaan ini.
sumber
Jawaban:
Saya sebenarnya melakukan pekerjaan yang sama beberapa waktu lalu tetapi menggunakan Apache Sqoop.
Saya akan mengatakan bahwa untuk menjawab pertanyaan ini kita harus mencoba mengoptimalkan komunikasi antara Spark dan PostgresSQL, khususnya data yang mengalir dari Spark ke PostgreSql.
Tapi hati-hati, jangan lupa Spark side. Tidak masuk akal untuk mengeksekusi mapPartitions jika jumlah partisi terlalu tinggi dibandingkan dengan jumlah koneksi maksimum yang didukung PostgreSQL, jika Anda memiliki terlalu banyak partisi dan Anda membuka koneksi untuk masing-masing partisi, Anda mungkin akan memiliki kesalahan berikut
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
.Untuk menyesuaikan proses penyisipan, saya akan mendekati masalah dengan mengikuti langkah-langkah berikut:
coalesce
, seperti yang disebutkan di sini .Akhirnya, tidak ada peluru perak untuk melakukan pekerjaan ini. Anda dapat menggunakan semua tips yang saya sebutkan di atas tetapi itu akan sangat tergantung pada data Anda dan kasus penggunaan.
sumber