PĂ«rshĂ«ndetje, Habr! Ddje nĂ« , nga djemtĂ« e Rambler&Co, kishte shumĂ« pyetje nga pjesĂ«marrĂ«sit nĂ« lidhje me konfigurimin e kĂ«tij instrumenti. VendosĂ«m tĂ« ndanim pĂ«rvojĂ«n tonĂ« pas tij. Tema nuk Ă«shtĂ« e thjeshtĂ« â prandaj, ju lutemi ndihmoni duke ndarĂ« pĂ«rvojĂ«n tuaj nĂ« komente, ndoshta ne gjithashtu nuk kuptojmĂ« ndonjĂ« gjĂ« siç duhet dhe pĂ«rdorim.
NjĂ« hyrje e vogĂ«l â si e pĂ«rdorim Spark. Ne kemi njĂ« program tre-mujor , dhe gjatĂ« modulit tĂ« dytĂ«, pjesĂ«marrĂ«sit tanĂ« punojnĂ« me kĂ«tĂ« instrument. Si organizatorĂ«, detyra jonĂ« Ă«shtĂ« tĂ« pĂ«rgatisim njĂ« klaster pĂ«r pĂ«rdorim nĂ« kĂ«tĂ« rast.
Veçoria e pĂ«rdorimit tonĂ« Ă«shtĂ« se numri i njerĂ«zve qĂ« punojnĂ« nĂ« mĂ«nyrĂ« tĂ« njĂ«kohshme me Spark mund tĂ« jetĂ« i barabartĂ« me tĂ« gjithĂ« grupin. PĂ«r shembull, nĂ« seminar, kur tĂ« gjithĂ« provojnĂ« diçka nĂ« njĂ« kohĂ« dhe pĂ«rsĂ«ritin pas mĂ«suesit tonĂ«. Dhe kjo Ă«shtĂ« jo pak â deri nĂ« 40 njerĂ«z ndonjĂ«herĂ«. Ndoshta nuk ka shumĂ« kompani nĂ« botĂ« qĂ« pĂ«rballen me njĂ« skenar pĂ«rdorimi tĂ« tillĂ«.
Më tej do të flas se si dhe pse përzgjedhëm parametrat e caktuar të konfigurimit.
Të fillojmë nga fillimi. Spark ka 3 mundësi për të punuar në klaster: standalone, duke përdorur Mesos dhe duke përdorur YARN. Ne vendosëm të zgjidhim opsionin e tretë, sepse për ne ishte logjik.
spark.master=yarnMĂ« pas bĂ«het mĂ« interesante. Ădo njĂ« nga kĂ«to 3 variante tĂ« vendosjes ka 2 variante tĂ« shkarkimit: client dhe cluster. Duke u bazuar nĂ« dhe lidhjet e ndryshme nĂ« internet, mund tĂ« arrijmĂ« nĂ« pĂ«rfundimin se client Ă«shtĂ« i pĂ«rshtatshĂ«m pĂ«r punĂ« interaktive â pĂ«r shembull, pĂ«rmes jupyter notebook, ndĂ«rsa cluster Ă«shtĂ« mĂ« i pĂ«rshtatshĂ«m pĂ«r zgjidhje produksioni. NĂ« rastin tonĂ«, na interesonte puna interaktive, kĂ«shtu qĂ«:
spark.deploy-mode=clientNĂ« tĂ« vĂ«rtetĂ« nga ky moment, Spark do tĂ« funksionojĂ« nĂ« YARN, por kjo nuk ishte e mjaftueshme pĂ«r ne. Duke qenĂ« se kemi njĂ« program pĂ«r tĂ« dhĂ«na tĂ« mĂ«dha, pĂ«r disa pjesĂ«marrĂ«s ndonjĂ«herĂ« u mungonin burimet qĂ« fitoheshin nga ndarja e rregullt tĂ« tyre. Dhe kĂ«tu gjetĂ«m njĂ« gjĂ« interesante â alokimin dinamik tĂ« burimeve. NĂ« shprehje tĂ« thjeshtĂ«, nĂ«se keni njĂ« detyrĂ« tĂ« rĂ«ndĂ« dhe klasteri Ă«shtĂ« i lirĂ« (pĂ«r shembull, mĂ«ngjesin), atĂ«herĂ« me kĂ«tĂ« opsion, Spark mund t'ju ofrojĂ« burime shtesĂ«. Nevojat llogariten sipas njĂ« formule tĂ« zgjuar. Nuk do tĂ« hyjmĂ« nĂ« detaje â punon mirĂ«.
spark.dynamicAllocation.enabled=trueE vendosëm këtë parametër, dhe kur e filluam Spark, ai u ankuar dhe nuk nisi. E drejtë, sepse duhej të lexohej më me vëmendje. Atje thotë se për ta pasur gjithçka në rregull, duhet të aktivizoni një parametër shtesë.
spark.shuffle.service.enabled=truePse është e nevojshme? Kur puna jonë nuk kërkon më kaq shumë burime, Spark duhet t'i kthejë ato në rezervë të përgjithshme. Faza më e punës intensiven në çdo detyrë MapReduce është faza Shuffle. Ky parametër lejon që të ruhen të dhënat që krijohen në këtë fazë dhe për pasojë të çliron executorët. Një executor është një proces që llogarit gjithçka në punëtorë. Ai ka një numër të caktuar bërthama procesori dhe një sasi të caktuar memories.
E vendosĂ«m kĂ«tĂ« parametĂ«r. Gjithçka dukej se po funksiononte. U vĂ«rejt se pjesĂ«marrĂ«sit merrnin mĂ« shumĂ« burime kur u nevoiteshin. Por ndodhi njĂ« problem tjetĂ«r â nĂ« njĂ« moment, pjesĂ«marrĂ«sit e tjerĂ« u zgjuan dhe gjithashtu donin tĂ« pĂ«rdornin Spark, por e gjithĂ« kapaciteti ishte i zĂ«nĂ«, dhe ata ishin tĂ« pakĂ«naqur. Mund tĂ« kuptohen. Filluam tĂ« shikojmĂ« dokumentacionin. Atje doli se kishte disa parametra tĂ« tjerĂ«, me tĂ« cilĂ«t mund tĂ« ndikojmĂ« nĂ« proces. PĂ«r shembull, nĂ«se njĂ« executor Ă«shtĂ« nĂ« modalitetin e zgjedhjes â pas sa kohe mund t'i merret burimet?
spark.dynamicAllocation.executorIdleTimeout=120sNĂ« rastin tonĂ« â nĂ«se ekzekutorĂ«t tuaj nuk bĂ«jnĂ« asgjĂ« pĂ«r dy minuta, ju lutemi, kthejini ata nĂ« pool-in e pĂ«rgjithshĂ«m. Por as ky parametĂ«r nuk ishte gjithmonĂ« i mjaftueshĂ«m. Ishte e dukshme qĂ« njĂ« njeri nuk po bĂ«nte asgjĂ« pĂ«r njĂ« kohĂ« tĂ« gjatĂ«, por burimet nuk po liroheshin. U zbulua se kishte edhe njĂ« parametĂ«r tĂ« veçantĂ« â pas sa kohe tĂ« merreshin ekzekutorĂ«t qĂ« pĂ«rmbanin tĂ« dhĂ«na tĂ« ruajtura nĂ« cache. NĂ« default, ky parametĂ«r ishte vendosur â pafundĂ«si! Ne e ndryshuam atĂ«.
spark.dynamicAllocation.cachedExecutorIdleTimeout=600sPra, nĂ«se pĂ«r 5 minuta ekzekutorĂ«t tuaj nuk bĂ«jnĂ« asgjĂ«, ktheni ata nĂ« pool-in e pĂ«rgjithshĂ«m. NĂ« kĂ«tĂ« mĂ«nyrĂ«, shpejtĂ«sia e lirimit dhe ndarjes sĂ« burimeve pĂ«r njĂ« numĂ«r tĂ« madh pĂ«rdoruesish u bĂ« e kĂ«naqshme. Numri i pakĂ«naqĂ«sive u reduktua. Por ne vendosĂ«m tĂ« shkojmĂ« pĂ«rpara dhe tĂ« kufizojmĂ« numrin maksimal tĂ« ekzekutorĂ«ve pĂ«r njĂ« aplikacion â nĂ« thelb pĂ«r njĂ« pjesĂ«marrĂ«s nĂ« program.
spark.dynamicAllocation.maxExecutors=19Tani, sigurisht, kanĂ« dalĂ« tĂ« pakĂ«naqur nga ana tjetĂ«r â âklusteri Ă«shtĂ« i papunĂ«, dhe unĂ« kam vetĂ«m 19 ekzekutorĂ«â, por çfarĂ« mund tĂ« bĂ«jmĂ« â na nevojitet njĂ« balancim i duhur. TĂ« gjithĂ« tĂ« bĂ«hen tĂ« lumtur nuk do tĂ« jetĂ« e mundur.
Dhe njĂ« histori e vogĂ«l tjetĂ«r, e lidhur me specifikĂ«n e rastit tonĂ«. Disa njerĂ«z mbetĂ«n pas nĂ« njĂ« praktikĂ«, dhe pĂ«r njĂ« arsye, Spark nuk nisi. Ne shikojmĂ« numrin e burimeve tĂ« lira â duket se ka. Spark duhet tĂ« nisĂ«. FatmirĂ«sisht, nĂ« ato momente dokumentacioni tashmĂ« ishte regjistruar nĂ« nĂ«nndĂ«rgjegje, dhe ne e kujtuam se kur Spark nis, ai kĂ«rkon njĂ« port pĂ«r tĂ« nisur. NĂ«se porta e parĂ« nga diapazoni Ă«shtĂ« e zĂ«nĂ«, ai kalon nĂ« portin tjetĂ«r nĂ« rend. NĂ«se ai Ă«shtĂ« i lirĂ«, ai e merr. Dhe ka njĂ« parametr qĂ« tregon numrin maksimal tĂ« pĂ«rpjekjeve pĂ«r kĂ«tĂ«. NĂ« default â Ă«shtĂ« 16. Numri Ă«shtĂ« mĂ« i vogĂ«l se njerĂ«zit nĂ« grupin tonĂ« nĂ« seancĂ«. Si rezultat, pas 16 pĂ«rpjekjesh, Spark dorĂ«zonte kĂ«tĂ« punĂ« dhe thoshte se nuk mund tĂ« nisi. Ne e kemi rregulluar kĂ«tĂ« parametr.
spark.port.maxRetries=50Më pas do t'ju tregoj për disa konfigurime, të cilat nuk janë shumë të lidhura me specifikën e rastit tonë.
Për një nisje më të shpejtë të Spark, ka një rekomandim që folderin jars, që ndodhet në direktorinë shtëpiake SPARK_HOME, ta kompresoni dhe ta vendosni në HDFS. Atëherë ai nuk do të humbasë kohë në shkarkimin e këtyre jar-ëve në punëtorë.
spark.yarn.archive=hdfs:///tmp/spark-archive.zipPo gjithashtu, për një punë më të shpejtë, rekomandohet të përdoret kryo si serializues. Ai është më i optimizuar se ai që është nga parazgjedhja.
spark.serializer=org.apache.spark.serializer.KryoSerializerDhe ka njĂ« problem tĂ« vjetĂ«r me Spark, se shpesh dĂ«shton pĂ«r shkak tĂ« memory. Kjo ndodh shpesh nĂ« momentin kur punĂ«torĂ«t kanĂ« pĂ«rfunduar gjithçka dhe dĂ«rgojnĂ« rezultatin nĂ« drejtues. Ne e kemi rritur kĂ«tĂ« parametĂ«r. Nga parazgjedhja Ă«shtĂ« 1GB, ne bĂ«mĂ« â 3.
spark.driver.maxResultSize=3072Dhe e fundit, si njĂ« Ă«mbĂ«lsirĂ«. Si tĂ« pĂ«rmirĂ«soni Spark nĂ« versionin 2.1 mbi distribucionin HortonWorks â HDP 2.5.3.0. Ky version i HDP pĂ«rmban versionin e parainstaluar 2.0, por njĂ« herĂ« vendosĂ«m se Spark po zhvillohet mjaft aktivisht, dhe çdo version i ri rregullon disa gabime dhe gjithashtu ofron mundĂ«si tĂ« tjera, pĂ«rfshirĂ« pĂ«r API-nĂ« python, prandaj vendosĂ«m se duhet tĂ« bĂ«nim azhurnim.
Kemi shkarkuar versionin nga faqja zyrtare pĂ«r Hadoop 2.7. E kemi zgjidhur, e kemi futur nĂ« dosjen me HDP. VendosĂ«m lidhjet siç duhet. E nisim â nuk fillon. Shkruan njĂ« gabim shumĂ« tĂ« paqartĂ«.
java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfigPas kĂ«rkimeve nĂ« Google, zbuluam se Spark vendosi tĂ« mos presĂ« derisa Hadoop tĂ« ndihmojĂ« dhe vendosi tĂ« pĂ«rdorĂ« versionin e ri tĂ« jersey. Ata vetĂ« diskutuan pĂ«r kĂ«tĂ« temĂ« nĂ« JIRA. Ăelja ishte â shkarko . E vendosĂ«m kĂ«tĂ« nĂ« dosjen jars nĂ« SPARK_HOME, pĂ«rsĂ«ri bĂ«mĂ« zip dhe e dĂ«rguam nĂ« HDFS.
Këtë gabim e kaluam, por u shfaq një e re dhe mjaft e paqartë.
org.apache.spark.SparkException: Yarn application has already ended! Mund tĂ« jetĂ« mbyllur ose nuk ka mundur tĂ« nisĂ« master-in e aplikacionit.NdĂ«rkohĂ«, provojmĂ« tĂ« nisim versionin 2.0 â gjithçka Ă«shtĂ« nĂ« rregull. E kupto si duket. Ne u ngjitĂ«m nĂ« logjet e kĂ«tij aplikacioni dhe pashĂ« diçka tĂ« tillĂ«:
/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jarNë përgjithësi, për disa arsye hdp.version nuk u zgjidh. Pas kërkimeve, gjetëm zgjidhjen. Duhet të hyjmë në Ambari në cilësimet YARN dhe të shtojmë atje parametrin në yarn-site-un e personalizuar:
hdp.version=2.5.3.0-37Kjo magji ndihmoi, dhe Spark fluturoi. E provuam disa nga jupyter-notebook-et tona. Gjithçka funksionon. Jemi gati për mbledhjen e parë për Spark të shtunën (tashmë nesër)!
UPD. Në mbledhje doli një problem tjetër. Në një moment YARN ndaloi së dhëni kontejnerë për Spark. Në YARN ne patëm nevojë të rregullojmë parametrin, i cili për defolt ishte 0.2:
yarn.scheduler.capacity.maximum-am-resource-percent=0.8 Pra t'u thënë, vetëm 20% e burimeve ishin të angazhuara në shpërndarjen e burimeve. Duke ndryshuar parametrat, ne riluam YARN. Problemi u zgjidh dhe pjesëmarrësit e tjerë gjithashtu mundën të nisnin kontekstin e spark.
Burimi: habr.com
