Хабр, сәлем! Кеше
Spark-ті қалай қолданатынымыз туралы кішкене кіріспе. Үш айлық бағдарламамыз бар
Біздің қолдану ерекшелігіміз Spark-те бір уақытта жұмыс істейтін адамдар саны бүкіл топқа тең болуы мүмкін. Мысалы, семинарда бәрі бір уақытта бір нәрсені сынап көреді де, мұғаліміміздің артынан қайталайды. Және бұл көп емес - кейде 40 адамға дейін. Әлемде мұндай пайдалану жағдайына тап болған көптеген компаниялар жоқ шығар.
Әрі қарай, мен кейбір конфигурация параметрлерін қалай және неге таңдағанымызды айтамын.
Ең басынан бастайық. Spark кластерінде іске қосудың 3 нұсқасы бар: оқшау, Mesos пайдалану және YARN пайдалану. Біз үшінші нұсқаны таңдауды ұйғардық, өйткені бұл бізге түсінікті болды. Бізде hadoop кластері бар. Қатысушыларымыз оның сәулетімен жақсы таныс. YARN қолданайық.
spark.master=yarn
Әрі қарай қызықты. Осы 3 орналастыру опциясының әрқайсысында 2 орналастыру опциясы бар: клиент және кластер. негізделген
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-да осы тақырыпта бір-бірімен айтысады. Шешім жүктеп алу болды
Біз бұл қатені айналып өттік, бірақ жаңа және біршама жеңілдетілген қате пайда болды.
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