Konfigurasi Spark ing BENANG

Habr, hello! Wingi ing meetup darmabakti kanggo Apache Spark, saka wong lanang saka Rambler&Co, ana cukup akeh pitakonan saka peserta related kanggo configuring alat iki. Kita mutusake kanggo ngetutake lakune lan nuduhake pengalaman kita. Topik kasebut ora gampang - mula kita ngajak sampeyan nuduhake pengalaman sampeyan ing komentar, bisa uga kita ngerti lan nggunakake salah.

A introduksi sethitik carane kita nggunakake Spark. Kita duwe program telung sasi "Spesialis Big Data", lan ing saindhenging modul kapindho peserta kita nggarap instrumen iki. Dadi, tugas kita, minangka panitia, yaiku nyiapake kluster kanggo digunakake ing kasus kasebut.

Keanehan panggunaan kita yaiku jumlah wong sing kerja ing Spark bisa padha karo kabeh klompok. Contone, ing seminar, nalika kabeh wong nyoba soko ing wektu sing padha lan mbaleni sawise guru kita. Lan iki ora akeh - kadhangkala nganti 40 wong. Mesthine ora akeh perusahaan ing saindenging jagad sing ngadhepi kasus panggunaan kasebut.

Sabanjure, aku bakal pitutur marang kowe carane lan ngapa kita milih paramèter konfigurasi tartamtu.

Ayo diwiwiti saka wiwitan. Spark nduweni 3 opsi kanggo mbukak kluster: mandiri, nggunakake Mesos, lan nggunakake BENANG. Kita mutusake kanggo milih opsi katelu amarga nggawe pangertèn kanggo kita. Kita wis duwe kluster hadoop. Peserta kita wis ngerti arsitekture. Ayo nggunakake BENANG.

spark.master=yarn

Luwih menarik. Saben 3 opsi panyebaran iki nduweni 2 opsi panyebaran: klien lan kluster. adhedhasar dokumentasi lan macem-macem pranala ing Internet, kita bisa nganakke sing klien cocok kanggo karya interaktif - contone, liwat notebook jupyter, lan kluster luwih cocok kanggo solusi produksi. Ing kasus kita, kita kasengsem ing karya interaktif, mulane:

spark.deploy-mode=client

Umumé, wiwit saiki Spark bakal nggarap BENANG, nanging iki ora cukup kanggo kita. Amarga kita duwe program babagan data gedhe, kadhangkala para peserta ora duwe cukup apa sing dipikolehi ing kerangka sumber daya sing rata. Banjur kita nemokake bab sing menarik - alokasi sumber daya dinamis. Ing cendhak, titik iki: yen sampeyan duwe tugas sing angel lan kluster gratis (contone, ing wayah esuk), banjur nggunakake pilihan iki Spark bisa menehi sumber daya tambahan. Kebutuhan diwilang ing kana miturut rumus sing licik. Kita ora bakal njlentrehake rincian - kerjane apik.

spark.dynamicAllocation.enabled=true

Kita nyetel parameter iki, lan nalika wiwitan Spark tabrakan lan ora diwiwiti. Bener, amarga aku kudu maca dokumentasi luwih teliti. Iki nyatakake yen supaya kabeh dadi ok, sampeyan uga kudu ngaktifake parameter tambahan.

spark.shuffle.service.enabled=true

Kenapa perlu? Nalika proyek kita ora mbutuhake akeh sumber daya, Spark kudu bali menyang blumbang umum. Tahap sing paling akeh wektu ing meh kabeh tugas MapReduce yaiku tahap Shuffle. Parameter iki ngidini sampeyan nyimpen data sing digawe ing tahap iki lan ngeculake eksekutor kasebut. Lan eksekutor minangka proses sing ngitung kabeh sing ana ing buruh. Wis nomer tartamtu saka inti prosesor lan jumlah tartamtu saka memori.

Parameter iki wis ditambahake. Kabeh ketoke bisa. Iku dadi ngelingke sing peserta bener diwenehi sumber daya liyane nalika padha needed. Nanging ana masalah liyane - ing sawetara titik peserta liyane tangi lan uga pengin nggunakake Spark, nanging kabeh sibuk ana, lan padha ora seneng. Padha bisa dingerteni. Kita miwiti ndeleng dokumentasi. Ternyata ana sawetara paramèter liyane sing bisa digunakake kanggo mengaruhi proses kasebut. Contone, yen eksekutor ing mode siyaga, sawise wektu apa sumber daya bisa dijupuk saka iku?

spark.dynamicAllocation.executorIdleTimeout=120s

Ing kasus kita, yen para pelaksana ora nindakake apa-apa sajrone rong menit, banjur bali menyang blumbang umum. Nanging parameter iki ora tansah cukup. Cetha yen wong kasebut wis suwe ora nindakake apa-apa, lan sumber daya ora dibebasake. Ternyata ana uga parameter khusus - sawise apa wektu kanggo milih eksekutor sing ngemot data cache. Kanthi gawan, parameter iki tanpa wates! Kita mbenerake.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Yaiku, yen pelaksana sampeyan ora nindakake apa-apa sajrone 5 menit, wenehake menyang blumbang umum. Ing mode iki, kacepetan ngeculake lan nerbitake sumber daya kanggo akeh pangguna wis dadi prayoga. Jumlah rasa ora puas wis suda. Nanging kita mutusaké kanggo pindhah luwih lan matesi jumlah maksimum pelaksana saben aplikasi - ateges saben peserta program.

spark.dynamicAllocation.maxExecutors=19

Saiki, mesthi ana wong sing ora marem ing sisih liya - "klompok kasebut nganggur, lan aku mung duwe 19 eksekutor," nanging apa sing bisa ditindakake? Kita butuh keseimbangan sing bener. Sampeyan ora bisa nggawe kabeh wong seneng.

Lan siji crita cilik liyane sing ana gandhengane karo spesifik kasus kita. Piye wae, sawetara wong telat kanggo pawulangan praktis, lan sakperangan alesan Spark ora miwiti kanggo wong-wong mau. Kita ndeleng jumlah sumber daya gratis - kayane ana. Spark kudu diwiwiti. Begjanipun, ing wektu dokumentasi wis ditambahake menyang subcortex nang endi wae, lan kita elinga yen dibukak, Spark katon kanggo port kanggo miwiti. Yen port pisanan ing sawetara sibuk, pindhah menyang sabanjuré ing urutan. Yen gratis, dijupuk. Lan ana parameter sing nuduhake jumlah maksimum usaha kanggo iki. Sing baku yaiku 16. Cacahe kurang saka cacahe wong ing grup kita ing kelas. Mulane, sawise 16 usaha, Spark nyerah lan ujar manawa aku ora bisa miwiti. Kita wis mbenerake setelan iki.

spark.port.maxRetries=50

Sabanjure aku bakal ngandhani sawetara setelan sing ora ana gandhengane karo spesifik kasus kita.

Kanggo miwiti Spark luwih cepet, disaranake arsip folder jars dumunung ing direktori ngarep SPARK_HOME lan sijine ing HDFS. Banjur dheweke ora bakal mbuwang wektu ngemot jarnik iki dening para pekerja.

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

Sampeyan uga dianjurake kanggo nggunakake kryo minangka serializer kanggo operasi luwih cepet. Iku luwih optimized saka standar.

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

Lan ana uga masalah sing wis suwe karo Spark sing asring nabrak saka memori. Asring mengkono ing wayahe nalika buruh wis diwilang kabeh lan ngirim asil kanggo driver. Kita nggawe parameter iki luwih gedhe kanggo awake dhewe. Kanthi gawan, iku 1GB, kita digawe iku 3.

spark.driver.maxResultSize=3072

Lan pungkasan, minangka panganan cuci mulut. Carane nganyari Spark kanggo versi 2.1 pa distribusi HortonWorks - HDP 2.5.3.0. Versi HDP iki ngemot versi 2.0 sing wis diinstal, nanging kita nate mutusake yen Spark berkembang kanthi aktif, lan saben versi anyar ndandani sawetara kewan omo plus menehi fitur tambahan, kalebu kanggo API python, mula kita mutusake, apa sing kudu ditindakake. rampung yaiku nganyari.

Ngundhuh versi saka situs web resmi kanggo Hadoop 2.7. Unzip lan sijine ing folder HDP. Kita nginstal symlinks yen perlu. Kita miwiti - ora diwiwiti. Nulis kesalahan aneh banget.

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

Sawise googling, kita nemokake manawa Spark mutusake ora ngenteni nganti Hadoop lair, lan mutusake nggunakake jersey versi anyar. Dheweke dhewe padu karo siji liyane babagan topik iki ing JIRA. Solusi kasebut yaiku ngundhuh versi jersey 1.17.1. Selehake iki ing folder jars ing SPARK_HOME, zip maneh lan upload menyang HDFS.

Kita entuk kesalahan iki, nanging ana sing anyar lan luwih ramping.

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

Ing wektu sing padha, kita nyoba kanggo mbukak versi 2.0 - kabeh iku ok. Coba tebak apa sing kedadeyan. Kita ndeleng log aplikasi iki lan ndeleng kaya iki:

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

Umumé, sakperangan alesan hdp.version ora mutusake masalah. Sawise googling, kita nemokake solusi. Sampeyan kudu pindhah menyang setelan YARN ing Ambari lan nambah parameter ing situs benang khusus:

hdp.version=2.5.3.0-37

Piandel iki mbantu, lan Spark njupuk. Kita nyoba sawetara laptop jupyter kita. Kabeh mlaku. Kita siyap kanggo pelajaran Spark pisanan ing dina Setu (sesuk)!

DUP. Sajrone pawulangan, masalah liyane katon. Ing sawetara titik, BENANG mandheg nyedhiyakake kontainer kanggo Spark. Ing YARN perlu kanggo mbenerake parameter, sing minangka standar yaiku 0.2:

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

Tegese, mung 20% ​​sumber daya sing melu distribusi sumber daya. Sawise ngganti paramèter, kita ngisi maneh BENANG. Masalah iki ditanggulangi lan peserta liyane uga bisa mbukak konteks spark.

Source: www.habr.com

Add a comment