Habr, habari! Jana tarehe
Utangulizi mdogo wa jinsi tunavyotumia Spark. Tuna programu ya miezi mitatu
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
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
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
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