Sparki seadistamine YARN-il

Tere, Єабр! Eelmine pĂ€ev toimus mitmik, mis kĂ€sitles Apache Sparki, Rambler&Co meestelt, osalejatelt tuli pĂ€ris palju kĂŒsimusi seoses selle tööriista konfigureerimisega. Otsustasime selle pĂ”hjal jagada oma kogemusi. Teema on keeruline — seetĂ”ttu kutsume jagama oma kogemusi ka kommentaarides, vĂ”ib-olla me ei mĂ”ista ja kasuta ka midagi valesti.

Pisike sissejuhatus — kuidas me Spark'i kasutame. Meil on kolm kuud kestev programm „Suure andmete spetsialist“, ja kogu teises moodulis töötavad meie osalejad selle tööriistaga. Seega on meie ĂŒlesanne, kui korraldajatena, ette valmistada klaster selle kasutamiseks sellistes tingimustes.

Meie kasutamise eripĂ€ra seisneb selles, et spark'iga samaaegselt töötavate inimeste arv vĂ”ib olla vĂ”rdne kogu grupiga. NĂ€iteks seminaril, kui kĂ”ik ĂŒhiselt midagi proovivad ja kordavad meie Ă”petaja jĂ€rgi. Ja see pole sugugi vĂ€ike — vahel kuni 40 inimest. Ilmselt ei ole maailmas paljusid ettevĂ”tteid, kes sellise kasutusstsenaariumiga silmitsi seisavad.

JÀrgmine rÀÀgin, kuidas ja miks me valisime erinevad konfiguratsiooniparametrid.

Alustame algusest. Sparkil on 3 vÔimalust töötada klastris: standalone, Mesose abil ja YARNi abil. Otsustasime valida viimase variandi, kuna see oli meie jaoks loogiline. Meil on juba olemas Hadoopi klaster. Meie liikmed on selle arhitektuuriga juba hÀsti tuttavad. Kasutame YARNi.

spark.master=yarn

Edasi on huvitavam. Igal kolmel disainivĂ”imalusel on kaks jĂ”udlust: client ja cluster. LĂ€htuvalt dokumentatsioonis ja erinevatest linkidest internetis vĂ”ib jĂ€reldada, et client sobib interaktiivseks tööks — nĂ€iteks Jupyteri mĂ€rkmikus, samas kui cluster sobib paremini tootmislahendustele. Meie puhul huvitas meid interaktiivne töötamine, seega:

spark.deploy-mode=client

PĂ”himĂ”tteliselt hakkab Spark alates sellest hetkest YARN-is mingil moel tööle, kuid see ei olnud meile piisav. Kuna meil on programm suurte andmete kohta, siis mĂ”nikord ei piisanud osalistest ressursside jaotustest. Siit leidsime huvitava asja — dĂŒnaamiline ressursside jaotamine. Lihtsalt öeldes: kui teil on keeruline ĂŒlesanne ja klaster on vaba (nĂ€iteks hommikul), vĂ”ib Spark selle vĂ”imaluse abil teile lisarekursse anda. Vajaduse arvutamine toimub saladuslikul valemil. SĂŒgavale detailidesse ei lasku — see töötab hĂ€sti.

spark.dynamicAllocation.enabled=true

Me seadsime selle parameetri ja kui kĂ€ivitasime Sparki, nurises ta ja ei kĂ€ivitanud. Õigesti, sest oli vaja lugeda dokumentatsiooni tĂ€helepanelikumalt. Seal on mĂ€rgitud, et kĂ”ik peab olema korras, peame sisse lĂŒlitama ka tĂ€iendava parameetri.

spark.shuffle.service.enabled=true

Miks see vajalik on? Kui meie töö lihtsustub ja ei vaja enam nii palju ressursse, peab Spark need tagasi ĂŒldisse basseinisse andma. KĂ”ige töömahukam etapp peaaegu igas MapReduce ĂŒlesandes on Shuffle etapp. See parameeter vĂ”imaldab salvestada andmeid, mis tekivad sellel etapil, ja seega vabastada executoreid. Executor on protsess, mis kĂ”ike töötleb töötajas. Tal on teatav arv protsessorituumasid ja teatav kogus mĂ€lu.

Lisatud see parameeter. KĂ”ik tundub töötavat. On mĂ€rgatav, et osalejatele antakse tĂ”eliselt rohkem ressursse, kui neid vajavad. Kuid tekkis teine probleem — mingil hetkel Ă€rkasid teised osalejad ja soovisid samuti Spark'i kasutada, aga kĂ”ik oli hĂ”ivatud ja nad olid rahulolematud. Nende tundeid on lihtne mĂ”ista. Hakkasime dokumentatsiooni uurima. Selgus, et seal on veel mitmeid parameetreid, millega saab protsessile mĂ”ju avaldada. NĂ€iteks, kui executor on oote-reĆŸiimis — kui kaua vĂ”ib oodata, kuni ressursid temalt Ă€ra vĂ”tta?

spark.dynamicAllocation.executorIdleTimeout=120s

Meie puhul, kui teie executors ei tee midagi kahe minuti jooksul, siis palun tagastage need ĂŒldsesse puuli. Kuid isegi see parameeter ei olnud alati piisav. Oli nĂ€ha, et inimene ei ole pikka aega midagi teinud, kuid ressursse ei vabastatud. Selgus, et on olemas veel eriline parameeter — pĂ€eva jooksul, kui kaua tohib hoida executors, mis sisaldavad vahemĂ€lus andmeid. Vaikimisi oli selle parameetri vÀÀrtus — infinity! Me parandasime selle.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

See tĂ€hendab, et kui 5 minuti jooksul teie executors ei tee midagi, tagastage need ĂŒldsesse puuli. Sel viisil on suurte kasutajate arvu jaoks ressursi vabastamise ja jagamise kiirus saanud korralikuks. Rahulolematute arv on vĂ€henenud. Kuid otsustasime minna edasi ja piirata maksimaalset executorside arvu ĂŒhe rakenduse kohta — pĂ”himĂ”tteliselt ĂŒhe programmi osaleja kohta.

spark.dynamicAllocation.maxExecutors=19

NĂŒĂŒd on muidugi tekkinud rahulolematud ka teiselt poolt — "kluster seisab, aga mul on ainult 19 executors", aga mis teha — vajalik on leida mingi Ă”ige tasakaal. KĂ”iki Ă”nnelikuks teha ei Ă”nnestu.

Ja veel ĂŒks vĂ€ike lugu, mis on seotud meie juhtumi eripĂ€radega. Ühel korral hilinesid mĂ”ned inimesed praktilisele tunnile ning nende Spark ei kĂ€ivitunud. Vaatasime vabaressursse – kĂ”ik nĂ€is olevat korras. Spark peaks kĂ€ivituma. Õnneks oli selleks ajaks dokumentatsioon juba kuskil alateadvuses, ja meenutasime, et Spark otsib kĂ€ivitamise ajal endale porti. Kui esimene port vahemikus on hĂ”ivatud, siis liigub ta jĂ€rgmise juurde. Kui see on vaba, siis haarab ta selle. Ja seal on seade, mis mÀÀrab maksimaalse katsete arvu selle jaoks. VaikesĂ€tetena on see 16. See number on vĂ€iksem kui meie grupis praktilisel tunnil osalejate arv. Seega, pĂ€rast 16 katset viskas Spark selle asja kĂ€est ja ĂŒtles, et ei saa kĂ€ivituda. Muutsime seda seadet.

spark.port.maxRetries=50

RÀÀgin nĂŒĂŒd mĂ”ningatest seadistustest, mis ei ole enam tugevalt seotud meie juhtumi eripĂ€radega.

Selleks, et Spark kÀivituks kiiremini, on soovitus tihendada jars kaust, mis asub SPARK_HOME kodu kataloogis, ja paigutada see HDFS-i. Nii ei pea ta kulutama aega nende jar-failide laadimisele töötajatele.

spark.yarn.archive=hdfs:///tmp/spark-archive.zip

Selleks, et saavutada kiiremat tööd, soovitatakse kasutada serialiseerijana kryo. See on paremini optimeeritud kui vaikimisi variant.

spark.serializer=org.apache.spark.serializer.KryoSerializer

Ja on veel ĂŒks vana probleem Sparkis, et see kipub sageli mĂ€lu ĂŒletama. See juhtub sageli hetkel, kui töölised on kĂ”ik arvutused teinud ja saadavad tulemuse draiverile. Me muutsime selle parameetri suuremaks. Vaikimisi on see 1 GB, meil on 3.

spark.driver.maxResultSize=3072

Ja viimane asi, magustoiduks. Kuidas uuendada Spark 2.1 versiooniks HortonWorks'i jaotises HDP 2.5.3.0. See HDP versioon sisaldab eelnevalt installitud 2.0 versiooni, kuid me otsustasime, et Spark areneb ĂŒsna aktiivselt ning iga uus versioon lahendab mĂ”ningaid vigu ja annab tĂ€iendavaid vĂ”imalusi, sealhulgas python API jaoks, seega otsustasime, et uuendamine on vajalik.

Laaditud versioon ametlikult veebilehelt Hadoop 2.7 jaoks. Lahti pakkida, paigutada HDP kausta. Panime sĂŒmboolikud Ă”igesti. KĂ€ivitame - ei kĂ€ivitu. NĂ€itab vĂ€ga arusaamatut viga.

java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig

Otsisime Google'ist, et Spark otsustas mitte oodata, kuni Hadoop vĂ€lja tuleb, ja kasutama hakata uut jersey versiooni. Nad tĂŒlitsevad selle ĂŒle JIRA-s. Lahenduseks oli - alla laadida jersey versioon 1.17.1. Panna see SPARK_HOME'i jars kausta, jĂ€lle zipida ja HDFS-i ĂŒles laadida.

Selle vea me ĂŒletasime, kuid ilmnes uus ja ĂŒsna keeruline.

org.apache.spark.SparkException: Yarn rakendus on juba lÔpetatud! See vÔis olla lÔpetatud vÔi ei suutnud rakenduse pead kÀivitada

Samas proovime kÀivitada versiooni 2.0 - kÔik on korras. Proovi arvata, mis siin toimub. Me vaatlesime selle rakenduse logisid ja nÀgime midagi sellist:

/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jar

ÜhesĂ”naga, mingil pĂ”hjusel hdp.version ei lahendunud. Otsides leidsime lahenduse. Ambari seadetes tuleb minna YARN-i seadetesse ja lisada custom yarn-site'i parameeter:

hdp.version=2.5.3.0-37

See maagia aitas ning Spark tÔusis. Testisime mitmeid meie jupyter-notebook'e. KÔik töötab. Oleme valmis laupÀevale (juba homme) toimuvale Spark'i esimeses tunnis!

UPD. Tunnis selgus veel ĂŒks probleem. MĂ”nel hetkel lĂ”petas YARN Spark'i konteinerite andmise. YARN-is pidi muutma parameetrit, mis vaikimisi oli 0.2:

yarn.scheduler.capacity.maximum-am-resource-percent=0.8

See, only 20% of the resources were involved in resource distribution. After changing the parameters, we restarted YARN. The problem was solved, and the other participants were also able to launch the spark context.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster