Veavakirina Spark li ser YARN

Habr, silav! Duh li ser hevdîtin ku ji Apache Spark re hatî veqetandin, ji xortên Rambler&Co, gelek pirs ji beşdaran re têkildar bi mîhengkirina vê amûrê hebûn. Me biryar da ku em li ser şopa wî bimeşin û ezmûna xwe parve bikin. Mijar ne hêsan e - ji ber vê yekê em we vedixwînin ku hûn di şîroveyan de ezmûna xwe parve bikin, dibe ku em jî tiştek xelet fam bikin û bikar bînin.

Destpêkek piçûk ka em çawa Spark bikar tînin. Bernameyek me ya sê mehan heye "Pisporê Daneyên Mezin", û li seranserê modula duyemîn beşdarên me li ser vê amûrê dixebitin. Li gorî vê yekê, erka me wekî organîzator ew e ku em komê ji bo karanîna di rewşek weha de amade bikin.

Taybetmendiya karanîna me ev e ku hejmara kesên ku di heman demê de li ser Spark dixebitin dikare bi tevahî komê re wekhev be. Mînakî, di semînerekê de, dema ku her kes di heman demê de tiştek diceribîne û piştî mamosteyê me dubare dike. Û ev ne pir e - carinan heya 40 kesan. Di cîhanê de belkî ne pir pargîdaniyên ku bi karanîna weha re rû bi rû dimînin hene.

Dûv re, ez ê ji we re vebêjim ka çawa û çima me hin parametreyên mîhengê hilbijartiye.

Ka em ji destpêkê ve dest pê bikin. Spark xwedan 3 vebijark e ku li ser komekê bixebite: serbixwe, karanîna Mesos, û karanîna YARN. Me biryar da ku vebijarka sêyemîn hilbijêrin ji ber ku ew ji me re watedar bû. Jixwe komeke me ya hadoop heye. Beşdarên me jixwe mîmariya wê baş dizanin. Werin em YARN bikar bînin.

spark.master=yarn

Zêdetir balkêştir. Her yek ji van 3 vebijarkên bicîhkirinê 2 vebijarkên bicîhkirinê hene: xerîdar û kom. Bingehîn belgekirin û girêdanên cihêreng ên li ser Înternetê, em dikarin encam bidin ku xerîdar ji bo xebata înteraktîf maqûl e - mînakî, bi navgîniya notebooka jupyter, û kom ji bo çareseriyên hilberînê maqûltir e. Di doza me de, em bi xebata înteraktîf re eleqedar bûn, ji ber vê yekê:

spark.deploy-mode=client

Bi gelemperî, ji niha û pê ve Spark dê bi rengekî li ser YARN bixebite, lê ev ji me re têrê nekir. Ji ber ku bernameyek me di derbarê daneyên mezin de heye, carinan beşdaran têra wan tiştên ku di çarçoveya perçekirina çavkaniyan de hatine bidestxistin têr nedibûn. Û paşê me tiştek balkêş dît - dabeşkirina çavkaniyê ya dînamîk. Bi kurtasî, xal ev e: heke we karek dijwar hebe û komik belaş be (mînak, sibehê), wê hingê bi karanîna vê vebijarkê Spark dikare çavkaniyên zêde bide we. Li wir hewcedarî li gorî formulek hîle tê hesibandin. Em ê nekevin hûrguliyan - ew baş dixebite.

spark.dynamicAllocation.enabled=true

Me vê pîvanê destnîşan kir, û bi destpêkirinê Spark têk çû û dest pê nekir. Rast e, ji ber ku ez neçar bûm ku wê bixwînim belgekirin bêtir bi baldarî. Ew diyar dike ku ji bo ku her tişt baş be, hûn hewce ne ku pîvanek din jî çalak bikin.

spark.shuffle.service.enabled=true

Çima hewce ye? Gava ku karê me êdî hewqas çavkaniyan hewce nake, divê Spark wan vegerîne hewza hevpar. Di hema hema her karûbarê MapReduce de qonaxa herî demdirêj qonaxa Shuffle ye. Ev parametre dihêle hûn daneyên ku di vê qonaxê de têne hilberandin hilînin û li gorî vê yekê îcrakar azad bikin. Û îcrakar pêvajoyek e ku her tiştî li ser karker hesab dike. Ew xwediyê hejmareke diyarkirî ya navokên pêvajoyê û hejmarek bîranîn heye.

Ev parametre hatiye zêdekirin. Her tişt xuya bû. Balkêş bû ku beşdaran dema ku hewcedariya wan bi wan re hebû bi rastî bêtir çavkaniyan hatin dayîn. Lê pirsgirêkek din derket - di demekê de beşdarên din şiyar bûn û di heman demê de xwestin Spark bikar bînin, lê her tişt li wir mijûl bû, û ew nerazî bûn. Ew dikarin bêne fêm kirin. Me dest bi lêgerîna belgeyan kir. Derket holê ku hejmarek pîvanên din hene ku dikarin werin bikar anîn da ku bandorê li pêvajoyê bikin. Mînakî, heke îcrakar di moda standby de be, piştî çend demjimêran dikare jêderan jê were girtin?

spark.dynamicAllocation.executorIdleTimeout=120s

Di rewşa me de, heke îcrakarên we du deqeyan tiştek nekin, wê hingê ji kerema xwe wan vegerînin hewza hevpar. Lê ev parametre her tim têrê nekir. Eşkere bû ku mirov demek dirêj tiştek nekiribû û çavkanî jî nehatin berdan. Derket holê ku di heman demê de pîvanek taybetî jî heye - piştî çi wextê îcrakar ku daneyên cached vedihewîne hilbijêrin. Bi xwerû, ev parametre bêdawî bû! Me ew rast kir.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Ango ger îcrakarên we 5 deqîqeyan tiştekî nekin, bidin hewza hevpar. Di vê modê de, leza berdan û belavkirina çavkaniyan ji bo hejmareke mezin ji bikarhêneran maqûl bûye. Rêjeya nerazîbûnê kêm bûye. Lê me biryar da ku em pêşde biçin û hejmara herî zêde ya îcrakar li ser serîlêdanê sînordar bikin - bi bingehîn ji bo beşdarê bernameyê.

spark.dynamicAllocation.maxExecutors=19

Naha, bê guman, li aliyê din mirovên nerazî hene - "kom bêkar e, û tenê 19 îcrakar min hene," lê hûn dikarin çi bikin? Ji me re hevsengiyek rast lazim e. Hûn nikarin her kesî kêfxweş bikin.

Û çîrokek piçûktir a ku bi taybetmendiyên doza me ve girêdayî ye. Bi rengekî, çend kes ji bo dersek pratîk dereng bûn, û ji ber hin sedeman Spark ji wan re dest pê nekir. Me li mîqdara çavkaniyên belaş mêze kir - ew li wir xuya dike. Divê Spark dest pê bike. Xweşbextane, di wê demê de belge ji berê ve li cîhek binecortexê hatibû zêdekirin, û me hate bîra me ku gava hate destpêkirin, Spark li portek ku dest pê bike digere. Ger porta yekem a di rêzê de mijûl be, ew bi rêzê diçe ya din. Ger azad be, digre. Û pîvanek heye ku ji bo vê yekê herî zêde hewldan destnîşan dike. The default 16 e. Hejmar ji hejmara kesên di koma me de di polê de kêmtir e. Li gorî vê yekê, piştî 16 hewldanan, Spark dev jê berda û got ku ez nikarim dest pê bikim. Me ev parametre rast kir.

spark.port.maxRetries=50

Dûv re ez ê ji we re li ser hin mîhengên ku ne pir bi taybetîyên doza me re têkildar in vebêjim.

Ji bo ku Spark zûtir dest pê bike, tê pêşniyar kirin ku peldanka jars a ku di pelrêça malê ya SPARK_HOME de ye arşîv bike û wê li ser HDFS-ê bixe. Wê demê ew ê wextê xwe bi barkirina van jarnikan ji hêla karkeran ve winda neke.

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

Di heman demê de tê pêşniyar kirin ku ji bo xebitandina zûtir kryo wekî serialîzator bikar bînin. Ew ji ya xwerû xweştir e.

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

Û di heman demê de pirsgirêkek demdirêj bi Spark re jî heye ku ew pir caran ji bîrê diqelişe. Pir caran ev yek di dema ku karkeran her tişt hesab kirine û encam ji ajokar re dişînin. Me ev parametre ji bo xwe mezintir kir. Bi xwerû, ew 1 GB ye, me ew kir 3.

spark.driver.maxResultSize=3072

Û di dawiyê de, wekî şîrînek. Meriv çawa Spark bi guhertoya 2.1-ê li ser belavkirina HortonWorks nûve dike - HDP 2.5.3.0. Di vê guhertoya HDP'ê de guhertoyek 2.0-ya pêş-sazkirî heye, lê me carekê ji xwe re biryar da ku Spark bi rengek çalak pêş dikeve, û her guhertoyek nû hin xeletiyan rast dike û taybetmendiyên din jî peyda dike, di nav de ji bo API-ya python, ji ber vê yekê me biryar da ku çi hewce dike. were kirin nûvekirinek e.

Guhertoya ji malpera fermî ya Hadoop 2.7 dakêşand. Zirav vekin û têxin peldanka HDP'ê. Me li gorî hewcedariyê symlinks saz kir. Em dest pê dikin - ew dest pê nake. Çewtiyeke pir ecêb dinivîse.

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

Piştî googlêkirinê, me fêr kir ku Spark biryar da ku li bendê nemîne heya ku Hadoop ji dayik bibe, û biryar da ku guhertoya nû ya jersey bikar bîne. Ew bi xwe di JIRA de li ser vê mijarê bi hev re nîqaşan dikin. Çareserî daxistin bû jersey version 1.17.1. Vê di peldanka jars a li SPARK_HOME de bi cîh bikin, wê dîsa zip bikin û li HDFS bar bikin.

Me li dora vê xeletiyê geriya, lê xeletiyek nû û bi rêkûpêk derket holê.

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

Di heman demê de, em hewl didin ku guhertoya 2.0 bimeşînin - her tişt baş e. Biceribînin ku texmîn bikin ka çi diqewime. Me li têketinên vê serîlêdanê nihêrt û tiştek weha dît:

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

Bi gelemperî, ji ber hin sedeman hdp.version çareser nebû. Piştî googlê me çareseriyek dît. Pêdivî ye ku hûn biçin mîhengên YARN-ê yên li Ambari û li wir parametreyek li malpera yarn-a xwerû zêde bikin:

hdp.version=2.5.3.0-37

Vê sêrbaziyê alîkarî kir, û Spark rabû. Me çend laptopên xwe yên jupyter ceriband. Her tişt dixebite. Em ji bo yekem dersa Spark roja Şemiyê (sibê) amade ne!

DUP. Di dersê de pirsgirêkek din derket holê. Di demekê de, YARN peydakirina konteyneran ji bo Spark rawestand. Di YARN de pêdivî bû ku pîvana ku ji hêla xwerû 0.2 bû were rast kirin:

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

Ango tenê %20ê çavkaniyan beşdarî dabeşkirina çavkaniyan bûne. Piştî guhertina pîvanan, me YARN ji nû ve bar kir. Pirsgirêk çareser bû û beşdarên mayî jî karîbûn çarçoweya çirûskê bimeşînin.

Source: www.habr.com

Add a comment