Pyspark df से PostgresSQL के लिए 50 लाख से अधिक लेखन, सबसे अच्छा कुशल दृष्टिकोण


16

स्पार्क डेटाफ्रेम से पोस्टग्रैब टेबल्स में 50 मिलियन रिकॉर्ड के लाखों रिकॉर्ड डालने का सबसे कुशल तरीका क्या होगा। मैंने पिछले दिनों बल्क कॉपी और बैच साइज ऑप्शन का उपयोग करके स्पार्क से MSSQL तक किया है जो सफल भी रहा।

क्या ऐसा ही कुछ है जो यहाँ पोस्टग्रेज के लिए हो सकता है?

जो कोड मैंने कोशिश की है उसे जोड़ने और प्रक्रिया को चलाने में लगने वाला समय:

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जिसमें 200k के बैच आकार की कोशिश की गई थी

इस प्रक्रिया के लिए कुल समय 0: 14: 05.760926 (चौदह मिनट और पांच सेकंड) था।

क्या कोई अन्य कुशल दृष्टिकोण है जो समय को कम करेगा?

कुशल या इष्टतम बैच आकार क्या होगा जिसका मैं उपयोग कर सकता हूं? क्या मेरे बैच का आकार बढ़ने से नौकरी जल्दी हो जाएगी? या कई कनेक्शन खोलना>> 5 प्रक्रिया को तेज करने में मेरी मदद करें?

एक पर 10 लाख रिकॉर्ड के लिए औसत 14 मिनट बुरा नहीं है , लेकिन जो इस सवाल का जवाब देने के लिए मदद करने से पहले इस किया होता वहाँ बाहर लोगों की तलाश में।


1
आप डेटा को पहले एक स्थानीय CSV फ़ाइल में डंप कर सकते हैं, और फिर उसे आयात करने के लिए PostgreSQL के अपने आयात उपकरण का उपयोग करें - यह उस पर निर्भर करता है कि अड़चन कहां है: क्या यह Pyspark से निर्यात करने के लिए धीमा है या Postgres के लिए आयात करने के लिए धीमा है, या कुछ और? (कहा कि, 50 मिलियन पंक्तियों के लिए 14 मिनट मेरे लिए उतना बुरा नहीं है - टेबल पर कौन से इंडेक्स परिभाषित हैं?)।
दाई

दाई, मेरे पास एक df है जो 52mil है और अब मैं इसे Postgres पर लिख रहा हूं, यह एक नई तालिका है जो मैं उपरोक्त कोड के माध्यम से बना रहा हूं। मैंने पोस्टग्रेज में तालिका नहीं बनाई है और फिर वहां लिख रहा हूं। क्या कोई बेहतर संभावना है कि मैं पहले एक तालिका बना सकता हूं और उसे वहां पोस्टग्रेज में अनुक्रमित कर सकता हूं और फिर स्पार्क डीएफ से डेटा भेज सकता हूं?
चेतन_वासुदेवन

2
(यह दूसरा तरीका है - अनुक्रमणिका तालिकाओं पर सम्मिलित कार्य धीमा कर देता है, लेकिन चुनिंदा प्रश्नों को गति देता है)
दाई

दाई, इसलिए मैं सिर्फ अनुक्रमणिका के बिना पोस्टग्रेज में तालिका बनाता हूं और फिर मेरे प्रदर्शन को सम्मिलित करने और मापने का प्रयास करता हूं?
चेतन_वासुदेवन

2
stackoverflow.com/questions/758945/… मददगार हो सकता है।
एलेक्सी रोमनोव

जवाबों:


4

मैंने वास्तव में कुछ समय पहले उसी तरह का काम किया था लेकिन अपाचे सकूप का उपयोग करते हुए।

मैं कहूंगा कि इस सवालों का जवाब देने के लिए हमें स्पार्क और पोस्टग्रैसक्यू के बीच संचार को अनुकूलित करने की कोशिश करनी होगी, विशेष रूप से स्पार्क से पोस्टग्रेस्कल में बहने वाले डेटा।

लेकिन सावधान रहें, स्पार्क को मत भूलना। यह संभव नहीं है कि मैपपार्टिशन को निष्पादित करने के लिए , यदि अधिकतम कनेक्शनों की संख्या की तुलना में विभाजन की संख्या बहुत अधिक है, जो कि पोस्टग्रेसीक्यू समर्थन करते हैं, यदि आपके पास बहुत सारे विभाजन हैं और आप प्रत्येक के लिए एक कनेक्शन खोल रहे हैं, तो संभवतः आपके पास निम्न त्रुटि होगी। org.postgresql.util.PSQLException: FATAL: sorry, too many clients already

प्रविष्टि प्रक्रिया को ट्यून करने के लिए मैं अगले चरणों के बाद समस्या का सामना करूंगा:

  • याद रखें विभाजन की संख्या महत्वपूर्ण है। विभाजन की संख्या की जांच करें और फिर उस समानांतर कनेक्शन की संख्या के आधार पर समायोजित करें जो आप करना चाहते हैं। आप प्रति विभाजन में एक कनेक्शन रखना चाहते हैं, इसलिए मैं यहां जांच करने का सुझाव दूंगा coalesce, जैसा कि यहां बताया गया है
  • कनेक्शन की अधिकतम संख्या की जांच करें जो आपके पोस्टग्रेएसक्यू इंस्टेंस का समर्थन करता है और आप संख्या को बढ़ाना चाहते हैं ।
  • PostgreSQL में डेटा डालने के लिए COPY कमांड का उपयोग करने की सलाह दी जाती है । पोस्टग्रेएसक्यूएल प्रविष्टि को गति देने के तरीके के बारे में यहां एक अधिक विस्तृत जवाब भी दिया गया है।

अंत में, यह काम करने के लिए कोई चांदी की गोली नहीं है। आप ऊपर बताए गए सभी सुझावों का उपयोग कर सकते हैं लेकिन यह वास्तव में आपके डेटा और उपयोग के मामलों पर निर्भर करेगा।


Dbustosp मैं निश्चित रूप से उपरोक्त सुझावों की कोशिश करूंगा, तब तक आप सुनिश्चित करने के लिए एक उत्थान के लायक हैं।
चेतन_वासुदेवन

@ चेतन_वासुदेवन यदि आप उपयोग किए जा रहे डेटा के बारे में अधिक विवरण प्रदान करते हैं, तो प्रति रिकॉर्ड आकार, आदि। यदि डेटा सार्वजनिक है, तो मैं अपने दम पर कुछ कोशिश कर सकता हूं और समय की तुलना कर सकता हूं।
dbustosp

Dbustosp में डेटा में 80 कॉलम हैं और इसके 55 मिलियन रिकॉर्ड हैं। आपके द्वारा दिए गए सुझावों पर मैंने काम करना शुरू कर दिया है।
चेतन_वासुदेवन

@ चेतन_वासुदेवन डेटासेट का कुल आकार? इनपुट डेटा का प्रारूप क्या है?
dbustosp

@ चेतन_वासुदेवन कोई अपडेट?
dbustosp 20
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.