Spark op YARN konfiguréieren

Habr, Moien! GĂ«schter op Meetup gewidmet dem Apache Spark, vun de Leit vu Rambler&Co, et waren zimlech vill Froen vun de Participanten am Zesummenhang mat der Konfiguratioun vun dĂ«sem Tool. Mir hu beschloss a senge SchrĂ«tt ze goen an eis Erfahrungen ze deelen. D'Thema ass net einfach - also invitĂ©ieren mir Iech Är Erfahrung an de Kommentaren ze deelen, vlĂ€icht verstinn mir och eppes falsch.

Eng kleng Aféierung fir wéi mir Spark benotzen. Mir hunn en drÀi Méint Programm "Big Data Spezialist", a wÀhrend dem zweete Modul schaffen eis Participanten un dësem Instrument. Deementspriechend ass et eis Aufgab, als Organisateuren, de Cluster an esou engem Fall virzebereeden.

D'Besonderheet vun eiser Notzung ass datt d'Zuel vu Leit déi glÀichzÀiteg um Spark schaffen ka mat der ganzer Grupp glÀich sinn. Zum Beispill, op engem Seminaire, wann jiddereen eppes glÀichzÀiteg probéiert an no eisem Enseignant widderhuelen. An dat ass net vill - heiansdo bis zu 40 Leit. Et gi wahrscheinlech net vill Firmen op der Welt, déi esou e Gebrauchsfall konfrontéieren.

Als nÀchst wÀert ech Iech soen wéi a firwat mir verschidde Configuratiounsparameter ausgewielt hunn.

Loosst eis vun Ufank un ufÀnken. Spark huet 3 Optiounen fir op engem Cluster ze lafen: Standalone, Mesos benotzen, a YARN benotzen. Mir hunn decidéiert déi drëtt Optioun ze wielen, well et eis Sënn gemaach huet. Mir hu schonn en Hadoop-Cluster. Eis Participanten kennen hir Architektur scho gutt. Loosst eis YARN benotzen.

spark.master=yarn

Weider méi interessant. Jiddereng vun dësen 3 Deployment Optiounen huet 2 Deployment Optiounen: Client a Cluster. Baséiert Dokumentatioun a verschidde Linken um Internet, kënne mir schléissen, datt Client fir interaktiv Aarbecht gëeegent ass - zum Beispill, duerch Jupyter Notizblock, a StÀrekoup ass méi gëeegent fir Produktioun Léisungen. An eisem Fall ware mir un interaktiv Aarbecht interesséiert, dofir:

spark.deploy-mode=client

Am Allgemengen wÀert Spark vun elo un iergendwéi op YARN funktionnéieren, awer dëst war net genuch fir eis. Well mir e Programm iwwer Big Data hunn, hunn d'Participanten heiansdo net genuch vun deem wat am Kader vun enger glÀichméisseger Ausschneiden vun de Ressourcen kritt gouf. An dann hu mir eng interessant Saach fonnt - dynamesch Ressource Allocatioun. Kuerz gesot, de Punkt ass dëst: wann Dir eng schwiereg Aufgab hutt an de StÀrekoup gratis ass (zum Beispill moies), da benotzt dës Optioun Spark kann Iech zousÀtzlech Ressourcen ginn. D'Noutwennegkeet gëtt do no enger lëschter Formel berechent. Mir ginn net an Detailer - et funktionnéiert gutt.

spark.dynamicAllocation.enabled=true

Mir setzen dëse Parameter, a beim Start ass de Spark erofgefall an huet net ugefaang. Dat stëmmt, well ech hu misse liesen Dokumentatioun méi virsiichteg. Et seet datt fir datt alles an der Rei ass, musst Dir och en zousÀtzleche Parameter aktivéieren.

spark.shuffle.service.enabled=true

Firwat ass et néideg? Wann eis Aarbecht net méi esou vill Ressourcen erfuerdert, soll Spark se an de gemeinsame Pool zréckginn. Déi ZÀitopwendegst Etapp a bal all MapReduce Aufgab ass d'Shuffle Etapp. Dëse Parameter erlaabt Iech d'Donnéeën ze spÀicheren, déi an dëser Etapp generéiert ginn an d'Exekutoren entspriechend befreien. An den Exekutor ass de Prozess deen alles op den Aarbechter berechent. Et huet eng gewëssen Zuel vun Prozessor KÀr an eng gewëssen Quantitéit vun Erënnerung.

Dëse Parameter gouf derbÀigesat. Alles schéngt ze schaffen. Et gouf bemierkenswÀert datt d'Participanten tatsÀchlech méi Ressourcen kréien wann se se gebraucht hunn. Awer en anere Problem ass entstanen - iergendwann sinn aner Participanten erwÀcht a wollten och Spark benotzen, awer alles war do beschÀftegt, a si waren onglécklech. Si kënne verstane ginn. Mir hunn ugefaang d'Dokumentatioun ze kucken. Et huet sech erausgestallt datt et eng Rei aner Parameteren ass, déi benotzt kënne fir de Prozess ze beaflossen. Zum Beispill, wann den Exekutor am Standby-Modus ass, no wéi enger ZÀit kënne Ressourcen dovun ofgeholl ginn?

spark.dynamicAllocation.executorIdleTimeout=120s

An eisem Fall, wann Är Exekutoren fir zwou Minutten nĂ€ischt maachen, da gitt se zrĂ©ck an de gemeinsame Pool. MĂ€ dĂ«se Parameter war net Ă«mmer genuch. Et war kloer, datt d'Persoun fir eng laang ZĂ€it nĂ€ischt gemaach huet, a Ressourcen net frĂ€i ginn. Et huet sech erausgestallt datt et och e spezielle Parameter ass - no wĂ©i enger ZĂ€it fir Exekutoren ze wielen dĂ©i cachedaten enthalen. Par dĂ©faut war dĂ«se Parameter onendlech! Mir hunn et korrigĂ©iert.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Dat ass, wann Är executors nĂ€ischt maachen fir 5 Minutten, ginn hinnen op de gemeinsame Pool. An dĂ«sem Modus ass d'Geschwindegkeet vun der VerĂ«ffentlechung an der VerĂ«ffentlechung vu Ressourcen fir eng grouss Zuel vu Benotzer anstĂ€nneg ginn. D'QuantitĂ©it vun Onzefriddenheet ass erofgaang. Awer mir hu beschloss mĂ©i wĂ€it ze goen an dĂ©i maximal Unzuel vun Exekutoren pro Applikatioun ze limitĂ©ieren - am Wesentlechen pro Programm Participant.

spark.dynamicAllocation.maxExecutors=19

Elo ginn et natierlech onzefridden Leit op der anerer SÀit - "de StÀrekoup ass Idle, an ech hunn nëmmen 19 Exekutoren", mÀ wat kënnt Dir maachen? Mir brauchen eng Zort vun korrekt GlÀichgewiicht. Dir kënnt net jiddereen glécklech maachen.

An eng mĂ©i kleng Geschicht am Zesummenhang mat de SpezifizitĂ©ite vun eisem Fall. IergendwĂ©i waren e puer Leit ze spĂ©it fir eng praktesch Lektioun, an aus iergendengem Grond huet de Spark net fir si ugefaang. Mir hunn d'QuantitĂ©it u gratis Ressourcen gekuckt - et schĂ©ngt do ze sinn. Spark soll ufĂ€nken. GlĂ©cklecherweis, zu dĂ€r ZĂ€it war d'Dokumentatioun schonn iergendwou an d'Subcortex bĂ€igefĂŒĂŒgt, a mir hunn eis drun erĂ«nnert datt wann Dir Spark starten, sicht et no engem Hafen op deem se ufĂ€nken. Wann den Ă©ischten Hafen am BerĂ€ich beschĂ€ftegt ass, geet et an den nĂ€chsten an der Rei. Wann et gratis ass, erfaasst et. An et gĂ«tt e Parameter deen d'maximal Unzuel vun de Versuche fir dĂ«s uginn. De Standard ass 16. D'Zuel ass manner wĂ©i d'Zuel vun de Leit an eisem Grupp an der Klass. Deementspriechend, no 16 Versich, huet Spark opginn a gesot datt ech net kĂ©int ufĂ€nken. Mir hunn dĂ«s Astellung korrigĂ©iert.

spark.port.maxRetries=50

Als nÀchst wÀert ech Iech iwwer e puer Astellunge soen, déi net ganz mat de Spezifizitéite vun eisem Fall verbonne sinn.

Fir Spark méi séier unzefÀnken, ass et recommandéiert de Jars Dossier am SPARK_HOME Heemverzeichnis ze archivéieren an op HDFS ze setzen. Da wÀert hien keng ZÀit verschwenden dës Jarniks vun den Aarbechter ze lueden.

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

Et ass och recommandéiert Kryo als Serializer fir méi séier Operatioun ze benotzen. Et ass méi optimiséiert wéi de Standard.

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

An et gëtt och e laangjÀhrege Problem mam Spark datt et dacks aus der Erënnerung klappt. Dacks geschitt dat am Moment wou d'Aarbechter alles berechent hunn an d'Resultat un de Chauffer schécken. Mir hunn dëse Parameter méi grouss fir eis selwer gemaach. Par défaut ass et 1GB, mir hunn et 3 gemaach.

spark.driver.maxResultSize=3072

An zum Schluss, als Dessert. Wéi update Spark op Versioun 2.1 op HortonWorks Verdeelung - HDP 2.5.3.0. Dës Versioun vum HDP enthÀlt eng virinstalléiert Versioun 2.0, awer mir hu selwer decidéiert datt Spark ganz aktiv entwéckelt, an all nei Versioun fixéiert e puer Bugs plus bitt zousÀtzlech Funktiounen, och fir de Python API, also hu mir decidéiert , wat muss gemaach ginn ass en Update.

Eroflueden d'Versioun vun der offizieller WebsÀit fir Hadoop 2.7. Entpackt et a setzt se an den HDP Dossier. Mir hunn d'Symlinks installéiert wéi néideg. Mir starten et - et fÀnkt net un. Schreift e ganz komeschen Feeler.

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

Nom Googelen hu mir erausfonnt datt Spark decidéiert net ze waarden bis Hadoop gebuer gouf, an huet decidéiert déi nei Versioun vum Trikot ze benotzen. Si selwer streiden mateneen iwwer dëst Thema am JIRA. D'Léisung war eroflueden Jersey Versioun 1.17.1. Place dëst am Jars Dossier an SPARK_HOME, zip et erëm an lued et op HDFS.

Mir hunn dëse Feeler ëmkomm, awer en neien an zimlech streamlined entstanen.

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

Zur selwechter ZÀit probéieren mir d'Versioun 2.0 ze lafen - alles ass ok. Probéiert ze roden wat lass ass. Mir hunn an d'Logbicher vun dëser Applikatioun gekuckt an esou eppes gesinn:

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

Am Allgemengen, fir e puer Grënn hdp.version huet net geléist. Nom Googelen hu mir eng Léisung fonnt. Dir musst op d'YARN Astellungen am Ambari goen an e Parameter do op personaliséiert Garn-Site bÀidroen:

hdp.version=2.5.3.0-37

Dës Magie huet gehollef, an de Spark ass fortgaang. Mir hunn e puer vun eise Jupyter Laptops getest. Alles funktionnéiert. Mir si prett fir déi éischt Spark-Lektioun Samschdes (muer)!

DUP. WÀrend der Lektioun koum e weidere Problem un d'Liicht. Irgendwann huet YARN opgehalen Container fir Spark ze liwweren. Am YARN war et néideg de Parameter ze korrigéieren, deen par défaut 0.2 war:

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

Dat heescht, nëmmen 20% vun de Ressourcen hunn un der Verdeelung vun de Ressourcen deelgeholl. Nodeems mir d'Parameteren geÀnnert hunn, hu mir YARN nei gelueden. De Problem gouf geléist an de Rescht vun de Participanten konnten och Spark Kontext lafen.

Source: will.com

Kaaft zouverlĂ€sseg Hosting fir Site mat DDoS Schutz, VPS VDS Server đŸ”„ Kaaft zouverlĂ©issegt WebsĂ€ithosting mat DDoS-Schutz, VPS VDS Server | ProHoster