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

Setzt e Commentaire