Tere, Habr! Eile toimus , kus Rambler&Co poisid rÀÀkisid, tekkis osalejate seas palju kĂŒsimusi, mis olid seotud selle tööriista konfigureerimisega. Otsustasime oma kogemusi jagada. Teema ei ole lihtne â seetĂ”ttu kutsub meid ĂŒles jagama kogemusi ka kommentaarides, vĂ”ib-olla on meil ka midagi valesti arusaadud ja kasutatud.
LĂŒhike sissejuhatus â kuidas me Spark'i kasutame. Meil on kolmekuuline programm , ja kogu teises moodulis töötavad meie osalejad selle tööriistaga. Vastavalt sellele on meie ĂŒlesanne, kui korraldajad, valmistada klaster ette selle kasutamiseks sellises kontekstis.
Meie kasutamise eripĂ€ra seisneb selles, et samal ajal vĂ”ib Spark'iga töötavate inimeste arv vĂ”rdsuda kogu grupiga. NĂ€iteks seminaril, kui kĂ”ik proovivad samaaegselt ja kordavad meie Ă”petaja jooniseid. Ja see on mitte vĂ€he â mĂ”nikord peaaegu 40 inimest. Ilmselt ei ole maailmas palju ettevĂ”tteid, kes puutuvad kokku sellise kasutusskeemiga.
JÀrgmiseks rÀÀgin, kuidas ja miks me valisime teatud konfigureerimise parameetreid.
Alustame algusest. Spark'il on 3 vÔimalust töötada klastris: standalone, Mesos'i kasutamine ja YARN'i kasutamine. Otsustasime valida kolmanda variandi, kuna see oli meile loogiline. Meil on juba olemas Hadoop klaster. Meie osalejad on selle arhitektuuriga juba hÀsti tuttavad. Alustame YARN'iga.
spark.master=yarnEdasi on huvitavam. Igal kolmel deploy variandil on 2 varianti: client ja cluster. LĂ€htudes ja erinevatest linkidest internetis, vĂ”ib jĂ€reldada, et client sobib interaktiivseks tööks â nĂ€iteks jupyter notebook'i kaudu, samas kui cluster sobib rohkem tootmislahenduste jaoks. Meie puhul oli meil huvi interaktiivse töö jĂ€rele, seega:
spark.deploy-mode=clientĂldiselt hakkab Spark sellest hetkest alates YARN-is töötama, kuid meile sellest ei piisanud. Kuna meie programm keskendub suurtele andmetele, siis mĂ”nikord oli osalistel puudu see, mida saadi tasakaalustatud ressursside jaotamise kĂ€igus. Ja siit me leidsime huvitava asja â dĂŒnaamiline ressursside jaotamine. LĂŒhidalt öeldes on asi jĂ€rgmine: kui teil on raske ĂŒlesanne ja klaster on vaba (nĂ€iteks hommikuti), siis selle valiku abil vĂ”ib Spark teile anda tĂ€iendavaid ressursse. Vajadus arvutatakse seal keerulise valemi abil. SĂŒgavamale ei lasku, - see töötab hĂ€sti.
spark.dynamicAllocation.enabled=trueMe seadsime selle parameetri, ja Spark kĂ€ivitamisel nurjus ja ei kĂ€ivitunud. Ăigesti, sest oli vaja lugeda tĂ€psemalt. Seal on mĂ€rgitud, et kĂ”ik peab olema korras, tuleb veel aktiveerida tĂ€iendav parameeter.
spark.shuffle.service.enabled=trueMiks see vajalik on? Kui meie töö ei vaja enam nii palju ressursse, peab Spark need tagasi tagasi ĂŒldisesse gruppi andma. Peaaegu igasuguste MapReduce ĂŒlesannete kĂ”ige töömahukam etapp on Shuffle etapp. See parameeter lubab sĂ€ilitada andmeid, mis tekivad selle etapi kĂ€igus, ja vabastada vastavalt tĂ€itejĂ”ud. TĂ€itejĂ”ud on protsess, mis töötleb kĂ”ike töötaja seadmes. Tal on mingisugune arv protsessorituumasid ja mingisugune hulk mĂ€lu.
Me lisasime selle parameetri. KĂ”ik tundus töötavat. Oli mĂ€rgatav, et osalistele anti tĂ”epoolest rohkem ressursse, kui neid vajas. Kuid tekkis teine probleem - mingil hetkel Ă€rkasid teised osalised ja soovisid samuti Spark'i kasutada, kuid kĂ”ik oli hĂ”ivatud, ja nad olid rahulolematud. Neid vĂ”ib mĂ”ista. Hakkasime dokumentatsiooni vaatama. Seal selgus, et on veel mitmeid parameetreid, mille abil saab protsessile mĂ”ju avaldada. NĂ€iteks kui tĂ€itejĂ”ud on ootereĆŸiimil â kui kaua tohib ressursse tagasi vĂ”tta?
spark.dynamicAllocation.executorIdleTimeout=120sMeie puhul, kui teie executors ei tee kahe minuti jooksul midagi, siis palun tagastage need ĂŒhisesse hulka. Kuid isegi see parameeter ei olnud alati piisav. Oli nĂ€ha, et inimene ei tee juba ammu midagi ja ressursse ei vabastata. Selgus, et on olemas veel ĂŒks eriline parameeter â kui kaua peab mööduma, et valida executors, mis sisaldavad vahemĂ€llu salvestatud andmeid. VaikesĂ€ttega oli see â infinity! Me korrigeerisime seda.
spark.dynamicAllocation.cachedExecutorIdleTimeout=600sSee tĂ€hendab, et kui teie executors ei tee viie minuti jooksul midagi, siis andke need ĂŒhisesse hulka tagasi. Sellises reĆŸiimis on ressursside vabastamise ja jagamise kiirus suure arvu kasutajate jaoks muutunud korralikuks. Rahulolematute arv on vĂ€henenud. Kuid me otsustasime minna edasi ja piirata maksimaalset executorsâte arvu ĂŒhe rakenduse kohta â praktiliselt ĂŒhe programmi osaleja kohta.
spark.dynamicAllocation.maxExecutors=19NĂŒĂŒd, muidugi, tekkisid rahulolematud ka teiselt poolt â "klaster seisab, aga mul on ainult 19 executors", aga mis seal ikka â vajalik on leida Ă”ige tasakaal. KĂ”iki ei saa Ă”nnelikuks teha.
Ja veel ĂŒks vĂ€ike lugu, mis on seotud meie juhtumi spetsiifikaga. Kord hilines praktilisse tundidesse mitu inimest, ja neil ei hakanud Spark mingil pĂ”hjusel kĂ€ima. Me vaatasime vabade ressursside arvu â tundus, et on olemas. Spark peaks kĂ€ima hakkama. Ănneks oli dokumentatsioon juba mingil hetkel alateadvusse salvestunud ja me mĂ€letasime, et Spark otsib kĂ€ivitamisel endale porti, millega alustada. Kui esimene port vahemikust on hĂ”ivatud, siis siirdub ta jĂ€rgmise juurde. Kui see on vaba, siis ta haarab selle. Ja on olemas parameeter, mis nĂ€itab maksimaalset katsete arvu selle jaoks. VaikesĂ€ttega on see 16. Arv on vĂ€iksem kui inimeste arv meie grupis tunnis. Seega, pĂ€rast 16 katset viskas Spark selle asja kĂ€est ja ĂŒtles, et ei saa kĂ€ivituda. Me korrigeerisime seda parameetrit.
spark.port.maxRetries=50Edasi rÀÀgin mÔningatest seadistustest, mis ei ole enam tÔeliselt seotud meie juhtumi spetsiifikaga.
Selleks, et Spark kiiremini kÀima saada, on soovitus arhiveerida jars-kaust, mis asub SPARK_HOME kodudirektooriumis, ja panna see HDFS-i. Nii ei pea ta nende jaride allalaadimisele töötajates aega raiskama.
spark.yarn.archive=hdfs:///tmp/spark-archive.zipSamuti on soovitatav kasutada kiirema töö jaoks serialiseerijana Kryo't. See on optimeeritum kui vaikimisi valitud.
spark.serializer=org.apache.spark.serializer.KryoSerializerJa on veel ĂŒks vana probleem Sparkiga: see kukub sageli mĂ€lu tĂ”ttu kokku. See juhtub tihti siis, kui töötajad on kĂ”ik arvutanud ja saadavad tulemuse draiverile. Me tegime selle parameetri suuremaks. Vaikimisi on see 1Gb, meie tegime - 3.
spark.driver.maxResultSize=3072Ja viimane, magustoiduna. Kuidas uuendada Spark versioonile 2.1 HortonWorks'i jaotuses - HDP 2.5.3.0. See versioon HDP sisaldab eelinstallitud versiooni 2.0, kuid kord otsustasime, et Spark areneb ĂŒsna aktiivselt ning iga uus versioon parandab mĂ”ningaid vigu ja toob lisavĂ”imalusi, sealhulgas Python API jaoks, seega otsustasime, et uuendamine on vajalik.
Laadige alla versioon ametlikult veebilehelt Hadoop 2.7 jaoks. Pakkige lahti, kopeerige HDP kausta. Panime sĂŒmbollinkid nagu vaja. KĂ€ivitame - ei kĂ€ivitu. NĂ€itab vĂ€ga ebaselget viga.
java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfigGugeldades selgus, et Spark ei oota, kuni Hadoop end kokku parandab, ja otsustas kasutada uut jersey versiooni. Nad vaidlevad selle ĂŒle JIRA's. Lahenduseks oli - laadige alla . Kopeerige see SPARK_HOME'i jars kausta, tehke jĂ€lle zip ja laadige HDFS-i.
Selle vea vĂ€ltisime, kuid tekkis uus ja ĂŒsna ÀÀrmuslik.
org.apache.spark.SparkException: Yarn application has already ended! See vÔis olla tapetud vÔi ei suutnud kÀivituda rakenduse master.Sellega proovime kÀivitada versiooni 2.0 - kÔik on korras. Proovi arvata, milles probleem. Uurisime selle rakenduse logisid ja nÀgime midagi sellist:
/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jarKokkuvÔttes, mingil pÔhjusel hdp.version ei lahendunud. Gugeldades leidsime lahenduse. Peab minema Ambari seadistustesse YARNi ja lisama seal kohandatud yarn-site parameetri:
hdp.version=2.5.3.0-37See maagia aitas ning Spark startis. Testisime mitmeid meie jupyteri mÀrkmikke. KÔik töötab. Oleme valmis esimese tunniga Sparkis laupÀeval (juba homme)!
UPD. Tunnis ilmnes veel ĂŒks probleem. Mingil hetkel YARN lĂ”petas konteinerite vĂ€ljastamise Sparkile. YARN-is tuli parandada parameeter, mis oli vaikimisi 0.2:
yarn.scheduler.capacity.maximum-am-resource-percent=0.8 See, only 20% of the resources participated in resource allocation. After changing the parameters, YARN was restarted. The issue was resolved, and the other participants were also able to launch the Spark context.
Allikas: habr.com
