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 басталмай қалды. Біз бос ресурстардың мөлшерін қарадық - ол бар сияқты. Ұшқын басталуы керек. Бақытымызға орай, бұл уақытта құжаттама субкортекске бір жерде қосылып қойған болатын және біз іске қосқан кезде 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 қалтасына орналастырыңыз, оны қайтадан ықшамдаңыз және 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 сабағына дайынбыз!

UPD. Сабақ барысында тағы бір мәселенің беті ашылды. Бір сәтте YARN Spark үшін контейнерлерді беруді тоқтатты. YARN параметрінде әдепкі бойынша 0.2 болатын параметрді түзету қажет болды:

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

Яғни ресурстарды бөлуге ресурстардың 20%-ы ғана қатысты. Параметрлерді өзгерткеннен кейін біз YARN қайта жүктедік. Мәселе шешілді және қалған қатысушылар да spark контекстін іске қоса алды.

Ақпарат көзі: www.habr.com

пікір қалдыру