Inasanidi Spark kwenye UZI

Habr, habari! Jana tarehe mkutano maalum kwa Apache Spark, kutoka kwa wavulana kutoka Rambler&Co, kulikuwa na maswali mengi kutoka kwa washiriki kuhusiana na kusanidi zana hii. Tuliamua kufuata nyayo zake na kushiriki uzoefu wetu. Mada sio rahisi - kwa hivyo tunakualika ushiriki uzoefu wako katika maoni, labda pia tunaelewa na kutumia kitu kibaya.

Utangulizi mdogo wa jinsi tunavyotumia Spark. Tuna programu ya miezi mitatu "Mtaalamu Mkuu wa Takwimu", na katika moduli yote ya pili washiriki wetu wanafanyia kazi chombo hiki. Ipasavyo, kazi yetu, kama waandaaji, ni kuandaa nguzo kwa matumizi ndani ya kesi kama hiyo.

Upekee wa matumizi yetu ni kwamba idadi ya watu wanaofanya kazi wakati huo huo kwenye Spark inaweza kuwa sawa na kikundi kizima. Kwa mfano, kwenye semina, wakati kila mtu anajaribu kitu kwa wakati mmoja na kurudia baada ya mwalimu wetu. Na hii sio nyingi - wakati mwingine hadi watu 40. Labda hakuna kampuni nyingi ulimwenguni ambazo zinakabiliwa na kesi kama hiyo ya utumiaji.

Ifuatayo, nitakuambia jinsi na kwa nini tulichagua vigezo fulani vya usanidi.

Hebu tuanze tangu mwanzo. Spark ina chaguo 3 za kuendesha kwenye nguzo: inayojitegemea, kwa kutumia Mesos, na kutumia UZI. Tuliamua kuchagua chaguo la tatu kwa sababu lilikuwa na maana kwetu. Tayari tunayo nguzo ya hadoop. Washiriki wetu tayari wanafahamu vizuri usanifu wake. Wacha tutumie UZI.

spark.master=yarn

Zaidi ya kuvutia zaidi. Kila moja ya chaguo hizi 3 za uwekaji ina chaguo 2 za uwekaji: mteja na nguzo. Kulingana nyaraka na viungo mbalimbali kwenye mtandao, tunaweza kuhitimisha kuwa mteja anafaa kwa ajili ya kazi ya maingiliano - kwa mfano, kupitia daftari ya jupyter, na nguzo inafaa zaidi kwa ufumbuzi wa uzalishaji. Kwa upande wetu, tulipendezwa na kazi ya maingiliano, kwa hivyo:

spark.deploy-mode=client

Kwa ujumla, kuanzia sasa Spark itafanya kazi kwa UZI, lakini hii haitoshi kwetu. Kwa kuwa tuna programu kuhusu data kubwa, wakati mwingine washiriki hawakuwa na kutosha kwa kile kilichopatikana ndani ya mfumo wa kukatwa kwa rasilimali. Na kisha tulipata jambo la kufurahisha - ugawaji wa rasilimali wenye nguvu. Kwa kifupi, hatua ni hii: ikiwa una kazi ngumu na nguzo ni bure (kwa mfano, asubuhi), basi kutumia chaguo hili Spark inaweza kukupa rasilimali za ziada. Umuhimu unahesabiwa hapo kulingana na fomula ya ujanja. Hatutaingia katika maelezo - inafanya kazi vizuri.

spark.dynamicAllocation.enabled=true

Tuliweka kigezo hiki, na baada ya kuanza Spark ilianguka na haikuanza. Hiyo ni kweli, kwa sababu ilinibidi kuisoma nyaraka kwa makini zaidi. Inasema kwamba ili kila kitu kiwe sawa, unahitaji pia kuwezesha parameter ya ziada.

spark.shuffle.service.enabled=true

Kwa nini inahitajika? Wakati kazi yetu haihitaji tena rasilimali nyingi, Spark inapaswa kuzirudisha kwenye bwawa la pamoja. Hatua inayotumia muda mwingi katika takriban kazi yoyote ya Kupunguza Ramani ni hatua ya Changanya. Kigezo hiki hukuruhusu kuhifadhi data inayotolewa katika hatua hii na kuwaachilia watekelezaji ipasavyo. Na mtekelezaji ni mchakato unaohesabu kila kitu juu ya mfanyakazi. Ina idadi fulani ya cores processor na kiasi fulani cha kumbukumbu.

Kigezo hiki kimeongezwa. Kila kitu kilionekana kufanya kazi. Ilionekana kuwa washiriki walipewa rasilimali zaidi wakati walihitaji. Lakini shida nyingine ilitokea - wakati fulani washiriki wengine waliamka na pia walitaka kutumia Spark, lakini kila kitu kilikuwa na kazi huko, na hawakuwa na furaha. Wanaweza kueleweka. Tulianza kuangalia nyaraka. Ilibadilika kuwa kuna idadi ya vigezo vingine ambavyo vinaweza kutumika kushawishi mchakato. Kwa mfano, ikiwa mtekelezaji yuko katika hali ya kusubiri, baada ya muda gani rasilimali zinaweza kuchukuliwa kutoka kwake?

spark.dynamicAllocation.executorIdleTimeout=120s

Kwa upande wetu, ikiwa watekelezaji wako hawafanyi chochote kwa dakika mbili, basi tafadhali warudishe kwenye bwawa la kawaida. Lakini parameter hii haikuwa ya kutosha kila wakati. Ilikuwa wazi kwamba mtu huyo hakuwa akifanya chochote kwa muda mrefu, na rasilimali hazikuwa zikitolewa. Ilibadilika kuwa pia kuna parameter maalum - baada ya wakati gani wa kuchagua watekelezaji ambao wana data iliyohifadhiwa. Kwa chaguo-msingi, kigezo hiki kilikuwa kisicho na mwisho! Tulirekebisha.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Hiyo ni, ikiwa watekelezaji wako hawafanyi chochote kwa dakika 5, wape kwenye bwawa la kawaida. Katika hali hii, kasi ya kutoa na kutoa rasilimali kwa idadi kubwa ya watumiaji imekuwa nzuri. Kiasi cha kutoridhika kimepungua. Lakini tuliamua kwenda mbali zaidi na kupunguza idadi ya juu zaidi ya watekelezaji kwa kila ombi - kimsingi kwa kila mshiriki wa programu.

spark.dynamicAllocation.maxExecutors=19

Sasa, kwa kweli, kuna watu wasioridhika upande mwingine - "nguzo haina kazi, na nina watekelezaji 19 tu," lakini unaweza kufanya nini? Tunahitaji aina fulani ya usawa sahihi. Huwezi kumfurahisha kila mtu.

Na hadithi moja ndogo zaidi inayohusiana na maalum ya kesi yetu. Kwa namna fulani, watu kadhaa walichelewa kwa somo la vitendo, na kwa sababu fulani Spark haikuanza kwao. Tuliangalia kiasi cha rasilimali za bure - inaonekana kuwa huko. Cheche inapaswa kuanza. Kwa bahati nzuri, kufikia wakati huo nyaraka zilikuwa tayari zimeongezwa kwa subcortex mahali fulani, na tulikumbuka kwamba wakati ilizinduliwa, Spark inatafuta bandari ambayo kuanza. Ikiwa lango la kwanza katika safu lina shughuli nyingi, linasogea hadi lingine kwa mpangilio. Ikiwa ni bure, inakamata. Na kuna parameter inayoonyesha idadi kubwa ya majaribio kwa hili. Chaguo-msingi ni 16. Nambari ni chini ya idadi ya watu katika kikundi chetu darasani. Ipasavyo, baada ya majaribio 16, Spark alikata tamaa na kusema kwamba singeweza kuanza. Tumesahihisha mpangilio huu.

spark.port.maxRetries=50

Ifuatayo nitakuambia kuhusu mipangilio fulani ambayo haihusiani sana na maalum ya kesi yetu.

Ili kuanza Spark haraka, inashauriwa kuhifadhi folda ya mitungi iliyo kwenye saraka ya nyumbani ya SPARK_HOME na kuiweka kwenye HDFS. Kisha hatapoteza muda kupakia jarnik hizi na wafanyakazi.

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

Inapendekezwa pia kutumia kryo kama serializer kwa operesheni ya haraka. Imeboreshwa zaidi kuliko ile chaguo-msingi.

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

Na pia kuna shida ya muda mrefu na Spark ambayo mara nyingi huanguka kutoka kwa kumbukumbu. Mara nyingi hii hutokea wakati wafanyakazi wamehesabu kila kitu na kutuma matokeo kwa dereva. Tuliifanya parameter hii kuwa kubwa kwa ajili yetu wenyewe. Kwa chaguo-msingi, ni 1GB, tuliifanya kuwa 3.

spark.driver.maxResultSize=3072

Na mwishowe, kama dessert. Jinsi ya kusasisha Spark hadi toleo la 2.1 kwenye usambazaji wa HortonWorks - HDP 2.5.3.0. Toleo hili la HDP lina toleo lililosanikishwa awali la 2.0, lakini tulijiamulia mara moja kuwa Spark inaendelea kikamilifu, na kila toleo jipya hurekebisha mende kadhaa pamoja na hutoa vipengele vya ziada, ikiwa ni pamoja na API ya python, kwa hivyo tuliamua , nini kinahitaji kufanyika ni sasisho.

Imepakua toleo kutoka kwa tovuti rasmi ya Hadoop 2.7. Ifungue na kuiweka kwenye folda ya HDP. Tulisakinisha symlink kama inahitajika. Tunazindua - haianza. Anaandika kosa lisilo wazi kabisa.

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

Baada ya googling, tuligundua kuwa Spark aliamua kutosubiri hadi Hadoop azaliwe, na tukaamua kutumia toleo jipya la jezi. Wenyewe wanabishana wao kwa wao kuhusu mada hii katika JIRA. Suluhisho lilikuwa kupakua toleo la jezi 1.17.1. Weka hii kwenye folda ya mitungi katika SPARK_HOME, ifungishe tena na uipakie kwenye HDFS.

Tulipata hitilafu hii, lakini mpya na iliyosasishwa iliibuka.

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

Wakati huo huo, tunajaribu kuendesha toleo la 2.0 - kila kitu ni sawa. Jaribu kukisia nini kinaendelea. Tuliangalia kumbukumbu za programu hii na tukaona kitu kama hiki:

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

Kwa ujumla, kwa sababu fulani hdp.version haikutatua. Baada ya googling, tulipata suluhisho. Unahitaji kwenda kwa mipangilio ya UZI huko Ambari na uongeze kigezo hapo kwenye tovuti maalum ya uzi:

hdp.version=2.5.3.0-37

Uchawi huu ulisaidia, na Spark akaondoka. Tulijaribu laptops zetu kadhaa za jupyter. Kila kitu kinafanya kazi. Tuko tayari kwa somo la kwanza la Spark siku ya Jumamosi (kesho)!

DUP. Wakati wa somo, shida nyingine ilikuja. Wakati fulani, YARN iliacha kutoa kontena kwa Spark. Katika YARN ilihitajika kusahihisha paramu, ambayo kwa msingi ilikuwa 0.2:

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

Hiyo ni, 20% tu ya rasilimali ilishiriki katika usambazaji wa rasilimali. Baada ya kubadilisha vigezo, tulipakia tena YARN. Tatizo lilitatuliwa na washiriki wengine pia waliweza kuendesha muktadha wa cheche.

Chanzo: mapenzi.com

Kuongeza maoni