{"id":30548,"date":"2019-10-31T21:36:08","date_gmt":"2019-10-31T18:36:08","guid":{"rendered":"https:\/\/prohoster.info\/blog\/konfigurirovanie-spark-na-yarn\/"},"modified":"2019-10-31T21:36:08","modified_gmt":"2019-10-31T18:36:08","slug":"konfigurirovanie-spark-na-yarn","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pl\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Konfiguracja Sparka na YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Cze\u015b\u0107 Habr! Wczoraj na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">meetupie po\u015bwi\u0119conym Apache Spark<\/a><\/noindex>, od ch\u0142opak\u00f3w z Rambler&#038;Co, by\u0142o sporo pyta\u0144 od uczestnik\u00f3w dotycz\u0105cych konfiguracji tego narz\u0119dzia. Zdecydowali\u015bmy si\u0119 podzieli\u0107 naszym do\u015bwiadczeniem. Temat jest skomplikowany \u2014 dlatego zach\u0119camy do dzielenia si\u0119 do\u015bwiadczeniem r\u00f3wnie\u017c w komentarzach, by\u0107 mo\u017ce my te\u017c co\u015b \u017ale rozumiemy i u\u017cywamy.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKr\u00f3tki wst\u0119p \u2014 jak u\u017cywamy Sparka. Mamy trzy miesi\u0119czny program <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201eSpecjalista ds. du\u017cych danych\u201d<\/a><\/noindex>, a w ca\u0142ym drugim module nasi uczestnicy pracuj\u0105 z tym narz\u0119dziem. Naszym zadaniem jako organizator\u00f3w jest przygotowanie klastra do pracy w przypadku takiego u\u017cycia.<\/p>\n<p>Specyfika naszego u\u017cycia polega na tym, \u017ce liczba os\u00f3b jednocze\u015bnie pracuj\u0105cych na Sparku mo\u017ce by\u0107 r\u00f3wna ca\u0142ej grupie. Na przyk\u0142ad, podczas seminarium, kiedy wszyscy jednocze\u015bnie co\u015b pr\u00f3buj\u0105 i powtarzaj\u0105 za naszym nauczycielem. A to nie jest ma\u0142o \u2014 czasami pod 40 os\u00f3b. Pewnie nie ma zbyt wielu firm na \u015bwiecie, kt\u00f3re staj\u0105 przed takim scenariuszem u\u017cycia.<\/p>\n<p>P\u00f3\u017aniej opisz\u0119, jak i dlaczego dobierali\u015bmy poszczeg\u00f3lne parametry konfiguracji.<\/p>\n<p>Zacznijmy od samego pocz\u0105tku. Spark ma 3 opcje pracy na klastrze: standalone, z u\u017cyciem Mesos i z u\u017cyciem YARN. Postanowili\u015bmy wybra\u0107 trzeci\u0105 opcj\u0119, poniewa\u017c by\u0142a dla nas najbardziej logiczna. Mamy ju\u017c klaster hadoop. Nasi uczestnicy s\u0105 dobrze zaznajomieni z jego architektur\u0105. U\u017cyjmy YARN.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nDalej robi si\u0119 ciekawiej. Ka\u017cda z tych 3 opcji wdro\u017cenia ma 2 opcje klasyfikacji: client i cluster. Na podstawie <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">dokumentacji<\/a><\/noindex> i r\u00f3\u017cnych link\u00f3w w internecie mo\u017cna wywnioskowa\u0107, \u017ce client nadaje si\u0119 do interaktywnej pracy \u2014 na przyk\u0142ad przez jupyter notebook, a cluster bardziej nadaje si\u0119 do rozwi\u0105za\u0144 produkcyjnych. W naszym przypadku interesowa\u0142a nas interaktywna praca, wi\u0119c:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nW zasadzie od tego momentu Spark zacz\u0105\u0142 jako\u015b dzia\u0142a\u0107 na YARN, ale to nam nie wystarczy\u0142o. Poniewa\u017c pracujemy z du\u017cymi danymi, czasami uczestnikom brakowa\u0142o tego, co mo\u017cna by\u0142o uzyska\u0107 w ramach r\u00f3wnomiernego podzia\u0142u zasob\u00f3w. I tutaj odkryli\u015bmy ciekaw\u0105 rzecz \u2013 dynamiczn\u0105 alokacj\u0119 zasob\u00f3w. Kr\u00f3tko m\u00f3wi\u0105c, gdy masz ci\u0119\u017ckie zadanie i klaster jest wolny (na przyk\u0142ad rano), dzi\u0119ki tej opcji Spark mo\u017ce przyzna\u0107 ci dodatkowe zasoby. Wymagania obliczane s\u0105 na podstawie skomplikowanej formu\u0142y. Nie b\u0119dziemy wchodzi\u0107 w szczeg\u00f3\u0142y \u2014 dzia\u0142a to ca\u0142kiem nie\u017ale.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nUstawili\u015bmy ten parametr, a przy uruchomieniu Spark zg\u0142osi\u0142 b\u0142\u0105d i si\u0119 nie uruchomi\u0142. S\u0142usznie, bo trzeba by\u0142o przeczyta\u0107 <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">dokumentacj\u0119<\/a><\/noindex> uwa\u017cniej. Jest tam napisane, \u017ce aby wszystko by\u0142o w porz\u0105dku, nale\u017cy dodatkowo w\u0142\u0105czy\u0107 jeszcze jeden parametr.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nPo co to jest potrzebne? Kiedy nasze zadanie przestaje wymaga\u0107 takiej ilo\u015bci zasob\u00f3w, Spark powinien zwr\u00f3ci\u0107 je do og\u00f3lnej puli. Najbardziej czasoch\u0142onna faza w prawie ka\u017cdym zadaniu MapReduce to faza Shuffle. Ten parametr pozwala zachowa\u0107 dane, kt\u00f3re powstaj\u0105 w tej fazie, a tym samym zwolni\u0107 executory. A executor \u2014 to proces, kt\u00f3ry na w\u0119\u017ale roboczym oblicza wszystko. Ma okre\u015blon\u0105 liczb\u0119 rdzeni procesora i okre\u015blon\u0105 ilo\u015b\u0107 pami\u0119ci.<\/p>\n<p>Dodali\u015bmy ten parametr. Wszystko wydaje si\u0119 dzia\u0142a\u0107. Zauwa\u017cono, \u017ce uczestnikom naprawd\u0119 zacz\u0119\u0142o si\u0119 przydziela\u0107 wi\u0119cej zasob\u00f3w, kiedy ich potrzebowali. Ale pojawi\u0142 si\u0119 inny problem \u2014 w pewnym momencie inni uczestnicy si\u0119 budzili i te\u017c chcieli korzysta\u0107 z Sparka, a tam wszystko by\u0142o zaj\u0119te, wi\u0119c byli niezadowoleni. Mo\u017cna ich zrozumie\u0107. Zacz\u0119li\u015bmy przegl\u0105da\u0107 dokumentacj\u0119. Okaza\u0142o si\u0119, \u017ce jest jeszcze kilka parametr\u00f3w, kt\u00f3re mog\u0105 wp\u0142yn\u0105\u0107 na ten proces. Na przyk\u0142ad, je\u015bli executor jest w trybie oczekiwania \u2014 po jakim czasie mo\u017cna zabra\u0107 mu zasoby?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nW naszym przypadku \u2014 je\u015bli twoje executory nic nie robi\u0105 przez dwie minuty, to prosz\u0119, zwr\u00f3\u0107 je do wsp\u00f3lnej puli. Ale nawet ten parametr nie zawsze wystarczy\u0142. By\u0142o wida\u0107, \u017ce kto\u015b od dawna nic nie robi, a zasoby nie s\u0105 zwalniane. Okaza\u0142o si\u0119, \u017ce istnieje jeszcze jeden specjalny parametr \u2014 po jakim czasie nale\u017cy odebra\u0107 executory, kt\u00f3re zawieraj\u0105 dane w pami\u0119ci podr\u0119cznej. Domy\u015blnie ten parametr by\u0142 ustawiony na \u2014 niesko\u0144czono\u015b\u0107! Naprawili\u015bmy to.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nTo znaczy, \u017ce je\u015bli w ci\u0105gu 5 minut twoje executory nic nie robi\u0105, oddaj je do wsp\u00f3lnej puli. W takim trybie pr\u0119dko\u015b\u0107 zwalniania i dostarczania zasob\u00f3w dla du\u017cej liczby u\u017cytkownik\u00f3w sta\u0142a si\u0119 odpowiednia. Liczba niezadowolonych zmniejszy\u0142a si\u0119. Ale postanowili\u015bmy p\u00f3j\u015b\u0107 dalej i ograniczy\u0107 maksymaln\u0105 liczb\u0119 executor\u00f3w na jedn\u0105 aplikacj\u0119 \u2014 w zasadzie na jednego uczestnika programu.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nTeraz, oczywi\u015bcie, pojawi\u0142y si\u0119 niezadowolone osoby z drugiej strony \u2014 \u201eklaster stoi bezczynnie, a mam tylko 19 executor\u00f3w\u201d, ale c\u00f3\u017c zrobi\u0107 \u2014 potrzebny jest jaki\u015b odpowiedni balans. Nie da si\u0119 wszystkich uszcz\u0119\u015bliwi\u0107.<\/p>\n<p>I jeszcze jedna ma\u0142a historia zwi\u0105zana ze specyfik\u0105 naszego przypadku. Kiedy\u015b na zaj\u0119cia praktyczne sp\u00f3\u017ani\u0142o si\u0119 kilka os\u00f3b, i ich Spark z jakiego\u015b powodu nie wystartowa\u0142. Sprawdzili\u015bmy liczb\u0119 dost\u0119pnych zasob\u00f3w \u2014 wydawa\u0142o si\u0119, \u017ce s\u0105. Spark powinien wystartowa\u0107. Na szcz\u0119\u015bcie, do tego czasu dokumentacja ju\u017c gdzie\u015b zapisa\u0142a si\u0119 w pod\u015bwiadomo\u015bci i przypomnieli\u015bmy sobie, \u017ce przy uruchamianiu Spark szuka portu, na kt\u00f3rym mo\u017ce wystartowa\u0107. Je\u015bli pierwszy port z zakresu jest zaj\u0119ty, przechodzi do nast\u0119pnego. Je\u015bli jest wolny, to go zajmuje. I jest parametr, kt\u00f3ry wskazuje maksymaln\u0105 liczb\u0119 pr\u00f3b dla tego. Domy\u015blnie \u2014 to 16. Liczba ta jest mniejsza ni\u017c liczba os\u00f3b w naszej grupie na zaj\u0119ciach. W zwi\u0105zku z tym, po 16 pr\u00f3bach Spark rezygnowa\u0142 i m\u00f3wi\u0142, \u017ce nie mo\u017ce wystartowa\u0107. Naprawili\u015bmy ten parametr.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nTeraz opowiem o niekt\u00f3rych ustawieniach, kt\u00f3re nie s\u0105 ju\u017c zbytnio zwi\u0105zane ze specyfik\u0105 naszego przypadku.<\/p>\n<p>Aby szybciej uruchomi\u0107 Spark, zaleca si\u0119 skompresowa\u0107 folder jars znajduj\u0105cy si\u0119 w domowym katalogu SPARK_HOME i umie\u015bci\u0107 na HDFS. W ten spos\u00f3b nie b\u0119dzie traci\u0107 czasu na \u0142adowanie tych jar\u00f3w na w\u0119z\u0142y robocze.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nZalecamy te\u017c u\u017cywanie kryo jako serializera, aby przyspieszy\u0107 prac\u0119. Jest bardziej zoptymalizowany ni\u017c ten domy\u015blny.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nIstnieje te\u017c od dawna problem z Spark, \u017ce cz\u0119sto pada z powodu braku pami\u0119ci. Zwykle dzieje si\u0119 to w momencie, gdy pracownicy wszystko oblicz\u0105 i wysy\u0142aj\u0105 wyniki do sterownika. Ustawili\u015bmy ten parametr na wy\u017csz\u0105 warto\u015b\u0107. Domy\u015blnie wynosi 1GB, a my ustawili\u015bmy na 3.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nI na koniec, jako deser. Jak zaktualizowa\u0107 Spark do wersji 2.1 na dystrybucji HortonWorks \u2014 HDP 2.5.3.0. Ta wersja HDP zawiera zainstalowan\u0105 wersj\u0119 2.0, ale pewnego razu postanowili\u015bmy, \u017ce Spark rozwija si\u0119 do\u015b\u0107 aktywnie, a ka\u017cda nowa wersja naprawia jakie\u015b b\u0142\u0119dy i oferuje dodatkowe mo\u017cliwo\u015bci, w tym dla python API, wi\u0119c postanowili\u015bmy, \u017ce trzeba przeprowadzi\u0107 aktualizacj\u0119.<\/p>\n<p>Pobrali\u015bmy wersj\u0119 z oficjalnej strony pod Hadoop 2.7. Wypakowali\u015bmy, wrzucili\u015bmy do folderu HDP. Ustawili\u015bmy symlinki jak trzeba. Uruchamiamy \u2014 nie startuje. Wy\u015bwietla bardzo niezrozumia\u0142y b\u0142\u0105d.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nPo googlowaniu dowiedzieli\u015bmy si\u0119, \u017ce Spark postanowi\u0142 nie czeka\u0107, a\u017c Hadoop zostanie zaktualizowany, i zdecydowa\u0142 si\u0119 na now\u0105 wersj\u0119 jersey. Oni sami si\u0119 tam k\u0142\u00f3c\u0105 na ten temat w JIRA. Rozwi\u0105zaniem by\u0142o pobranie <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey w wersji 1.17.1<\/a><\/noindex>. Wrzucamy to do folderu jars w SPARK_HOME, ponownie robimy zip i wrzucamy na HDFS.<\/p>\n<p>Obeszli\u015bmy ten b\u0142\u0105d, ale pojawi\u0142 si\u0119 nowy, do\u015b\u0107 niejasny.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: Yarn application has already ended! It might have been killed or unable to launch application master<\/code><\/pre>\n<p>\nPr\u00f3buj\u0105c uruchomi\u0107 wersj\u0119 2.0 \u2014 wszystko jest w porz\u0105dku. Spr\u00f3buj zgadn\u0105\u0107, o co chodzi. Zajrzeliby\u015bmy do log\u00f3w tej aplikacji i zobaczyli\u015bmy co\u015b takiego:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nOg\u00f3\u0142em, z jakiego\u015b powodu hdp.version nie zosta\u0142a rozwi\u0105zana. Po googlowaniu znale\u017ali\u015bmy rozwi\u0105zanie. Trzeba wej\u015b\u0107 w Ambari w ustawienia YARN i doda\u0107 parametr w custom yarn-site:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nTa magia zadzia\u0142a\u0142a i Spark ruszy\u0142. Przetestowali\u015bmy kilka naszych notebook\u00f3w Jupyter. Wszystko dzia\u0142a. Jeste\u015bmy gotowi na pierwsze zaj\u0119cia z Sparka w sobot\u0119 (ju\u017c jutro)!<\/p>\n<p><b>UPD<\/b>. Na zaj\u0119ciach wysz\u0142a jeszcze jedna sprawa. W pewnym momencie YARN przesta\u0142 przydziela\u0107 kontenery dla Sparka. W YARN trzeba by\u0142o poprawi\u0107 parametr, kt\u00f3ry domy\u015blnie wynosi\u0142 0.2:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nTo znaczy, tylko 20% zasob\u00f3w bra\u0142o udzia\u0142 w przydzielaniu zasob\u00f3w. Zmieniaj\u0105c parametry, zrestartowano YARN. Problem zosta\u0142 rozwi\u0105zany, a pozostali uczestnicy r\u00f3wnie\u017c mogli uruchomi\u0107 kontekst Spark.<br \/>\n<br \/>\u0179r\u00f3d\u0142o: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/newprolab\/blog\/327556\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442! \u0412\u0447\u0435\u0440\u0430 \u043d\u0430 \u043c\u0438\u0442\u0430\u043f\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u043c Apache Spark, \u043e\u0442 \u0440\u0435\u0431\u044f\u0442 \u0438\u0437 Rambler&#038;Co, \u0431\u044b\u043b\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043e\u0442 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u044d\u0442\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430. \u0420\u0435\u0448\u0438\u043b\u0438 \u043f\u043e \u0435\u0433\u043e \u0441\u043b\u0435\u0434\u0430\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0422\u0435\u043c\u0430 \u043d\u0435\u043f\u0440\u043e\u0441\u0442\u0430\u044f \u2014 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u043f\u044b\u0442\u043e\u043c \u0442\u043e\u0436\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043c\u044b \u0442\u043e\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0432\u0432\u043e\u0434\u043d\u0430\u044f \u2014 \u043a\u0430\u043a \u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-30548","post","type-post","status-publish","format-standard","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pl\/blog\/news\/konfigurirovanie-spark-na-yarn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Spark \u043d\u0430 YARN | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pl\/blog\/news\/konfigurirovanie-spark-na-yarn\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:36:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:36:08+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Konfiguracja Sparka na YARN | ProHoster","description":"Cze\u015b\u0107 Habr!","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 Spark \u043d\u0430 YARN | ProHoster","og:description":"\u0425\u0430\u0431\u0440, \u043f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/pl\/blog\/news\/konfigurirovanie-spark-na-yarn","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:36:08+00:00","article:modified_time":"2019-10-31T18:36:08+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"30548","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 01:45:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:33:26","updated":"2026-01-21 01:45:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}