{"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\/nl\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Spark configureren op YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Habr, hallo! Gisteren op <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">de meetup over Apache Spark<\/a><\/noindex>, van de jongens van Rambler&#038;Co, waren er best veel vragen van deelnemers over het configureren van deze tool. We hebben besloten om onze ervaringen te delen. Het onderwerp is complex \u2014 daarom moedigen we ook aan om ervaringen in de reacties te delen; misschien begrijpen we ook iets niet goed of gebruiken we het verkeerd.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEen korte inleiding \u2014 hoe wij Spark gebruiken. We hebben een drie maanden durend programma <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201cSpecialist in big data\u201d<\/a><\/noindex>, en in de tweede module werken onze deelnemers met deze tool. Onze taak als organisatoren is dan ook om een cluster voor gebruik in dit geval voor te bereiden.<\/p>\n<p>Een bijzonderheid van ons gebruik is dat het aantal mensen dat tegelijkertijd met Spark werkt gelijk kan zijn aan de hele groep. Bijvoorbeeld, tijdens een seminar, wanneer iedereen tegelijkertijd iets probeert en herhaalt wat onze docent zegt. Soms zijn dat wel 40 personen. Er zijn waarschijnlijk niet veel bedrijven ter wereld die met zo'n gebruiksscenario te maken krijgen.<\/p>\n<p>Hierna vertel ik hoe en waarom we bepaalde configuratieparameters hebben gekozen.<\/p>\n<p>Laten we beginnen bij het begin. Spark heeft 3 manieren om op een cluster te werken: standalone, met Mesos en met YARN. We besloten de derde optie te kiezen, omdat deze voor ons logisch was. We hebben al een Hadoop-cluster. Onze deelnemers zijn al goed bekend met de architectuur ervan. Laten we YARN gebruiken.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nDan wordt het interessanter. Elk van deze 3 uitrolopties heeft 2 opties voor de implementatie: client en cluster. Gebaseerd op <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">de documentatie<\/a><\/noindex> en verschillende links op internet, kan worden geconcludeerd dat client geschikt is voor interactieve werkzaamheden \u2014 bijvoorbeeld via Jupyter Notebook, terwijl de cluster meer geschikt is voor productieoplossingen. In ons geval was interactieve samenwerking het meest interessant, daarom:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nIn feite zou Spark vanaf dit moment al op YARN kunnen werken, maar dat was niet genoeg voor ons. Aangezien ons programma zich richt op big data, ontbrak het soms aan wat er werd verkregen met een gelijkmatige verdeling van middelen. En hier vonden we iets interessants \u2014 dynamische toewijzing van middelen. Kort gezegd: als je een zware taak hebt en het cluster vrij is (bijvoorbeeld 's ochtends), kan Spark je via deze optie extra middelen geven. De noodzaak wordt daar berekend volgens een slimme formule. We gaan hier niet te veel op in \u2014 het werkt redelijk goed.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nWe hebben deze parameter ingesteld, en bij het opstarten van Spark gaf het een foutmelding en startte het niet op. Dat is juist, want we hadden de <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">documentatie<\/a><\/noindex> nauwkeuriger moeten lezen. Daarin staat dat om alles goed te laten verlopen, er nog een extra parameter moet worden ingeschakeld.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nWat is het nut ervan? Wanneer onze job niet meer zoveel middelen vereist, moet Spark deze teruggeven aan de algemene pool. De meest tijdrovende fase in bijna elke MapReduce-taak is de Shuffle-fase. Deze parameter stelt ons in staat gegevens te behouden die in deze fase ontstaan en vrij te geven executors. Een executor is een proces dat alles op de worker berekent. Het heeft een bepaalde hoeveelheid CPU-kernen en een bepaalde hoeveelheid geheugen.<\/p>\n<p>We hebben deze parameter toegevoegd. Het leek allemaal goed te werken. Het was duidelijk dat deelnemers daadwerkelijk meer middelen kregen wanneer ze dat nodig hadden. Maar er ontstond een ander probleem \u2014 op een gegeven moment kwamen andere deelnemers weer in actie en wilden ook Spark gebruiken, maar alles was bezet, en ze waren niet tevreden. We kunnen ze begrijpen. We gingen de documentatie bekijken. Daar bleek dat er nog meerdere parameters zijn waarmee we invloed kunnen uitoefenen op het proces. Bijvoorbeeld, als een executor in de wachtstand staat \u2014 na hoeveel tijd kunnen we de middelen terugtrekken?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nIn ons geval: als uw executors gedurende twee minuten niets doen, geef ze dan terug aan de algemene pool. Maar zelfs deze parameter was niet altijd voldoende. Het was duidelijk dat iemand al een lange tijd niets deed, maar de middelen werden niet vrijgegeven. Het bleek dat er nog een speciale parameter was \u2014 na hoeveel tijd executors die gecachte gegevens bevatten, moeten worden teruggenomen. Standaard stond deze parameter op \u2014 infinity! We hebben dit aangepast.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nDus als uw executors gedurende 5 minuten niets doen, geef ze dan terug aan de algemene pool. In deze modus werd de snelheid van het vrijgeven en toewijzen van middelen voor een groot aantal gebruikers acceptabel. Het aantal klachten nam af. Maar we hebben besloten verder te gaan en het maximale aantal executors per applicatie te beperken \u2014 in wezen per deelnemer aan het programma.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nNu zijn er natuurlijk ontevreden mensen aan de andere kant \u2014 \u201chet cluster staat stil, en ik heb maar 19 executors\u201d, maar wat kun je eraan doen \u2014 er moet een goede balans zijn. Iedereen tevreden stellen is niet mogelijk.<\/p>\n<p>En nog een klein verhaal met betrekking tot de specifics van onze casus. Een paar mensen kwamen te laat naar de praktische les, en om de een of andere reden startte hun Spark niet. We keken naar het aantal beschikbare middelen \u2014 het leek genoeg. Spark zou moeten starten. Gelukkig was de documentatie inmiddels ergens in ons hoofd opgeslagen, en we herinnerden ons dat wanneer je Spark start, het een poort zoekt om te beginnen. Als de eerste poort in het bereik bezet is, gaat het naar de volgende. Als deze vrij is, neemt het die in gebruik. En er is een parameter die het maximale aantal pogingen hiervoor aangeeft. Standaard is dit 16. Dit getal is minder dan het aantal mensen in onze groep tijdens de les. Daarom gooide Spark de handdoek in de ring na 16 pogingen en zei dat het niet kon starten. We hebben deze parameter aangepast.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nDaarna zal ik enkele instellingen bespreken die minder sterk verbonden zijn met de specifics van onze casus.<\/p>\n<p>Voor een snellere start van Spark is het aan te raden de jars-map, die zich in de thuisdirectory SPARK_HOME bevindt, te archiveren en op HDFS te plaatsen. Hierdoor zal hij geen tijd verspillen aan het laden van deze jars op de workers.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nVoor een snellere werking wordt aanbevolen om Kryo als serializer te gebruiken. Het is beter geoptimaliseerd dan de standaardoptie.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nEr is een langdurig probleem met Spark dat het vaak crashes door geheugenproblemen. Dit gebeurt vaak op het moment dat de workers alles hebben berekend en de resultaten naar de driver sturen. We hebben deze parameter vergroot. Standaard is het 1GB, wij hebben het op 3 ingesteld.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nAls laatste, hoe Spark te upgraden naar versie 2.1 op de HortonWorks-distributie - HDP 2.5.3.0. Deze versie van HDP bevat een voorge\u00efnstalleerde versie 2.0, maar we hebben ooit besloten dat Spark zich vrij actief ontwikkelt, en elke nieuwe versie verhelpt bugfixes en biedt extra mogelijkheden, ook voor de Python API. Daarom hebben we besloten om een update uit te voeren.<\/p>\n<p>We hebben de versie van de offici\u00eble website voor Hadoop 2.7 gedownload. We hebben het uitgepakt, in de HDP-map geplaatst en de symlinks gemaakt zoals het hoort. We starten het op, maar het wil niet opstarten. Er verschijnt een onduidelijke foutmelding.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nNa een Google-zoekactie ontdekten we dat Spark ervoor heeft gekozen om niet te wachten totdat Hadoop klaar is, en besloten om een nieuwe versie van Jersey te gebruiken. Ze hebben zelf ruzie hierover in JIRA. De oplossing was - download <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey versie 1.17.1<\/a><\/noindex>. Plaats dit in de jars-map in SPARK_HOME, maak opnieuw een zip en upload deze naar HDFS.<\/p>\n<p>We hebben deze fout omzeild, maar er ontstond een nieuwe en behoorlijk onduidelijke.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: Yarn-toepassing is al be\u00ebindigd! Het kan zijn dat het is be\u00ebindigd of dat het moeilijk was om de toepassingsmaster te starten.<\/code><\/pre>\n<p>\nBij het proberen om versie 2.0 op te starten - alles werkt goed. Probeer maar te raden wat het probleem is. We hebben in de logs van deze applicatie gekeken en iets als volgt gezien:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nOver het algemeen kon hdp.version om de een of andere reden niet worden opgelost. Na een Google-zoekactie vonden we een oplossing. We moesten naar de YARN-instellingen in Ambari gaan en daar een parameter aan de aangepaste yarn-site toevoegen:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nDeze magie hielp, en Spark ging van start. We hebben een aantal van onze Jupyter-notebooks getest. Alles werkt. We zijn klaar voor de eerste les over Spark op zaterdag (al morgen)!<\/p>\n<p><b>UPD<\/b>. Tijdens de les bleek er nog een probleem. Op een gegeven moment gaf YARN geen containers meer voor Spark. In YARN moest een parameter worden aangepast, die standaard op 0.2 stond:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nDat wil zeggen dat slechts 20% van de middelen betrokken was bij de toewijzing van hulpbronnen. Door de parameters te wijzigen, herstarten we YARN. Het probleem was opgelost en de andere deelnemers konden ook de Spark-context starten.<br \/>\n<br \/>Bron: <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.3 - 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\/nl\/blog\/news\/konfigurirovanie-spark-na-yarn\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Configuratie van Spark op YARN | ProHoster","description":"Habr, hallo!","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}