Pyspark df'den PostgresSQL'e 50 milyondan fazla yazı yazmak, en verimli yaklaşım


16

Milyonlarca kayıt eklemenin en etkili yolu, Spark veri çerçevesinden Postgres Tablolarına 50 milyon demek. Ben geçmişte de MSSQL kıvılcımdan çok başarılı olan toplu kopya ve toplu boyut seçeneğini kullanarak yaptım .

Postgres için burada bulunabilecek benzer bir şey var mı?

Ben denedim kodu ve süreci çalıştırmak için gereken zaman ekleme:

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()

Bu yüzden 10 milyon kayıt için yukarıdaki yaklaşımı yaptım ve belirtildiği gibi 5 paralel bağlantıya numPartitionssahiptim ve aynı zamanda 200k'luk parti boyutunu denedim .

İşlem için geçen toplam süre 0: 14: 05.760926 (on dört dakika ve beş saniye) idi.

Zamanı azaltacak başka etkili bir yaklaşım var mı?

Kullanabileceğim verimli veya optimum parti boyutu ne olabilir? Parti boyutumu artırmak işi daha hızlı yapar mı? Veya birden fazla bağlantı açmak, örneğin> 5, işlemi daha hızlı yapmama yardımcı olur mu?

Üzerinde 10 milyon kayıtları için ortalama 14 dakika kötü değil , ama orada insanlar arıyor yardım cevaba önce bu soruyu bu yapardı kim.


1
Önce verileri yerel bir CSV dosyasına dökebilir ve sonra içe aktarmak için PostgreSQL'in kendi içe aktarma araçlarını kullanabilirsiniz - darboğazın nerede olduğuna bağlıdır: Pyspark'tan dışa aktarma yavaş mı yoksa Postgres'e aktarma yavaş mı, yoksa başka bir şey mi? (Bununla birlikte, 50 milyon satır için 14 dakika benim için o kadar da kötü görünmüyor - tabloda hangi dizinler tanımlanıyor?).
Dai

Dai, 52mil olan bir df var ve şimdi Postgres için yazıyorum, yukarıdaki kod aracılığıyla oluşturduğum yeni bir tablo. Postgres'de tablo oluşturmadım ve orada yazdım. Önce bir tablo oluşturmak ve Postgres orada orada dizin ve sonra spark df veri göndermek eğer daha iyi bir olasılık var mı?
Chetan_Vasudevan

2
(Bunun tam tersi - dizinler tablolardaki ekleme işlemlerini yavaşlatır, ancak belirli sorguları hızlandırır)
Dai

Dai, bu yüzden sadece dizin olmadan Postgres tablo oluşturmak ve sonra eklemek ve performansımı ölçmek deneyin?
Chetan_Vasudevan

Yanıtlar:


4

Aslında bir süre önce aynı işi yaptım ama Apache Sqoop kullanıyorum.

Bu soruları cevaplamak için Spark ve PostgresSQL arasındaki iletişimi, özellikle Spark'dan PostgreSql'e akan verileri optimize etmeye çalışmamız gerektiğini söyleyebilirim.

Ancak dikkatli olun, Spark tarafını unutmayın. Bölüm sayısı PostgreSQL'in desteklediği maksimum bağlantı sayısına kıyasla çok yüksekse, mapPartitions'ı çalıştırmak mantıklı değildir , çok fazla bölümünüz varsa ve her biri için bir bağlantı açıyorsanız , muhtemelen aşağıdaki hataya sahip olursunuz org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

Ekleme işlemini ayarlamak için sonraki adımları izleyerek soruna yaklaşırım:

  • Bölümlerin sayısının önemli olduğunu unutmayın. Bölüm sayısını kontrol edin ve ardından olmasını istediğiniz paralel bağlantı sayısına göre ayarlayın. Bölüm başına bir bağlantıya sahip olmak isteyebilirsiniz, bu yüzden buradacoalesce belirtildiği gibi kontrol etmenizi öneririm .
  • PostgreSQL örneğinizin desteklediği ve sayısını artırmak istediğiniz maksimum bağlantı sayısını kontrol edin .
  • PostgreSQL'e veri eklemek için COPY komutu kullanılarak önerilir . Burada ayrıca postgreSQL'in nasıl hızlandırılacağı hakkında daha ayrıntılı bir cevap verilmiştir.

Son olarak, bu işi yapacak gümüş mermi yok. Yukarıda bahsettiğim tüm ipuçlarını kullanabilirsiniz, ancak bu gerçekten verilerinize ve kullanım durumlarınıza bağlıdır.


Dbustosp Kesinlikle yukarıdaki ipuçlarını deneyeceğim, o zamana kadar kesin bir upvote hak ediyorsunuz.
Chetan_Vasudevan

@chetan_vasudevan Kullandığınız veriler, kayıt başına boyut vb. hakkında daha fazla ayrıntı sağlarsanız. Veriler herkese açıksa kendi başıma bir şeyler deneyebilir ve saatleri karşılaştırabilirim.
dbustosp

Dbustosp verilerinde 80 sütun ve 55 milyon kayıt bulunuyor. Bana verdiğiniz öneriler üzerinde çalışmaya başladım.
Chetan_Vasudevan

@Chetan_Vasudevan Veri kümesinin toplam boyutu? Girdi verilerinin formatı nedir?
dbustosp

@Chetan_Vasudevan Herhangi bir güncelleme var mı?
dbustosp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.