स्पार्क 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
jstack -l
लॉकिंग जानकारी के साथ थ्रेड डंप प्राप्त करने के लिए दौड़ें ।