{"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\/hr\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Konfiguriranje Sparka na YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Habr, zdravo! Ju\u010der na <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">mitapu posve\u0107enom Apache Sparku<\/a><\/noindex>, od ekipe iz Rambler&#038;Co, bilo je prili\u010dno mnogo pitanja od sudionika vezanih uz konfiguraciju ovog alata. Odlu\u010dili smo podijeliti svoje iskustvo. Tema je slo\u017eena \u2014 stoga vas pozivamo da dijelite svoja iskustva i u komentarima, mo\u017eda i mi ne\u0161to ne razumijemo ili koristimo pogre\u0161no.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nKratko uvodno \u2014 kako mi koristimo Spark. Imamo trojmese\u010dni program <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201eSpecijalista za velike podatke\u201d<\/a><\/noindex>, a tokom drugog modula na\u0161i u\u010desnici rade sa ovim alatom. Shodno tome, na\u0161 zadatak kao organizatora je da pripremimo klaster za kori\u0161\u0107enje u okviru takvog projekta.<\/p>\n<p>Karakteristika na\u0161e upotrebe le\u017ei u tome da broj ljudi koji istovremeno rade na Sparku mo\u017ee biti jednak celoj grupi. Na primer, na seminaru, kada svi istovremeno ne\u0161to probavaju i ponavljaju za na\u0161im predava\u010dem. A to je ponekad \u010dak 40 ljudi. Verovatno, nije mnogo kompanija u svetu koje se susre\u0107u sa takvim scenarijem kori\u0161\u0107enja.<\/p>\n<p>Dalje \u0107u objasniti kako i za\u0161to smo bira\u010dili odre\u0111ene parametre konfiguracije.<\/p>\n<p>Po\u010dnimo od samog po\u010detka. Spark ima 3 na\u010dina rada na klasteru: standalone, kori\u0161\u0107enjem Mesosa i kori\u0161\u0107enjem YARN-a. Odlu\u010dili smo se za tre\u0107u opciju, jer nam je bila logi\u010dna. Ve\u0107 imamo Hadoop klaster. Na\u0161i u\u010desnici su dobro upoznati sa njegovom arhitekturom. Hajde da koristimo YARN.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nDalje postaje zanimljivije. Svaka od ovih 3 opcija implementacije ima 2 na\u010dina deploy-a: client i cluster. Na osnovu <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">dokumentaciju<\/a><\/noindex> i razli\u010ditih linkova na internetu, mo\u017ee se, zaklju\u010dno re\u0107i, da je client pogodna za interaktivni rad \u2014 na primer, preko Jupyter notebooka, dok je cluster vi\u0161e orijentisan na produkcijska re\u0161enja. U na\u0161em slu\u010daju, zanimala nas je interaktivna upotreba, stoga:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nU su\u0161tini, od ovog trenutka Spark \u0107e nekako raditi na YARN-u, ali to nam nije bilo dovoljno. Budu\u0107i da imamo program o velikim podacima, ponekad u\u010desnicima nije bilo dovoljno onoga \u0161to se dobijalo u okviru ravnomernog raspore\u0111ivanja resursa. I ovde smo prona\u0161li zanimljivu stvar \u2014 dinami\u010dku alokaciju resursa. U kratkim crtama, osnovna ideja je slede\u0107a: ako imate te\u0161ki zadatak i klaster je slobodan (na primer, ujutro), tada vam ova opcija mo\u017ee omogu\u0107iti da Spark dobije dodatne resurse. Potra\u017enja se ra\u010duna prema slo\u017eenoj formuli. Ne\u0107emo se upu\u0161tati u detalje \u2014 ona funkcioni\u0161e prili\u010dno dobro.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nPostavili smo ovaj parametar, i prilikom pokretanja Spark je javio gre\u0161ku i nije se pokrenuo. U pravu je, jer je trebalo vi\u0161e paziti. <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">dokumentaciju<\/a><\/noindex> Tamo pi\u0161e da da bi sve bilo u redu, potrebno je uklju\u010diti jo\u0161 jedan dodatni parametar.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nZa\u0161to je to potrebno? Kada na\u0161em poslu vi\u0161e nisu potrebni toliki resursi, Spark ih treba vratiti u zajedni\u010dki pool. Najte\u017ea faza u skoro svakoj MapReduce zadatku je faza Shuffle. Ovaj parametar omogu\u0107ava \u010duvanje podataka koji se generi\u0161u u ovoj fazi i osloba\u0111anje executora. A executor je proces koji na radnoj stanici sve obra\u010dunava. Ima odre\u0111eni broj procesorskih jezgara i odre\u0111enu koli\u010dinu memorije.<\/p>\n<p>Dodali smo ovaj parametar. Sve je delovalo da radi. Postalo je primetno da u\u010desnicima zaista vi\u0161e resursa biva dodeljeno kada im je to potrebno. Ali se javio drugi problem \u2014 u nekom trenutku i drugi u\u010desnici su se probudili i tako\u0111e \u017eeleli koristiti Spark, a sve je bilo zauzeto, i nisu bili zadovoljni. Mogu ih razumeti. Po\u010deli smo gledati u dokumentaciju. Tu se ispostavilo da postoji jo\u0161 nekoliko parametara pomo\u0107u kojih se mo\u017ee uticati na proces. Na primer, ako je executor u re\u017eimu \u010dekanja \u2014 koliko vremena treba pro\u0107i pre nego \u0161to se mogu oduzeti resursi?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nU na\u0161em slu\u010daju \u2014 ako va\u0161i executors ni\u0161ta ne rade unutar dva minuta, molimo vas da ih vratite u zajedni\u010dki bazen. No, ni taj parametar uvijek nije bio dovoljan. Bilo je o\u010dito da osoba ve\u0107 dugo ne radi, a resursi se ne osloba\u0111aju. Ispostavilo se da postoji jo\u0161 jedan specijalni parametar \u2014 nakon koliko vremena uzimat \u0107e se executors koji sadr\u017ee ke\u0161irane podatke. Prema zadanim postavkama ovaj parametar je bio \u2014 beskona\u010dno! Ispravili smo ga.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nTo jest, ako va\u0161i executors ni\u0161ta ne rade unutar 5 minuta, vratite ih u zajedni\u010dki bazen. U tom re\u017eimu brzina osloba\u0111anja i dodjele resursa za veliko broj korisnika postala je zadovoljavaju\u0107a. Broj nezadovoljnih se smanjio. No, odlu\u010dili smo i\u0107i dalje i ograni\u010diti maksimalni broj executorsa po aplikaciji \u2014 u su\u0161tini po jednom sudioniku programa.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nSada, naravno, pojavili su se nezadovoljni s druge strane \u2014 \"klaster stoji, a ja imam samo 19 executorsa\", ali \u0161to da radimo \u2014 potreban je neki ispravan balans. Ne\u0107e svi biti sretni.<\/p>\n<p>I jo\u0161 jedna mala pri\u010da, povezana sa specifi\u010dno\u0161\u0107u na\u0161e situacije. Nekoliko ljudi zakasnilo je na prakti\u010dnu nastavu i nije im iz nekog razloga pokrenuo Spark. Pogledali smo na broj slobodnih resursa \u2014 \u010dinilo se da ih ima. Spark bi trebao pokrenuti. Na sre\u0107u, do tog trenutka dokumentacija se ve\u0107 negdje usadila u pam\u0107enje, i sjetili smo se da Spark prilikom pokretanja tra\u017ei port na kojem \u0107e se pokrenuti. Ako je prvi port u rasponu zauzet, prelazi na sljede\u0107i redom. Ako je slobodan, zauzima ga. I tu je parametar koji ukazuje na maksimalan broj poku\u0161aja za to. Prema zadanim postavkama \u2014 to je 16. Taj broj je manji od broja ljudi u na\u0161oj grupi na nastavi. Stoga je Spark nakon 16 poku\u0161aja odustao i rekao da ne mo\u017ee zapo\u010deti. Ispravili smo taj parametar.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nDalje \u0107u govoriti o nekim postavkama koje nisu previ\u0161e povezane sa specifi\u010dno\u0161\u0107u na\u0161e situacije.<\/p>\n<p>Za br\u017ei po\u010detak Sparka, preporu\u010duje se arhivirati mapu jars koja se nalazi u doma\u0107em direktoriju SPARK_HOME i staviti je na HDFS. Tada ne\u0107e gubiti vrijeme na u\u010ditavanje tih jarova po radnicima.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nTako\u0111er, za br\u017ei rad preporu\u010duje se kori\u0161tenje kryo serializer-a. On je optimiziraniji od onog koji je zadan.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nPostoji i stari problem sa Spark-om, da \u010desto pada zbog nedostatka memorije. To se obi\u010dno de\u0161ava kada radnici zavr\u0161e sve prora\u010dune i \u0161alju rezultate na voza\u010d. Mi smo ovaj parametar postavili na ve\u0107u vrijednost. Zadano je 1GB, mi smo stavili 3.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nI na kraju, kao desert. Kako a\u017eurirati Spark na verziju 2.1 na HortonWorks distribuciji \u2014 HDP 2.5.3.0. Ova verzija HDP sadr\u017ei unaprijed instaliranu verziju 2.0, ali smo nekako jednom odlu\u010dili da se Spark aktivno razvija, i svaka nova verzija ispravlja neke gre\u0161ke, plus donosi dodatne mogu\u0107nosti, uklju\u010duju\u0107i i za python API, stoga smo odlu\u010dili da trebamo napraviti a\u017euriranje.<\/p>\n<p>Preuzeli smo verziju sa slu\u017ebene stranice za Hadoop 2.7. Raspakirali smo je, stavili u mapu s HDP. Napravili smo simboli\u010dne linkove kako treba. Pokre\u0107emo \u2014 ne po\u010dinje. Ispisuje vrlo nejasnu gre\u0161ku.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nIstra\u017euju\u0107i, otkrili smo da Spark nije \u010dekao da Hadoop pokrene novu verziju jersey. Oni se me\u0111usobno sva\u0111aju oko ovog problema na JIRA. Rje\u0161enje je bilo \u2014 preuzeti <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey verziju 1.17.1<\/a><\/noindex>. Staviti to u mapu jars u SPARK_HOME, ponovo zipovati i staviti na HDFS.<\/p>\n<p>Ovu gre\u0161ku smo zaobi\u0161li, ali se pojavila nova i prili\u010dno nejasna.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: Yarn aplikacija je ve\u0107 zavr\u0161ila! Mogla je biti ubijena ili nije mogla pokrenuti aplikacijski master.<\/code><\/pre>\n<p>\nUsput, poku\u0161avamo pokrenuti verziju 2.0 \u2014 sve je u redu. Poku\u0161aj pogoditi u \u010demu je problem. U\u0161li smo u logove ove aplikacije i vidjeli ne\u0161to ovako:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nUglavnom, iz nekih razloga hdp.version nije rezolviran. Istra\u017euju\u0107i, prona\u0161li smo rje\u0161enje. Treba u\u0107i u Ambari, u postavke YARN-a i dodati parametar u custom yarn-site:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nOva magija je pomogla, i Spark je poletio. Testirali smo nekoliko na\u0161ih jupyter-notebook-a. Sve radi. Spremni smo za prvi sat o Sparku u subotu (ve\u0107 sutra)!<\/p>\n<p><b>UPD<\/b>. Na satu se pojavila jo\u0161 jedna problema. U nekom trenutku YARN je prestao isporu\u010divati kontejnere za Spark. U YARN-u je trebalo ispraviti parametar koji je prema zadanim postavkama bio 0.2:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nTo je zna\u010dilo da je samo 20% resursa bilo uklju\u010deno u raspodelu resursa. Promenili smo postavke i ponovo pokrenuli YARN. Problem je re\u0161en, a ostali u\u010desnici su tako\u0111e mogli da pokrenu spark kontekst.<br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/blog\/news\/konfigurirovanie-spark-na-yarn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Konfiguracija Sparka na YARN-u | ProHoster","description":"Habr, zdravo!","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}