Ffurfweddu Spark ar YARN

Habr, helo! Ddoe ymlaen cyfarfod ymroddedig i Apache Spark, gan y bechgyn o Rambler&Co, roedd cryn dipyn o gwestiynau gan gyfranogwyr yn ymwneud â ffurfweddu'r offeryn hwn. Fe benderfynon ni ddilyn ei olion traed a rhannu ein profiad. Nid yw'r pwnc yn hawdd - felly rydym yn eich gwahodd i rannu eich profiad yn y sylwadau, efallai ein bod hefyd yn deall ac yn defnyddio rhywbeth o'i le.

Ychydig o gyflwyniad i sut rydyn ni'n defnyddio Spark. Mae gennym raglen tri mis “Arbenigwr Data Mawr”, a thrwy gydol yr ail fodiwl mae ein cyfranogwyr yn gweithio ar yr offeryn hwn. Yn unol â hynny, ein tasg ni, fel trefnwyr, yw paratoi'r clwstwr i'w ddefnyddio o fewn achos o'r fath.

Hynodrwydd ein defnydd yw y gall nifer y bobl sy'n gweithio ar Spark ar yr un pryd fod yn gyfartal â'r grŵp cyfan. Er enghraifft, mewn seminar, pan fydd pawb yn ceisio rhywbeth ar yr un pryd ac yn ailadrodd ar ôl ein hathro. Ac nid yw hyn yn llawer - weithiau hyd at 40 o bobl. Mae'n debyg nad oes llawer o gwmnïau yn y byd sy'n wynebu achos defnydd o'r fath.

Nesaf, byddaf yn dweud wrthych sut a pham y gwnaethom ddewis rhai paramedrau ffurfweddu.

Gadewch i ni ddechrau o'r cychwyn cyntaf. Mae gan Spark 3 opsiwn i redeg ar glwstwr: yn annibynnol, gan ddefnyddio Mesos, a defnyddio YARN. Fe benderfynon ni ddewis y trydydd opsiwn oherwydd ei fod yn gwneud synnwyr i ni. Mae gennym ni glwstwr hadoop eisoes. Mae ein cyfranogwyr eisoes yn gyfarwydd iawn â'i bensaernïaeth. Gadewch i ni ddefnyddio YARN.

spark.master=yarn

Ymhellach yn fwy diddorol. Mae gan bob un o'r 3 opsiwn lleoli hyn 2 opsiwn lleoli: cleient a chlwstwr. Seiliedig dogfennaeth a chysylltiadau amrywiol ar y Rhyngrwyd, gallwn ddod i'r casgliad bod cleient yn addas ar gyfer gwaith rhyngweithiol - er enghraifft, trwy lyfr nodiadau jupyter, a chlwstwr yn fwy addas ar gyfer atebion cynhyrchu. Yn ein hachos ni, roedd gennym ddiddordeb mewn gwaith rhyngweithiol, felly:

spark.deploy-mode=client

Yn gyffredinol, o hyn ymlaen bydd Spark rywsut yn gweithio ar YARN, ond nid oedd hyn yn ddigon i ni. Gan fod gennym raglen am ddata mawr, weithiau nid oedd gan y cyfranogwyr ddigon o'r hyn a gafwyd o fewn fframwaith tafell gyfartal o adnoddau. Ac yna daethom o hyd i beth diddorol - dyrannu adnoddau deinamig. Yn fyr, y pwynt yw hyn: os oes gennych dasg anodd a bod y clwstwr yn rhad ac am ddim (er enghraifft, yn y bore), yna gall defnyddio'r opsiwn hwn Spark roi adnoddau ychwanegol i chi. Cyfrifir angenrheidrwydd yno yn ol fformiwla gyfrwys. Ni awn i fanylion - mae'n gweithio'n dda.

spark.dynamicAllocation.enabled=true

Fe wnaethon ni osod y paramedr hwn, ac wrth gychwyn fe chwalodd Spark ac ni ddechreuodd. Mae hynny'n iawn, oherwydd roedd yn rhaid i mi ei ddarllen dogfennaeth yn fwy gofalus. Mae'n nodi, er mwyn i bopeth fod yn iawn, mae angen i chi hefyd alluogi paramedr ychwanegol.

spark.shuffle.service.enabled=true

Pam fod ei angen? Pan nad oes angen cymaint o adnoddau ar ein swydd mwyach, dylai Spark eu dychwelyd i'r pwll cyffredin. Y cam sy'n cymryd mwyaf o amser mewn bron unrhyw dasg MapReduce yw'r cam Shuffle. Mae'r paramedr hwn yn caniatáu ichi arbed y data a gynhyrchir ar hyn o bryd a rhyddhau'r ysgutorion yn unol â hynny. A'r ysgutor yw'r broses sy'n cyfrifo popeth ar y gweithiwr. Mae ganddo nifer penodol o greiddiau prosesydd a rhywfaint o gof.

Mae'r paramedr hwn wedi'i ychwanegu. Roedd popeth i'w weld yn gweithio. Daeth yn amlwg bod cyfranogwyr yn cael mwy o adnoddau pan oedd eu hangen arnynt. Ond cododd problem arall - ar ryw adeg deffrodd cyfranogwyr eraill a hefyd eisiau defnyddio Spark, ond roedd popeth yn brysur yno, ac roeddent yn anhapus. Gellir eu deall. Dechreuon ni edrych ar y ddogfennaeth. Mae'n troi allan bod yna nifer o baramedrau eraill y gellir eu defnyddio i ddylanwadu ar y broses. Er enghraifft, os yw'r ysgutor yn y modd segur, ar ôl faint o amser y gellir cymryd adnoddau ohono?

spark.dynamicAllocation.executorIdleTimeout=120s

Yn ein hachos ni, os na fydd eich ysgutorion yn gwneud dim am ddau funud, yna dychwelwch nhw i'r pwll cyffredin. Ond nid oedd y paramedr hwn bob amser yn ddigon. Roedd yn amlwg nad oedd y person wedi bod yn gwneud unrhyw beth ers amser maith, ac nid oedd adnoddau'n cael eu rhyddhau. Mae'n troi allan bod yna hefyd baramedr arbennig - ar ôl faint o amser i ddewis ysgutorion sy'n cynnwys data cached. Yn ddiofyn, roedd y paramedr hwn yn anfeidredd! Fe wnaethon ni ei gywiro.

spark.dynamicAllocation.cachedExecutorIdleTimeout=600s

Hynny yw, os na fydd eich ysgutorion yn gwneud dim am 5 munud, rhowch nhw i'r pwll cyffredin. Yn y modd hwn, mae cyflymder rhyddhau a chyhoeddi adnoddau ar gyfer nifer fawr o ddefnyddwyr wedi dod yn weddus. Mae maint yr anfodlonrwydd wedi lleihau. Ond fe benderfynon ni fynd ymhellach a chyfyngu ar y nifer uchaf o ysgutorion fesul cais - yn y bôn fesul cyfranogwr rhaglen.

spark.dynamicAllocation.maxExecutors=19

Yn awr, wrth gwrs, y mae pobl anfoddog yr ochr arall — “ y clwstwr yn segur, a dim ond 19 o ysgutorion sydd genyf fi,” ond pa beth a ellwch chwi wneyd ì Mae angen rhyw fath o gydbwysedd cywir arnom. Ni allwch wneud pawb yn hapus.

Ac un stori fach arall yn ymwneud â manylion ein hachos. Rhywsut, roedd sawl person yn hwyr am wers ymarferol, ac am ryw reswm ni ddechreuodd Spark iddyn nhw. Edrychon ni ar faint o adnoddau rhad ac am ddim - mae'n ymddangos ei fod yno. Dylai gwreichionen ddechrau. Yn ffodus, erbyn hynny roedd y ddogfennaeth eisoes wedi'i hychwanegu at yr is-gortecs yn rhywle, a chofiasom, pan gafodd ei lansio, fod Spark yn edrych am borthladd i ddechrau arno. Os yw'r porthladd cyntaf yn yr ystod yn brysur, mae'n symud i'r un nesaf mewn trefn. Os yw'n rhad ac am ddim, mae'n dal. Ac mae yna baramedr sy'n nodi'r nifer uchaf o ymdrechion ar gyfer hyn. Y rhagosodiad yw 16. Mae'r nifer yn llai na nifer y bobl yn ein grŵp yn y dosbarth. Yn unol â hynny, ar ôl 16 ymgais, rhoddodd Spark y gorau iddi a dweud na allwn i ddechrau. Rydym wedi cywiro'r gosodiad hwn.

spark.port.maxRetries=50

Nesaf byddaf yn dweud wrthych am rai gosodiadau nad ydynt yn gysylltiedig iawn â manylion ein hachos.

I gychwyn Spark yn gyflymach, argymhellir archifo'r ffolder jariau sydd wedi'i leoli yn y cyfeiriadur cartref SPARK_HOME a'i roi ar HDFS. Yna ni fydd yn gwastraffu amser yn llwytho'r jarniks hyn gan weithwyr.

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

Argymhellir hefyd defnyddio kryo fel cyfresydd ar gyfer gweithrediad cyflymach. Mae wedi'i optimeiddio'n fwy na'r un rhagosodedig.

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

Ac mae yna hefyd broblem hirsefydlog gyda Spark ei fod yn aml yn gwrthdaro o'r cof. Yn aml mae hyn yn digwydd ar hyn o bryd pan fydd y gweithwyr wedi cyfrifo popeth ac yn anfon y canlyniad at y gyrrwr. Gwnaethom y paramedr hwn yn fwy i ni ein hunain. Yn ddiofyn, mae'n 1GB, fe wnaethon ni ei wneud yn 3.

spark.driver.maxResultSize=3072

Ac yn olaf, fel pwdin. Sut i ddiweddaru Spark i fersiwn 2.1 ar ddosbarthiad HortonWorks - HDP 2.5.3.0. Mae'r fersiwn hon o HDP yn cynnwys fersiwn 2.0 a osodwyd ymlaen llaw, ond fe wnaethom benderfynu unwaith i ni ein hunain fod Spark yn datblygu'n eithaf gweithredol, ac mae pob fersiwn newydd yn trwsio rhai chwilod ac yn darparu nodweddion ychwanegol, gan gynnwys ar gyfer yr API python, felly fe wnaethom benderfynu, beth sydd angen ei cael ei wneud yn ddiweddariad.

Wedi lawrlwytho'r fersiwn o'r wefan swyddogol ar gyfer Hadoop 2.7. Dadsipio ef a'i roi yn y ffolder HDP. Fe wnaethom osod y symlinks yn ôl yr angen. Rydyn ni'n ei lansio - nid yw'n dechrau. Yn ysgrifennu gwall rhyfedd iawn.

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

Ar ôl googling, cawsom wybod bod Spark wedi penderfynu peidio ag aros tan i Hadoop gael ei eni, a phenderfynwyd defnyddio'r fersiwn newydd o'r crys. Maen nhw eu hunain yn dadlau â'i gilydd am y pwnc hwn yn JIRA. Yr ateb oedd llwytho i lawr fersiwn crys 1.17.1. Rhowch hwn yn y ffolder jariau yn SPARK_HOME, ei sipio eto a'i uwchlwytho i HDFS.

Aethom o gwmpas y gwall hwn, ond cododd un newydd a symlach.

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

Ar yr un pryd, rydyn ni'n ceisio rhedeg fersiwn 2.0 - mae popeth yn iawn. Ceisiwch ddyfalu beth sy'n digwydd. Fe wnaethon ni edrych i mewn i logiau'r cais hwn a gweld rhywbeth fel hyn:

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

Yn gyffredinol, am ryw reswm ni ddatrysodd hdp.version. Ar ôl googling, daethom o hyd i ateb. Mae angen i chi fynd i'r gosodiadau YARN yn Ambari ac ychwanegu paramedr yno at y wefan edafedd arferol:

hdp.version=2.5.3.0-37

Helpodd yr hud hwn, a dechreuodd Spark. Fe wnaethon ni brofi nifer o'n gliniaduron jupyter. Mae popeth yn gweithio. Rydym yn barod am y wers Spark gyntaf dydd Sadwrn (yfory)!

DIWEDDARIAD. Yn ystod y wers, daeth problem arall i'r amlwg. Ar ryw adeg, rhoddodd YARN y gorau i ddarparu cynwysyddion ar gyfer Spark. Yn YARN roedd angen cywiro'r paramedr, sef 0.2 yn ddiofyn:

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

Hynny yw, dim ond 20% o adnoddau a gymerodd ran yn y broses o ddosbarthu adnoddau. Ar ôl newid y paramedrau, rydym yn ail-lwytho YARN. Datryswyd y broblem ac roedd gweddill y cyfranogwyr hefyd yn gallu rhedeg cyd-destun sbarc.

Ffynhonnell: hab.com

Ychwanegu sylw