Танзими Spark дар YARN

Хабр, салом! Дируз дар вохӯрӣ бахшида ба 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 марҳилаи Shuffle мебошад. Ин параметр ба шумо имкон медиҳад, ки маълумоти дар ин марҳила тавлидшударо захира кунед ва мувофиқан иҷрокунандагонро озод кунед. Ва иҷрокунанда равандест, ки ҳама чизро дар болои коргар ҳисоб мекунад. Он дорои миқдори муайяни ядроҳои протсессори ва миқдори муайяни хотира.

Ин параметр илова карда шудааст. Ба назар чунин менамуд, ки ҳама чиз кор мекунад. Маълум шуд, ки ба иштирокчиён дар вақти зарурӣ захираҳои бештар дода мешуданд. Аммо мушкили дигар пеш омад - дар як лаҳза дигар иштирокчиён аз хоб бедор шуданд ва инчунин мехостанд Spark-ро истифода баранд, аммо дар он ҷо ҳама чиз банд буд ва онҳо норозӣ буданд. Онҳоро фаҳмидан мумкин аст. Мо ба дидани ҳуҷҷатҳо шурӯъ кардем. Маълум шуд, ки як катор параметрхои дигаре низ хастанд, ки ба процесс таъсир расондан мумкин аст. Масалан, агар иҷрокунанда дар ҳолати интизорӣ қарор дошта бошад, пас аз чанд вақт аз он захираҳоро гирифтан мумкин аст?

spark.dynamicAllocation.executorIdleTimeout=120s

Дар ҳолати мо, агар иҷрокунандагони шумо дар давоми ду дақиқа коре накунанд, лутфан онҳоро ба ҳавзи умумӣ баргардонед. Аммо ин параметр на ҳамеша кофӣ буд. Маълум буд, ки одам муддати дароз ба коре машгул намешуд, захирахо холй наме-шаванд. Маълум шуд, ки як параметри махсус низ вуҷуд дорад - пас аз чанд вақт интихоб кардани иҷрокунандагоне, ки дорои маълумоти кэш мебошанд. Бо нобаёнӣ, ин параметр беохир буд! Мо онро ислоҳ кардем.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Яъне, агар иҷрокунандагони шумо дар тӯли 5 дақиқа коре накунанд, онҳоро ба ҳавзи умумӣ диҳед. Дар ин режим, суръати озод кардан ва додани захираҳо барои шумораи зиёди корбарон қобили қабул шудааст. Микдори норозигй кам шуд. Аммо мо тасмим гирифтем, ки минбаъд пеш равем ва шумораи ҳадди аксар иҷрокунандагонро барои як барнома маҳдуд кунем - аслан барои як иштирокчии барнома.

spark.dynamicAllocation.maxExecutors=19

Акнун, албатта, дар тарафи дигар одамони норозй хастанд — «кластер бекор аст, ман хамагй 19 ичрокунанда дорам», вале шумо чй кор карда метавонед, ба мо ягон хел мувозинати дуруст лозим аст. Шумо наметавонед ҳамаро хушбахт кунед.

Ва боз як достони хурде, ки ба вижагиҳои қазияи мо марбут аст. Чи хел бошад, чанд нафар ба дарси амалй дер монданд ва аз чй сабаб бошад, ки Шарора ба онхо шуруъ накард. Мо ба миқдори захираҳои ройгон назар кардем - он ба назар мерасад. Шарора бояд оғоз шавад. Хушбахтона, дар он вақт ҳуҷҷатҳо аллакай ба зеркортекс дар ҷое илова карда шуда буданд ва мо дар хотир доштем, ки ҳангоми ба кор андохтани Spark портеро меҷӯяд, ки дар он оғоз шавад. Агар бандари аввал дар диапазон банд бошад, он бо тартиби ба порти дигар мегузарад. Агар он ройгон бошад, он сабт мекунад. Ва як параметр вуҷуд дорад, ки шумораи ҳадди аксар кӯшишҳоро барои ин нишон медиҳад. Пешфарз 16 аст. Рақам аз шумораи одамони гурӯҳи мо дар синф камтар аст. Ҳамин тариқ, пас аз 16 кӯшиш, Spark таслим шуд ва гуфт, ки ман оғоз карда наметавонам. Мо ин параметрро ислоҳ кардем.

spark.port.maxRetries=50

Минбаъд ман ба шумо дар бораи баъзе танзимотҳо мегӯям, ки ба мушаххасоти парвандаи мо чандон алоқаманд нестанд.

Барои зудтар оғоз кардани Spark, тавсия дода мешавад, ки ҷузвдони jars-ро дар феҳристи хонагии SPARK_HOME бойгонӣ кунед ва онро дар HDFS ҷойгир кунед. Он гох вай ин жарникхоро коргарон бор карданй вактро бехуда сарф намекунад.

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

Инчунин тавсия дода мешавад, ки kryo-ро ҳамчун сериализатор барои зудтар истифода баред. Он нисбат ба пешфарз бештар оптимизатсия шудааст.

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

Ва инчунин як мушкилоти тӯлонӣ бо Spark вуҷуд дорад, ки он аксар вақт аз хотира вайрон мешавад. Аксар вакт ин ходиса дар лахзае руй медихад, ки коргарон хама чизро хисоб карда, натичаашро ба ронанда мефиристанд. Мо ин параметрро барои худ калонтар кардем. Бо нобаёнӣ, он 1 ГБ аст, мо онро 3 сохтем.

spark.driver.maxResultSize=3072

Ва ниҳоят, ҳамчун шириниҳо. Чӣ тавр навсозӣ кардани Spark ба версияи 2.1 дар тақсимоти HortonWorks - HDP 2.5.3.0. Ин версияи HDP дорои версияи қаблан насбшуда 2.0 аст, аммо мо боре худамон тасмим гирифтем, ки Spark хеле фаъолона рушд мекунад ва ҳар як версияи нав баъзе хатогиҳоро ислоҳ мекунад ва инчунин хусусиятҳои иловагӣ, аз ҷумла барои API python, пешниҳод мекунад, бинобар ин мо тасмим гирифтем, ки чӣ бояд кард анҷом додашуда навсозӣ аст.

Версияро аз вебсайти расмии Hadoop 2.7 зеркашӣ кунед. Онро кушоед ва дар папкаи HDP ҷойгир кунед. Мо аломатҳоро мувофиқи зарурат насб кардем. Мо онро оғоз мекунем - он оғоз намешавад. Хатои хеле аҷиб менависад.

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

Пас аз Google, мо фаҳмидем, ки Spark тасмим гирифт, ки то таваллуди Hadoop интизор нашавад ва тасмим гирифт, ки версияи нави ҷерсиро истифода барад. Худи онҳо дар ҶИРА дар ин мавзӯъ бо ҳам баҳс мекунанд. Ҳалли ин зеркашӣ буд Версияи Ҷерсӣ 1.17.1. Инро дар папкаи кӯзаҳо дар SPARK_HOME ҷойгир кунед, аз нав 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 ҳал нашуд. Пас аз Google, мо роҳи ҳалли худро ёфтем. Шумо бояд ба танзимоти YARN дар Ambari равед ва дар он ҷо ба сайти риштаи фармоишӣ параметр илова кунед:

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-ро дубора бор кардем. Мушкилот ҳал карда шуд ва иштирокчиёни боқимонда низ тавонистанд контексти шарораро иҷро кунанд.

Манбаъ: will.com

Илова Эзоҳ