Stilla Spark á YARN

Habr, halló! Í gær á fundur tileinkaður Apache Spark, frá strákunum frá Rambler&Co, það var töluvert mikið af spurningum frá þátttakendum sem tengdust uppsetningu á þessu tóli. Við ákváðum að feta í fótspor hans og deila reynslu okkar. Efnið er ekki auðvelt - svo við bjóðum þér að deila reynslu þinni í athugasemdum, kannski skiljum við og notum eitthvað rangt.

Smá kynning á því hvernig við notum Spark. Við erum með þriggja mánaða prógramm „Big Data sérfræðingur“, og alla aðra einingu vinna þátttakendur okkar á þessu hljóðfæri. Í samræmi við það er verkefni okkar sem skipuleggjendur að undirbúa klasann til notkunar innan slíks máls.

Það sem er sérkennilegt við notkun okkar er að fjöldi fólks sem vinnur á Spark samtímis getur verið jafn og fyrir allan hópinn. Til dæmis á málstofu, þegar allir prófa eitthvað á sama tíma og endurtaka eftir kennarann ​​okkar. Og þetta er ekki mikið - stundum allt að 40 manns. Það eru líklega ekki mörg fyrirtæki í heiminum sem standa frammi fyrir slíkri notkun.

Næst mun ég segja þér hvernig og hvers vegna við völdum ákveðnar stillingarfæribreytur.

Við skulum byrja alveg frá byrjun. Spark hefur 3 valkosti til að keyra á þyrping: sjálfstæður, með Mesos og með því að nota YARN. Við ákváðum að velja þriðja valmöguleikann vegna þess að það var skynsamlegt fyrir okkur. Við erum nú þegar með hadoop þyrping. Þátttakendur okkar eru nú þegar vel kunnugir arkitektúr þess. Notum GARN.

spark.master=yarn

Enn meira áhugavert. Hver af þessum 3 dreifingarvalkostum hefur 2 dreifingarvalkosti: biðlara og klasa. Byggt skjöl og ýmsir tenglar á Netinu, getum við ályktað að viðskiptavinur sé hentugur fyrir gagnvirka vinnu - til dæmis í gegnum Jupyter minnisbók, og þyrping hentar betur fyrir framleiðslulausnir. Í okkar tilviki höfðum við áhuga á gagnvirku starfi, þess vegna:

spark.deploy-mode=client

Almennt séð, héðan í frá mun Spark einhvern veginn virka á YARN, en þetta var ekki nóg fyrir okkur. Þar sem við erum með forrit um stór gögn höfðu þátttakendur stundum ekki nóg af því sem fékkst innan ramma jafnrar niðurskurðar á auðlindum. Og svo fundum við áhugavert - kraftmikla auðlindaúthlutun. Í stuttu máli, málið er þetta: Ef þú átt erfitt verkefni og þyrpingin er ókeypis (til dæmis á morgnana), þá getur notkun þessa valkosts Spark gefið þér fleiri úrræði. Þar er nauðsyn reiknuð eftir slægri formúlu. Við munum ekki fara í smáatriði - það virkar vel.

spark.dynamicAllocation.enabled=true

Við stilltum þessa breytu og við ræsingu hrundi Spark og byrjaði ekki. Það er rétt, því ég varð að lesa hana skjöl vandlega. Þar kemur fram að til þess að allt sé í lagi þarftu líka að virkja aukafæribreytu.

spark.shuffle.service.enabled=true

Hvers vegna er þörf á því? Þegar starf okkar krefst ekki lengur svo mikils fjármagns ætti Spark að skila þeim í sameiginlega laugina. Tímafrekasta stigið í nánast hvaða MapReduce verkefni sem er er Shuffle stigið. Þessi færibreyta gerir þér kleift að vista gögnin sem eru búin til á þessu stigi og sleppa framkvæmdarstjóranum í samræmi við það. Og framkvæmdarstjórinn er ferlið sem reiknar allt á starfsmanninn. Hann hefur ákveðinn fjölda örgjörvakjarna og ákveðið minni.

Þessari breytu hefur verið bætt við. Allt virtist virka. Það varð áberandi að þátttakendur fengu í raun meira úrræði þegar þeir þurftu á þeim að halda. En annað vandamál kom upp - á einhverjum tímapunkti vöknuðu aðrir þátttakendur og vildu líka nota Spark, en þar var allt upptekið og þeir voru óánægðir. Þau má skilja. Við byrjuðum að skoða skjölin. Það kom í ljós að það eru ýmsar aðrar breytur sem hægt er að nota til að hafa áhrif á ferlið. Til dæmis, ef framkvæmdarstjórinn er í biðham, eftir hvaða tíma er hægt að taka fjármagn úr honum?

spark.dynamicAllocation.executorIdleTimeout=120s

Í okkar tilviki, ef framkvæmdastjórar þínir gera ekkert í tvær mínútur, vinsamlegast skilaðu þeim í sameiginlega laugina. En þessi breytu var ekki alltaf nóg. Ljóst var að maðurinn hafði ekki verið að gera neitt í langan tíma og úrræði voru ekki að losa. Það kom í ljós að það er líka sérstök breytu - eftir hvaða tíma á að velja executors sem innihalda skyndiminni gögn. Sjálfgefið var að þessi færibreyta var óendanlegur! Við leiðréttum það.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Það er að segja, ef framkvæmdastjórar þínir gera ekkert í 5 mínútur, gefðu þeim þá í sameiginlega laugina. Í þessum ham er hraðinn við að gefa út og gefa út auðlindir fyrir mikinn fjölda notenda orðinn þokkalegur. Óánægjan hefur minnkað. En við ákváðum að ganga lengra og takmarka hámarksfjölda framkvæmdastjóra á hverja umsókn - í meginatriðum á hvern þátttakanda í forritinu.

spark.dynamicAllocation.maxExecutors=19

Núna er auðvitað óánægt fólk hinum megin - „þyrpingin er aðgerðalaus og ég er bara með 19 framkvæmdastjóra,“ en hvað geturðu gert? Við þurfum einhvers konar rétt jafnvægi. Það er ekki hægt að gera alla ánægða.

Og enn ein lítil saga sem tengist einstökum málum okkar. Einhvern veginn komu nokkrir of seint í verklega kennslu og einhverra hluta vegna byrjaði Spark ekki fyrir þá. Við skoðuðum magn ókeypis auðlinda - það virðist vera til staðar. Neisti ætti að byrja. Sem betur fer hafði skjölunum þegar verið bætt við undirberkina einhvers staðar á þeim tíma og við minntumst þess að þegar Spark var hleypt af stokkunum leitar Spark að höfn til að byrja á. Ef fyrsta höfnin á svæðinu er upptekin færist hún yfir í þá næstu í röð. Ef það er ókeypis, fangar það. Og það er færibreyta sem gefur til kynna hámarksfjölda tilrauna fyrir þetta. Sjálfgefið er 16. Fjöldi er færri en fjöldi fólks í hópnum okkar í bekknum. Í samræmi við það, eftir 16 tilraunir, gafst Spark upp og sagði að ég gæti ekki byrjað. Við höfum leiðrétt þessa breytu.

spark.port.maxRetries=50

Næst mun ég segja þér frá nokkrum stillingum sem eru ekki mjög tengdar einstökum málum okkar.

Til að ræsa Spark hraðar er mælt með því að setja jars möppuna í geymslu í SPARK_HOME heimamöppunni og setja hana á HDFS. Þá mun hann ekki eyða tíma í að hlaða þessum jarnikum eftir verkamönnum.

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

Einnig er mælt með því að nota kryo sem serializer fyrir hraðari notkun. Það er meira bjartsýni en sjálfgefið.

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

Og það er líka langvarandi vandamál með Spark að það hrynur oft úr minni. Oft gerist þetta á því augnabliki þegar starfsmenn eru búnir að reikna allt út og senda útkomuna til bílstjórans. Við gerðum þessa færibreytu stærri fyrir okkur sjálf. Sjálfgefið er það 1GB, við gerðum það 3.

spark.driver.maxResultSize=3072

Og að lokum, sem eftirréttur. Hvernig á að uppfæra Spark í útgáfu 2.1 á HortonWorks dreifingu - HDP 2.5.3.0. Þessi útgáfa af HDP inniheldur foruppsetta útgáfu 2.0, en við ákváðum einu sinni sjálf að Spark væri að þróa nokkuð virkan, og hver ný útgáfa lagar einhverjar villur auk þess að bjóða upp á viðbótareiginleika, þar á meðal fyrir Python API, svo við ákváðum hvað þarf að vera gert er uppfærsla.

Hlaðið niður útgáfunni af opinberu vefsíðunni fyrir Hadoop 2.7. Pakkaði því upp og setti það í HDP möppuna. Við settum upp tákntengla eftir þörfum. Við ræsum það - það byrjar ekki. Skrifar mjög undarlega villu.

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

Eftir að hafa googlað komumst við að því að Spark ákvað að bíða ekki þangað til Hadoop fæddist og ákváðum að nota nýju útgáfuna af jersey. Þeir rífast sjálfir um þetta efni í JIRA. Lausnin var að hlaða niður Jersey útgáfa 1.17.1. Settu þetta í jars möppuna í SPARK_HOME, zipðu það aftur og hladdu því upp á HDFS.

Við komumst í kringum þessa villu en ný og frekar straumlínulöguð kom upp.

org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master

Á sama tíma reynum við að keyra útgáfu 2.0 - allt er í lagi. Reyndu að giska á hvað er í gangi. Við skoðuðum annála þessa forrits og sáum eitthvað á þessa leið:

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

Almennt séð leystist hdp.version ekki af einhverjum ástæðum. Eftir að hafa googlað fundum við lausn. Þú þarft að fara í YARN stillingar í Ambari og bæta við færibreytu þar á sérsniðna garnsíðu:

hdp.version=2.5.3.0-37

Þessi galdur hjálpaði til og Spark tók af skarið. Við prófuðum nokkrar af Jupyter fartölvunum okkar. Allt er að virka. Við erum klár í fyrstu Spark kennsluna á laugardaginn (á morgun)!

DUP. Í kennslustundinni kom annað vandamál í ljós. Á einhverjum tímapunkti hætti YARN að útvega gáma fyrir Spark. Í YARN var nauðsynlegt að leiðrétta færibreytuna, sem sjálfgefið var 0.2:

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

Það er að segja að aðeins 20% auðlinda tóku þátt í dreifingu auðlinda. Eftir að hafa breytt breytum, endurhlaðim við YARN. Vandamálið var leyst og hinir þátttakendurnir gátu líka keyrt neistasamhengi.

Heimild: www.habr.com

Bæta við athugasemd