Cluster Spark plin de timeout-uri heartbeat, executori care ies singuri (Programare, Apache Spark, Configurare)

crockpotveggies a intrebat.

Clusterul meu Apache Spark rulează o aplicație care îmi oferă o mulțime de timeout-uri ale executorilor:

10:23:30,761 ERROR ~ Lost executor 5 on slave2.cluster: Executor heartbeat timed out after 177005 ms
10:23:30,806 ERROR ~ Lost executor 1 on slave4.cluster: Executor heartbeat timed out after 176991 ms
10:23:30,812 ERROR ~ Lost executor 4 on slave6.cluster: Executor heartbeat timed out after 176981 ms
10:23:30,816 ERROR ~ Lost executor 6 on slave3.cluster: Executor heartbeat timed out after 176984 ms
10:23:30,820 ERROR ~ Lost executor 0 on slave5.cluster: Executor heartbeat timed out after 177004 ms
10:23:30,835 ERROR ~ Lost executor 3 on slave7.cluster: Executor heartbeat timed out after 176982 ms

Cu toate acestea, în configurația mea pot confirma că am crescut cu succes intervalul de heartbeat al executorului:

Când vizitez jurnalele executorilor marcați ca fiind EXITED (adică: driverul i-a eliminat atunci când nu a putut obține o bătaie a inimii), se pare că executorii s-au sinucis pentru că nu au primit nicio sarcină de la driver:

16/05/16 10:11:26 ERROR TransportChannelHandler: Connection to /10.0.0.4:35328 has been quiet for 120000 ms while there are outstanding requests. Assuming connection is dead; please adjust spark.network.timeout if this is wrong.
16/05/16 10:11:26 ERROR CoarseGrainedExecutorBackend: Cannot register with driver: spark://[email protected]:35328

Cum pot să dezactivez bătăile inimii și/sau să împiedic executorii să se oprească?

3 răspunsuri
Glennie Helles Sindholt

Lipsa bătăilor inimii și a executorilor care sunt uciși de YARN se datorează aproape întotdeauna OOM-urilor. Ar trebui să inspectați jurnalele pe executorii individuali (căutați textul „running beyond physical memory”). Dacă aveți mai mulți executori și considerați că este greoi să inspectați manual toate jurnalele, vă recomand să monitorizați sarcina în interfața Spark UI în timp ce rulează. De îndată ce o sarcină eșuează, aceasta va raporta cauza în UI, astfel încât să fie ușor de văzut. Rețineți că unele sarcini vor raporta eșecul din cauza executanților lipsă care au fost deja uciși, așa că asigurați-vă că analizați cauzele pentru fiecare dintre sarcinile individuale care eșuează.

Rețineți, de asemenea, că majoritatea problemelor de OOM pot fi rezolvate rapid prin simpla repartizare a datelor în locurile corespunzătoare din cod (din nou, consultați interfața de utilizare Spark pentru indicii cu privire la locurile în care ar putea fi nevoie de un apel către repartition). În caz contrar, este posibil să doriți să vă extindeți mașinile pentru a face față nevoii de memorie.

Comentarii

  • Am avut aceeași problemă și repartition a rezolvat problema. Mulțumiri –  > Por Martin Seeler.
  • Cu excepția cazului în care jar-ul aplicației dvs. are 150 MB și aveți 200 de executori care încearcă să îl descarce de pe AM. Spark nu este suficient de inteligent pentru a trata un activ jar activ ca pe un nod care nu este mort. Iar ping-urile sale heartbeat sunt blocate de descărcare. –  > Por Scott Carey.
  • Punctul de vedere al lui @ScottCarey a fost foarte util pentru a decide dacă ar trebui să măresc timeout-ul sau să măresc memoria. Atunci când am o aplicație mare de descărcat, creșterea timeout-ului de rețea ar trebui să fie cea mai bună soluție. –  > Por groceryheist.
crockpotveggies

Răspunsul a fost destul de simplu. În aplicația mea spark-defaults.conf am setat spark.network.timeout la o valoare mai mare. Intervalul de bătăi ale inimii era oarecum irelevant pentru problemă (deși tuningul este la îndemână).

Atunci când se utilizează spark-submit am putut, de asemenea, să setez timeout-ul după cum urmează:

$SPARK_HOME/bin/spark-submit --conf spark.network.timeout 10000000 --class myclass.neuralnet.TrainNetSpark --master spark://master.cluster:7077 --driver-memory 30G --executor-memory 14G --num-executors 7 --executor-cores 8 --conf spark.driver.maxResultSize=4g --conf spark.executor.heartbeatInterval=10000000 path/to/my.jar

Comentarii

  • Heartbeats lasă driverul să știe că executorul este încă în viață și îl actualizează cu metrici pentru sarcinile în curs de desfășurare. spark.executor.heartbeatInterval ar trebui să fie semnificativ mai mică decât spark.network.timeout – spark.apache.org/docs/latest/configuration.html –  > Por evgenii.
  • acest lucru nu a funcționat pentru mine, a trebuit să folosesc –conf spark.network.timeout=10000000 –  > Por nEO.
  • Cu valori identice pentru spark.network.timeout și spark.executor.heartbeatInterval, , am primit următoarea eroare java.lang.IllegalArgumentException: requirement failed: The value of spark.network.timeout=10000000s must be no less than the value of spark.executor.heartbeatInterval=10000000s. Creștere spark.network.timeout la 100000001 a rezolvat această problemă. Cu toate acestea, rețineți comentariul de mai sus al lui @evgenii care face referire la spark.apache.org/docs/latest/configuration.html –  > Por Ashutosh Jindal.
  • știi cum să o setezi în Zeppelin? –  > Por wwwwan.
  • Setarea spark.network.timeout mai mare va da mai mult timp executorilor să se întoarcă la șofer și să raporteze bătăile inimii sale. În timp ce spark.executor.heartbeatInterval este intervalul de timp în care executorul își raportează bătăile inimii către driver. Astfel, în cazul în care GC necesită mai mult timp pentru executor, atunci spark.network.timeout ar trebui să ajute șoferul să aștepte să primească un răspuns de la executor înainte de a-l marca ca fiind pierdut și de a începe un nou proces. Consultați acest lucru – (github.com/rjagerman/mammoth/wiki/…) –  > Por Anil Savaliya.
Natty

Dacă utilizați pyspark, schimbarea configurației contextului spark va rezolva această problemă. O puteți seta după cum urmează (Rețineți că toate timpurile menționate sunt în ms) și heartbeatInterval (implicit 10000) ar trebui să fie mai mic decât timeout (implicit 120000)

conf = SparkConf().setAppName("applicaiton") 
.set("spark.executor.heartbeatInterval", "200000")  
.set("spark.network.timeout", "300000")
sc = SparkContext.getOrCreate(conf)
sqlcontext = SQLContext(sc)

Sper că acest lucru vă rezolvă problema. Dacă vă confruntați cu alte erori, consultați documentația aici