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

Бул эмне үчүн керек? Биздин жумуш мынчалык көп ресурстарды талап кылбай калганда, Spark аларды жалпы бассейнге кайтарышы керек. Дээрлик бардык MapReduce тапшырмаларынын эң көп убакытты талап кылган баскычы аралаштыруу баскычы болуп саналат. Бул параметр ушул этапта түзүлгөн маалыматтарды сактоого жана ошого жараша аткаруучуларды бошотууга мүмкүндүк берет. Ал эми аткаруучу – бул жумушчунун үстүнөн баарын эсептеген процесс. Анын белгилүү бир саны процессор өзөктөрү жана белгилүү бир эс тутум бар.

Бул параметр кошулду. Баары иштегендей болду. Катышуучуларга керек болгондо көбүрөөк ресурстар берилгени байкалды. Бирок дагы бир көйгөй пайда болду – кайсы бир учурда башка катышуучулар ойгонуп, алар да Spark колдонгусу келген, бирок ал жерде баары бош эмес, алар бактысыз болушкан. Аларды түшүнсө болот. Документти карап баштадык. Процесске таасир эте турган дагы бир катар параметрлер бар экени белгилүү болду. Мисалы, эгерде аткаруучу күтүү режиминде болсо, андан канча убакыт өткөндөн кийин ресурстарды алууга болот?

spark.dynamicAllocation.executorIdleTimeout=120s

Биздин учурда, эгерде сиздин аткаруучуларыңыз эки мүнөт эч нерсе кылбаса, анда аларды жалпы бассейнге кайтарыңыз. Бирок бул параметр дайыма эле жетиштүү болгон эмес. Ал киши көптөн бери эч нерсе кылбай, ресурстар бошоп жатканы көрүнүп турду. Кэштелген маалыматтарды камтыган аткаруучуларды кайсы убактан кийин тандоо керек деген атайын параметр да бар экени белгилүү болду. Демейки боюнча, бул параметр чексиздик болгон! Биз аны оңдодук.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Башкача айтканда, сиздин аткаруучулар 5 мүнөт эч нерсе кылбаса, аларды жалпы бассейнге бериңиз. Бул режимде көптөгөн колдонуучулар үчүн ресурстарды чыгаруу жана чыгаруу ылдамдыгы татыктуу болуп калды. Нааразычылыктын саны азайды. Бирок биз андан ары барууну жана ар бир өтүнмө боюнча аткаруучулардын максималдуу санын чектөөнү чечтик - негизинен программанын катышуучусуна.

spark.dynamicAllocation.maxExecutors=19

Эми, албетте, экинчи тарапта нааразы болгондор бар – “кластер иштебей турат, менде болгону 19 аткаруучу бар”, бирок эмне кыла аласыз?.. Бизге кандайдыр бир туура тең салмактуулук керек. Баарын бактылуу кыла албайсың.

Ал эми биздин иштин өзгөчөлүгүнө байланыштуу дагы бир кичинекей окуя. Негедир бир нече адам практикалык сабакка кечигип, эмнегедир Учкун алар үчүн башталбай калды. Биз бош ресурстардын көлөмүн карадык – ал бар окшойт. Учкун башталышы керек. Бактыга жараша, ошол убакта документация субкортекске бир жерде кошулган жана биз 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 менен көптөн бери келе жаткан көйгөй бар, ал көбүнчө эс тутумдан бузулат. Көбүнчө бул жумушчулар баарын эсептеп чыгып, жыйынтыгын айдоочуга жөнөткөн учурда болот. Бул параметрди өзүбүз үчүн чоңойтуп койдук. Демейки боюнча, бул 1 ГБ, биз аны 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

Гуглингден кийин биз Spark Hadoop төрөлгөнгө чейин күтпөөнү чечкенин жана джерсинин жаңы версиясын колдонууну чечкенин билдик. Алар өздөрү JIRAда бул тема боюнча бири-бири менен талашып-тартышат. Чечим жүктөө болчу джерси версиясы 1.17.1. Муну SPARK_HOME ичиндеги jars папкасына салып, кайра zip кылып, 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 чечилген жок. Гуглдан кийин биз чечим таптык. Сиз 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ды кайра жүктөдүк. Көйгөй чечилип, калган катышуучулар да контекстти иштете алышты.

Source: www.habr.com

DDoS коргоосу, VPS VDS серверлери бар сайттар үчүн ишенимдүү хостинг сатып алыңыз 🔥 DDoS коргоосу, VPS VDS серверлери бар ишенимдүү веб-сайт хостингин сатып алыңыз | ProHoster