Habr, salutu! Ieri nantu
Una piccula introduzione à cumu usemu Spark. Avemu un prugramma di trè mesi
A peculiarità di u nostru usu hè chì u numeru di persone chì travaglianu simultaneamente in Spark pò esse uguali à u gruppu sanu. Per esempiu, in un seminariu, quandu tutti pruvate qualcosa à u stessu tempu è ripete dopu à u nostru maestru. È questu ùn hè micca assai - qualchì volta finu à 40 persone. Probabilmente ùn ci hè micca parechje cumpagnie in u mondu chì facenu un tali casu d'usu.
Dopu, vi dicu cumu è perchè avemu sceltu certi paràmetri di cunfigurazione.
Cuminciamu da u principiu. Spark hà 3 opzioni per eseguisce nantu à un cluster: standalone, usendu Mesos, è use YARN. Avemu decisu di sceglie a terza opzione perchè hà fattu sensu per noi. Avemu digià un cluster Hadoop. I nostri participanti sò digià cunnisciuti bè cù a so architettura. Avemu aduprà YARN.
spark.master=yarn
In più più interessante. Ognuna di queste 3 opzioni di implementazione hà 2 opzioni di implementazione: cliente è cluster. Basatu
spark.deploy-mode=client
In generale, da avà Spark hà da travaglià in qualchì modu nantu à YARN, ma questu ùn era micca abbastanza per noi. Siccomu avemu un prugramma di big data, qualchì volta i participanti ùn anu micca abbastanza di ciò chì hè stata ottenuta in u quadru di un tagliu ancu di risorse. È dopu avemu trovu una cosa interessante - l'assignazione dinamica di risorse. In corta, u puntu hè questu: se avete un compitu difficiule è u cluster hè liberu (per esempiu, in a matina), allora utilizendu sta opzione Spark pò dà risorse supplementari. A necessità hè calculata quì secondu una formula astuta. Ùn andemu micca in dettagli - funziona bè.
spark.dynamicAllocation.enabled=true
Avemu stabilitu stu paràmetru, è à l'iniziu Spark s'hè lampatu è ùn hà micca cuminciatu. Hè ghjustu, perchè aghju avutu à leghje
spark.shuffle.service.enabled=true
Perchè hè necessariu? Quandu u nostru travagliu ùn hà più bisognu di tante risorse, Spark deve rinvià à a piscina cumuna. U stadiu più tempu in quasi ogni compitu MapReduce hè u stadiu Shuffle. Stu paràmetru vi permette di salvà i dati chì sò generati in questa fase è liberate l'esecutori in cunseguenza. È l'esecutore hè u prucessu chì calcula tuttu nantu à u travagliu. Hà un certu nùmeru di core di processore è una certa quantità di memoria.
Stu paràmetru hè statu aghjuntu. Tuttu paria di travaglià. Hè diventatu notu chì i participanti sò stati dati più risorse quandu anu bisognu. Ma un altru prublema hè ghjuntu - à un certu puntu l'altri participanti si sveglianu è vulianu ancu aduprà Spark, ma tuttu era occupatu quì, è eranu infelici. Puderanu esse capitu. Avemu cuminciatu à guardà a documentazione. Ci hè stata chì ci sò parechje altre paràmetri chì ponu esse usatu per influenzà u prucessu. Per esempiu, se l'esecutore hè in modu standby, dopu à quale tempu pò esse pigliatu risorse da ellu?
spark.dynamicAllocation.executorIdleTimeout=120s
In u nostru casu, se i vostri esecutori ùn facenu nunda per dui minuti, allora tornanu à a piscina cumuna. Ma stu paràmetru ùn era micca sempre abbastanza. Era chjaru chì a persona ùn avia fattu nunda per un bellu pezzu, è e risorse ùn sò micca stati liberati. Hè risultatu chì ci hè ancu un paràmetru speciale - dopu à quale tempu per selezziunà esecutori chì cuntenenu dati in cache. Per automaticamente, stu paràmetru era infinitu ! Avemu currettu.
spark.dynamicAllocation.cachedExecutorIdleTimeout=600s
Questu hè, se i vostri esecutori ùn facenu nunda per 5 minuti, dà à a piscina cumuna. In questu modu, a velocità di liberazione è emissione di risorse per un gran numaru d'utilizatori hè diventata decente. A quantità di scontente hè diminuitu. Ma avemu decisu di andà più luntanu è limità u numeru massimu di esecutori per applicazione - essenzialmente per participant à u prugramma.
spark.dynamicAllocation.maxExecutors=19
Avà, sicuru, ci sò persone insatisfete da l'altra parte - "u cluster hè inattivu, è aghju solu esecutori 19", ma chì pudete fà? Avemu bisognu di qualchì equilibriu currettu. Ùn pudete micca fà felici à tutti.
È una altra piccula storia ligata à e specificità di u nostru casu. Qualchì manera, parechje persone eranu tardi per una lezione pratica, è per una certa ragione Spark ùn hà micca cuminciatu per elli. Avemu vistu a quantità di risorse gratuiti - pare chì ci hè. Spark deve principià. Fortunatamente, à quellu tempu, a documentazione era digià aghjuntu à a subcortica in un locu, è avemu ricurdatu chì quandu hè stata lanciata, Spark cerca un portu da quale principià. Se u primu portu in a gamma hè occupatu, si move à u prossimu in ordine. S'ellu hè liberu, cattura. È ci hè un paràmetru chì indica u numeru massimu di tentativi per questu. U predeterminatu hè 16. U numeru hè menu di u numeru di persone in u nostru gruppu in classi. Dunque, dopu à 16 tentativi, Spark rinunziò è disse chì ùn pudia micca principià. Avemu currettu stu paràmetru.
spark.port.maxRetries=50
In seguitu vi dicu di qualchi paràmetri chì ùn sò micca assai ligati à e specifiche di u nostru casu.
Per inizià Spark più veloce, hè cunsigliatu di archivià u cartulare jars situatu in u cartulare di casa SPARK_HOME è mette in HDFS. Allora ùn perderà micca u tempu à carricà sti jarniks da i travagliadori.
spark.yarn.archive=hdfs:///tmp/spark-archive.zip
Hè ricumandemu ancu di utilizà kryo cum'è un serializatore per una operazione più veloce. Hè più ottimizatu cà u predeterminatu.
spark.serializer=org.apache.spark.serializer.KryoSerializer
È ci hè ancu un prublema di longa durata cù Spark chì spessu sbatte da a memoria. Spessu questu succede à u mumentu chì i travagliadori anu calculatu tuttu è mandà u risultatu à u cunduttore. Avemu fattu stu paràmetru più grande per noi. Per automaticamente, hè 1GB, avemu fattu 3.
spark.driver.maxResultSize=3072
È infine, cum'è un dessert. Cumu aghjurnà Spark à a versione 2.1 nantu à a distribuzione HortonWorks - HDP 2.5.3.0. Questa versione di HDP cuntene una versione 2.0 preinstallata, ma una volta avemu decisu per noi stessi chì Spark si sviluppa in modu abbastanza attivu, è ogni nova versione corregge alcuni bug più furnisce funzioni supplementari, cumpresu per l'API python, cusì avemu decisu, ciò chì ci vole. esse fattu hè un aghjurnamentu.
Scaricatu a versione da u situ ufficiale per Hadoop 2.7. Unzipped it è mette in u cartulare HDP. Avemu installatu i ligami simbolichi quantu necessariu. Lanciamu - ùn principia micca. Scrive un errore assai stranu.
java.lang.NoClassDefFoundError: com/sun/jersey/api/client/config/ClientConfig
Dopu à Google, avemu scupertu chì Spark hà decisu di ùn aspittà finu à chì Hadoop hè natu, è hà decisu di utilizà a nova versione di maglia. Iddi stessi discute cun l'altri annantu à questu tema in JIRA. A suluzione era di scaricà
Avemu righjuntu stu errore, ma hè ghjuntu un novu è piuttostu simplificatu.
org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master
À u listessu tempu, pruvemu di eseguisce a versione 2.0 - tuttu hè bè. Pruvate à indovinà ciò chì succede. Avemu guardatu i logs di sta applicazione è avemu vistu qualcosa cum'è questu:
/usr/hdp/${hdp.version}/hadoop/lib/hadoop-lzo-0.6.0.${hdp.version}.jar
In generale, per una certa ragione hdp.version ùn hè micca risolta. Dopu à Google, avemu trovu una suluzione. Avete bisognu à andà à i paràmetri di YARN in Ambari è aghjunghje un paràmetru quì à u situ di filatu persunalizatu:
hdp.version=2.5.3.0-37
Sta magia hà aiutatu, è Spark s'hè alluntanatu. Avemu pruvatu parechji di i nostri laptops jupyter. Tuttu travaglia. Semu pronti per a prima lezione di Spark u sabbatu (dumane) !
DUP. Durante a lezziò, un altru prublema hè vinutu à a luce. À un certu puntu, YARN hà cessatu di furnisce cuntenituri per Spark. In YARN era necessariu di curregà u paràmetru, chì per automaticamente era 0.2:
yarn.scheduler.capacity.maximum-am-resource-percent=0.8
Questu hè, solu u 20% di e risorse hà participatu à a distribuzione di risorse. Dopu avè cambiatu i paràmetri, avemu ricaricatu YARN. U prublema hè stata risolta è u restu di i participanti anu ancu capaci di eseguisce u cuntestu di spark.
Source: www.habr.com