गतिरोध जब कई स्पार्क नौकरियां समवर्ती रूप से निर्धारित होती हैं


17

स्पार्क 2.4.4 स्पार्क फीफो शेड्यूलर के साथ YARN क्लस्टर मोड में चल रहा है।

मैं थ्रेड्स के एक वेरिएबल नंबर के साथ थ्रेड पूल निष्पादक का उपयोग करके कई स्पार्क डेटाफ़्रेम ऑपरेशन (यानी S3 में डेटा लिखना) सबमिट कर रहा हूं। यह ठीक काम करता है अगर मेरे पास ~ 10 धागे हैं, लेकिन अगर मैं सैकड़ों धागे का उपयोग करता हूं, तो एक गतिरोध प्रतीत होता है, जिसमें स्पार्क यूआई के अनुसार कोई नौकरी निर्धारित नहीं है।

कौन से कारक नियंत्रित करते हैं कि कितनी नौकरियां समवर्ती रूप से निर्धारित की जा सकती हैं? ड्राइवर संसाधन (जैसे मेमोरी / कोर)? कुछ अन्य स्पार्क कॉन्फ़िगरेशन सेटिंग्स?

संपादित करें:

यहाँ मेरे कोड का एक संक्षिप्त सार है

ExecutorService pool = Executors.newFixedThreadPool(nThreads);
ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool);

Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths);

List<Future<Void>> futures = listOfSeveralHundredThings
  .stream()
  .map(aThing -> ecs.submit(() -> {
    df
      .filter(col("some_column").equalTo(aThing))
      .write()
      .format("org.apache.hudi")
      .options(writeOptions)
      .save(outputPathFor(aThing));
    return null;
  }))
  .collect(Collectors.toList());

IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES));
exec.shutdownNow();

कुछ बिंदु पर, nThreadsवृद्धि के रूप में , चिंगारी अब किसी भी नौकरी का समय-निर्धारण नहीं लगती है:

  • ecs.poll(...) समय समाप्त हो गया
  • स्पार्क UI जॉब्स टैब में कोई सक्रिय जॉब नहीं है
  • स्पार्क UI निष्पादक टैब किसी भी निष्पादक के लिए कोई सक्रिय कार्य नहीं दिखा रहा है
  • स्पार्क यूआई एसक्यूएल टैब nThreadsबिना किसी रनिंग जॉब आईडी के चल रहा है

मेरा अमल का माहौल है

  • AWS EMR 5.28.1
  • स्पार्क 2.4.4
  • मास्टर नोड = m5.4xlarge
  • कोर नोड्स = 3x rd5.24xlarge
  • spark.driver.cores=24
  • spark.driver.memory=32g
  • spark.executor.memory=21g
  • spark.scheduler.mode=FIFO

कृपया जांच करें। spark.apache.org/docs/latest/job-scheduling.html
दास

क्या कोई विशिष्ट खंड है जो इस पर चर्चा करता है? मैंने पिछले कुछ दिनों में कई बार उन डॉक्स पर पढ़ा है और मुझे वह उत्तर नहीं मिला है जिसकी मुझे तलाश है।
स्कॉट

2
क्या आप कृपया वह कोड दिखा सकते हैं जिसका उपयोग आप थ्रेड पूल निष्पादक के माध्यम से स्पार्क नौकरियों को प्रस्तुत करने के लिए करते हैं? ऐसा लगता है कि स्पार्क नौकरी जमा करने से पहले गतिरोध हो रहा है।
सलीम

1
क्या आप अपना कोड पोस्ट कर सकते हैं? कृपया अपने env पर विवरण प्रदान करें: CPU, RAM; यह भी कि आप कैसे धागे बना रहे हैं: एक साथ या 10 के छोटे समूहों में?
साहिद

क्षमा करें, आपका क्या मतलब है कि नौकरियां अनुसूचित नहीं हैं? वे स्पार्क UI पर दिखाई नहीं देते हैं, या वे नौकरियों की सूची में दिखाई देते हैं, लेकिन कार्यों को निष्पादित नहीं किया जाता है? किसी भी तरह से, यदि आपको गतिरोध का संदेह है, तो कृपया jstack -lलॉकिंग जानकारी के साथ थ्रेड डंप प्राप्त करने के लिए दौड़ें ।
डैनियल डारबोस

जवाबों:


0

यदि संभव हो तो नौकरियों के आउटपुट को एडब्ल्यूएस इलास्टिक मेप्रेडेड एचडीएफ़एस (लगभग तात्कालिक नाम और स्थानीय एचडीएफएस की बेहतर फ़ाइल आईओ पर लाभ उठाने के लिए) लिखें और फाइलों को एस 3 में स्थानांतरित करने के लिए एक dstcp कदम जोड़ें, जिससे खुद को संभालने की सभी परेशानियों से बचा जा सके। एक फ़ाइल स्टोर होने की कोशिश कर रहे एक वस्तु भंडार के innards। इसके अलावा स्थानीय hdfs को लिखने से आप DirectOutputCommiter के साथ जुड़े गतिरोध जाल में गिरने के बिना भगोड़ा कार्यों को नियंत्रित करने के लिए अटकलों को सक्षम करने की अनुमति देंगे।

यदि आपको S3 का उपयोग करना चाहिए, तो आउटपुट निर्देशिका यह सुनिश्चित करती है कि निम्नलिखित स्पार्क कॉन्फ़िगरेशन सेट हैं

spark.hadoop.mapreduce.fileoutputcommitter.algorithm.version 2
spark.speculation false

नोट: DirectParquetOutputCommitter डेटा हानि की संभावना के कारण स्पार्क 2.0 से हटा दिया गया है। दुर्भाग्य से जब तक हमने S3a से निरंतरता में सुधार नहीं किया है तब तक हमें वर्कअराउंड के साथ काम करना है। Hadoop 2.8 के साथ हालात सुधर रहे हैं

लेक्सिकोग्राफिक क्रम में कीनेम से बचें। चारों ओर पाने के लिए कोई हैशिंग / यादृच्छिक उपसर्ग या रिवर्स डेट-टाइम का उपयोग कर सकता है। चाल अपनी कुंजी को नाम देने के लिए है, अपनी कुंजी के बाईं ओर आपके द्वारा फ़िल्टर की जाने वाली सबसे सामान्य चीज़ों को डालते हुए। और DNS मुद्दों के कारण बाल्टी के नामों में कभी अंडरस्कोर नहीं होता है।

fs.s3a.fast.upload uploadसमानांतर में अमेज़न S3 के लिए एक फ़ाइल के कुछ हिस्सों को सक्षम करना

अधिक विस्तार के लिए इन लेखों को देखें-

S3 को लिखते समय स्पार्क 2.1.0 में स्पार्क.स्पेकुलेशन सेट करना

https://medium.com/@subhojit20_27731/apache-spark-and-amazon-s3-gotchas-and-best-practices-a767242f3d98



0

IMO आपको इस समस्या के गलत होने की संभावना है। जब तक आप इस बात की गारंटी नहीं दे सकते कि प्रति कार्य कार्यों की संख्या बहुत कम है, तो आपको एक साथ 100 नौकरियों को अधिकतम करने से प्रदर्शन में सुधार नहीं होने की संभावना है। आपका क्लस्टर केवल एक बार में 300 कार्यों का समर्थन कर सकता है, यह मानते हुए कि आप केवल 200 नौकरियों के लिए 200 समानांतर के डिफ़ॉल्ट समानता का उपयोग कर रहे हैं। मैं आपके कोड को अधिकतम समवर्ती प्रश्नों को कैप करने का सुझाव दूंगा। 10. मुझे अत्यधिक संदेह है कि आपके पास वास्तव में चल रहे कई सौ में से केवल एक ही कार्य के साथ 300 प्रश्न हैं। अधिकांश ओएलटीपी डेटा प्रोसेसिंग सिस्टम में जानबूझकर इस कारण से अधिक पारंपरिक आरडीएस सिस्टम की तुलना में समवर्ती प्रश्नों का स्तर काफी कम है।

भी

  1. अपाचे हुडी में कई सौ FYI की डिफ़ॉल्ट समानता है।
  2. आप अपने फ़िल्टर कॉलम के आधार पर सिर्फ विभाजन क्यों नहीं करते?
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.