YARN дээр Spark-г тохируулж байна

Хабр, сайн уу! Өчигдөр Apache Spark-д зориулсан уулзалт, Rambler&Co-ийн залуусаас энэ хэрэгслийг тохируулахтай холбоотой оролцогчдоос маш олон асуулт ирсэн. Бид түүний мөрөөр дагаж, туршлагаа хуваалцахаар шийдсэн. Энэ сэдэв нь тийм ч амар биш тул бид таныг сэтгэгдэл дээр туршлагаа хуваалцахыг урьж байна, магадгүй бид ч бас буруу зүйлийг ойлгож, ашиглаж магадгүй юм.

Бид Spark-ийг хэрхэн ашигладаг талаар бага зэрэг танилцуулж байна. Бид гурван сарын хөтөлбөртэй "Том мэдээллийн мэргэжилтэн", мөн хоёр дахь модулийн туршид манай оролцогчид энэ хэрэгсэл дээр ажилладаг. Үүний дагуу зохион байгуулагчдын хувьд бидний үүрэг бол кластерийг ийм тохиолдолд ашиглахад бэлтгэх явдал юм.

Бидний хэрэглээний онцлог нь Spark дээр нэгэн зэрэг ажиллаж буй хүмүүсийн тоо нийт бүлгийнхтэй тэнцүү байх явдал юм. Жишээлбэл, семинар дээр хүн бүр нэгэн зэрэг оролдоод, манай багшийн араас давтдаг. Мөн энэ нь тийм ч их биш - заримдаа 40 хүртэл хүн байдаг. Дэлхий дээр ийм хэрэглээний тохиолдолтой тулгардаг олон компани байдаггүй байх.

Дараа нь би зарим тохиргооны параметрүүдийг хэрхэн, яагаад сонгосон талаар танд хэлэх болно.

Эхнээс нь эхэлцгээе. Spark нь кластер дээр ажиллах 3 сонголттой: бие даасан, Mesos ашиглах, YARN ашиглах. Энэ нь бидэнд утга учиртай байсан тул бид гурав дахь хувилбарыг сонгохоор шийдсэн. Бидэнд аль хэдийн hadoop кластер байна. Манай оролцогчид түүний архитектурыг аль хэдийн сайн мэддэг болсон. YARN ашиглацгаая.

spark.master=yarn

Цаашид илүү сонирхолтой. Эдгээр 3 байршуулалтын сонголт бүр нь клиент болон кластер гэсэн 2 байршуулалтын сонголттой. Үндэслэсэн баримт бичиг Интернет дэх янз бүрийн холбоосуудаар үйлчлүүлэгч нь интерактив ажилд тохиромжтой гэж дүгнэж болно - жишээлбэл, jupyter дэвтэрээр дамжуулан, кластер нь үйлдвэрлэлийн шийдэлд илүү тохиромжтой. Манай тохиолдолд бид интерактив ажлыг сонирхож байсан тул:

spark.deploy-mode=client

Ерөнхийдөө одооноос Spark ямар нэгэн байдлаар YARN дээр ажиллах болно, гэхдээ энэ нь бидэнд хангалтгүй байсан. Бид том мэдээллийн тухай хөтөлбөртэй тул заримдаа оролцогчид нөөцийг жигд хуваах хүрээнд олж авсан зүйлээ хангалттай авч чаддаггүй байв. Дараа нь бид нэгэн сонирхолтой зүйлийг олсон - динамик нөөцийн хуваарилалт. Товчхондоо гол зүйл бол: хэрэв танд хэцүү даалгавар байгаа бол кластер үнэгүй (жишээлбэл, өглөө) байвал Spark энэ сонголтыг ашигласнаар танд нэмэлт эх үүсвэр өгөх боломжтой. Шаардлагатай бол зальтай томъёоны дагуу тэнд тооцдог. Бид дэлгэрэнгүй ярихгүй - энэ нь сайн ажилладаг.

spark.dynamicAllocation.enabled=true

Бид энэ параметрийг тохируулсан бөгөөд эхлүүлэх үед Spark эвдэрч, асаагүй байна. Энэ нь зөв, яагаад гэвэл би үүнийг унших ёстой байсан баримт бичиг илүү болгоомжтой. Бүх зүйл хэвийн байхын тулд та нэмэлт параметрийг идэвхжүүлэх хэрэгтэй гэж заасан.

spark.shuffle.service.enabled=true

Яагаад хэрэгтэй байна вэ? Бидний ажилд тийм их нөөц шаардахаа больсон үед Спарк тэднийг нийтийн сан руу буцаах ёстой. MapReduce-ийн бараг бүх ажлын хамгийн их цаг хугацаа шаардсан үе шат бол Shuffle шат юм. Энэ параметр нь энэ үе шатанд үүссэн өгөгдлийг хадгалах, гүйцэтгэгчдийг гаргах боломжийг олгоно. Гүйцэтгэгч нь ажилчин дээр бүх зүйлийг тооцдог процесс юм. Энэ нь тодорхой тооны процессорын цөм, тодорхой хэмжээний санах ойтой.

Энэ параметрийг нэмсэн. Бүх зүйл бүтсэн бололтой. Оролцогчид шаардлагатай үед илүү их нөөцийг өгдөг байсан нь анзаарагдсан. Гэхдээ өөр нэг асуудал гарч ирэв - зарим үед бусад оролцогчид сэрж, мөн Spark-ийг ашиглахыг хүссэн боловч тэнд бүх зүйл завгүй байсан бөгөөд тэд аз жаргалгүй байв. Тэднийг ойлгож болно. Бид бичиг баримтыг судалж эхлэв. Үйл явцад нөлөөлж болох өөр хэд хэдэн параметрүүд байгаа нь тогтоогдсон. Жишээлбэл, хэрэв гүйцэтгэгч зогсолтын горимд байгаа бол хэдэн цагийн дараа түүнээс нөөцийг авч болох вэ?

spark.dynamicAllocation.executorIdleTimeout=120s

Манай тохиолдолд, хэрэв таны гүйцэтгэгчид хоёр минутын турш юу ч хийхгүй бол тэдгээрийг нийтийн усан сан руу буцаана уу. Гэхдээ энэ параметр үргэлж хангалттай байдаггүй. Тэр хүн удаан хугацаанд юу ч хийхгүй байгаа нь тодорхой байсан бөгөөд нөөц нь чөлөөлөгдөхгүй байв. Хэсэг хугацааны дараа кэш өгөгдөл агуулсан гүйцэтгэгчийг сонгох тусгай параметр байдаг. Анхдагч байдлаар, энэ параметр нь хязгааргүй байсан! Бид үүнийг зассан.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Өөрөөр хэлбэл, хэрэв таны гүйцэтгэгчид 5 минутын турш юу ч хийхгүй бол нийтлэг усан санд өгнө үү. Энэ горимд олон тооны хэрэглэгчдэд зориулсан нөөцийг гаргах, гаргах хурд нь зохистой болсон. Сэтгэл дундуур байгаа хүмүүсийн тоо багассан. Гэхдээ бид цаашаа явж, нэг программын оролцогчид ногдох гүйцэтгэгчдийн дээд тоог хязгаарлахаар шийдсэн.

spark.dynamicAllocation.maxExecutors=19

Одоо мэдээж нөгөө талд сэтгэл хангалуун бус хүмүүс байгаа - "кластер сул байна, надад ердөө 19 гүйцэтгэгч байна" гэхдээ та юу хийж чадах вэ? Бидэнд ямар нэгэн зөв тэнцвэр хэрэгтэй байна. Хүн бүрийг аз жаргалтай болгож чадахгүй.

Манай хэргийн онцлогтой холбоотой бас нэг жижиг түүх. Яаж ийгээд хэд хэдэн хүн практик хичээлээс хоцорсон бөгөөд яагаад ч юм тэдний төлөө Spark эхлээгүй. Бид үнэ төлбөргүй нөөцийн хэмжээг харлаа - энэ нь тэнд байх шиг байна. Оч эхлэх ёстой. Аз болоход, тэр үед баримт бичиг нь хаа нэгтээ дэд кортекст аль хэдийн нэмэгдсэн байсан бөгөөд бид Spark эхлүүлэх үед эхлүүлэх порт хайж байсныг санаж байна. Хэрэв муж дахь эхний порт завгүй байвал дарааллаар нь дараагийн порт руу шилжинэ. Хэрэв үнэ төлбөргүй бол барьж авдаг. Үүний тулд хамгийн их оролдлого хийхийг заасан параметр байдаг. Анхдагч нь 16. Энэ тоо нь манай бүлгийн ангид байгаа хүмүүсийн тооноос бага байна. Үүний дагуу 16 оролдлогын дараа Spark бууж өгч, би эхэлж чадахгүй гэж хэлсэн. Бид энэ параметрийг зассан.

spark.port.maxRetries=50

Дараа нь би танд манай хэргийн онцлогтой огт холбоогүй зарим тохиргооны талаар хэлэх болно.

Spark-ийг илүү хурдан эхлүүлэхийн тулд SPARK_HOME үндсэн лавлах дахь jars хавтсыг архивлаж, HDFS дээр байрлуулахыг зөвлөж байна. Дараа нь тэр эдгээр жарникуудыг ажилчдаар ачаад цаг алдахгүй.

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

Мөн хурдан ажиллахын тулд kryo-г цуваажуулагч болгон ашиглахыг зөвлөж байна. Энэ нь анхдагчаас илүү оновчтой болсон.

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

Мөн Spark-тай холбоотой удаан хугацааны асуудал байдаг бөгөөд энэ нь ихэвчлэн санах ойгоос гацдаг. Ихэнхдээ энэ нь ажилчид бүх зүйлийг тооцоолж, үр дүнг жолооч руу илгээх үед тохиолддог. Бид энэ параметрийг өөрсдөдөө илүү том болгосон. Анхдагчаар энэ нь 1GB, бид үүнийг 3 болгосон.

spark.driver.maxResultSize=3072

Эцэст нь амттан болгон. HortonWorks түгээлтийн Spark-ийг 2.1 хувилбар руу хэрхэн шинэчлэх вэ - HDP 2.5.3.0. HDP-ийн энэ хувилбар нь урьдчилан суулгасан 2.0 хувилбарыг агуулж байгаа боловч бид Spark-ийг нэлээд идэвхтэй хөгжүүлж байгаа бөгөөд шинэ хувилбар бүр нь зарим алдааг засч, нэмэлт боломжуудыг, тухайлбал python API-д зориулсан гэж шийдсэн тул бид юу хийх хэрэгтэйг шийдсэн. хийх нь шинэчлэлт юм.

Hadoop 2.7 хувилбарыг албан ёсны вэбсайтаас татаж авсан. Үүнийг задлаад HDP хавтсанд хий. Шаардлагатай бол бид тэмдэгт холбоосуудыг суулгасан. Бид үүнийг эхлүүлдэг - энэ нь эхлэхгүй байна. Маш хачирхалтай алдаа бичдэг.

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

Google-ээр шалгасны дараа бид Spark Hadoop төрөх хүртэл хүлээхгүй байхаар шийдэж, өмсгөлийн шинэ хувилбарыг ашиглахаар шийдсэнийг олж мэдсэн. Тэд өөрсдөө JIRA-д энэ сэдвээр хоорондоо маргалддаг. Үүний шийдэл нь татаж авах явдал байв өмсгөлийн хувилбар 1.17.1. Үүнийг SPARK_HOME доторх jars хавтсанд байрлуулаад дахин зиплээд HDFS рүү байршуулна уу.

Бид энэ алдааг тойрч гарсан боловч шинэ бөгөөд илүү хялбаршуулсан алдаа гарч ирэв.

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

Үүний зэрэгцээ бид 2.0 хувилбарыг ажиллуулахыг хичээдэг - бүх зүйл хэвийн байна. Юу болж байгааг таахыг хичээ. Бид энэ програмын бүртгэлийг хараад дараах зүйлийг олж харлаа.

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

Ерөнхийдөө hdp.version ямар нэг шалтгааны улмаас шийдэгдээгүй байна. Google-ээр хайсны дараа бид шийдлийг олсон. Та Ambari дахь YARN тохиргоо руу орж, тусгай утас сайт руу параметр нэмэх хэрэгтэй:

hdp.version=2.5.3.0-37

Энэ ид шид тус болж, Спарк хөөрөв. Бид хэд хэдэн jupyter зөөврийн компьютерээ туршиж үзсэн. Бүх зүйл ажиллаж байна. Бид бямба гаригт (маргааш) анхны Spark хичээлд бэлэн боллоо!

DUP. Хичээлийн үеэр өөр нэг асуудал гарч ирэв. Хэзээ нэгэн цагт YARN нь Spark-д зориулж сав өгөхөө больсон. YARN-д анхдагчаар 0.2 байсан параметрийг засах шаардлагатай байв.

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

Өөрөөр хэлбэл, нөөцийн хуваарилалтад зөвхөн 20% нь оролцсон. Параметрүүдийг өөрчилсний дараа бид YARN-ийг дахин ачааллаа. Асуудал шийдэгдэж, бусад оролцогчид мөн оч контекстийг ажиллуулж чадсан.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх