{"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\/it\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Configurazione di Spark su YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao Habr! Ieri a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">un meetup dedicato ad Apache Spark<\/a><\/noindex>, dai ragazzi di Rambler&#038;Co, ci sono state molte domande dai partecipanti riguardo alla configurazione di questo strumento. Abbiamo deciso di condividere la nostra esperienza a riguardo. \u00c8 un argomento complesso \u2014 perci\u00f2 vi invitiamo a condividere la vostra esperienza anche nei commenti, magari anche noi abbiamo frainteso o utilizzato qualcosa in modo errato.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nUna breve introduzione - come utilizziamo Spark. Abbiamo un programma di tre mesi <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201cSpecialista in Big Data\u201d<\/a><\/noindex>, e durante il secondo modulo i nostri partecipanti lavorano con questo strumento. Di conseguenza, il nostro compito, come organizzatori, \u00e8 preparare il cluster per l'uso in questo contesto.<\/p>\n<p>La particolarit\u00e0 del nostro utilizzo \u00e8 che il numero di persone che lavorano contemporaneamente su Spark pu\u00f2 essere equivalente all'intero gruppo. Ad esempio, durante il seminario, quando tutti provano qualcosa contemporaneamente e seguono il nostro insegnante. E si tratta di un numero considerevole - a volte quasi 40 persone. Probabilmente non ci sono molte aziende al mondo che affrontano un tale scenario di utilizzo.<\/p>\n<p>Ora vi racconter\u00f2 come e perch\u00e9 abbiamo scelto determinati parametri di configurazione.<\/p>\n<p>Iniziamo dall'inizio. Spark ha 3 opzioni per lavorare su un cluster: standalone, utilizzando Mesos e utilizzando YARN. Abbiamo deciso di scegliere la terza opzione, perch\u00e9 per noi era logica. Abbiamo gi\u00e0 un cluster Hadoop. I nostri partecipanti lo conoscono gi\u00e0 bene nella sua architettura. Utilizziamo YARN.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nOra diventa interessante. Ognuna di queste 3 opzioni di distribuzione ha 2 modalit\u00e0 di deployment: client e cluster. Secondo <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">documentazione<\/a><\/noindex> e vari link su Internet, si pu\u00f2 concludere che il client \u00e8 adatto per il lavoro interattivo - ad esempio, tramite un notebook jupyter, mentre il cluster \u00e8 pi\u00f9 adatto per soluzioni di produzione. Nel nostro caso ci interessava il lavoro interattivo, quindi:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nIn generale, da questo momento Spark inizier\u00e0 a funzionare in qualche modo su YARN, ma non ci bastava. Poich\u00e9 abbiamo un programma sui Big Data, a volte i partecipanti sentivano la mancanza di ci\u00f2 che si otteneva con una distribuzione uniforme delle risorse. E qui abbiamo trovato una cosa interessante: l'allocazione dinamica delle risorse. In sintesi, se hai un compito pesante e il cluster \u00e8 libero (ad esempio, al mattino), utilizzando questa opzione Spark pu\u00f2 fornirti risorse aggiuntive. La necessit\u00e0 \u00e8 calcolata secondo una formula astuta. Non entreremo nei dettagli, funzionano piuttosto bene.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nAbbiamo impostato questo parametro, e all'avvio Spark ha segnalato un errore e non si \u00e8 avviato. Giusto, perch\u00e9 bisognava leggere <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">la documentazione<\/a><\/noindex> con pi\u00f9 attenzione. \u00c8 indicato che affinch\u00e9 tutto funzioni, \u00e8 necessario attivare un parametro aggiuntivo.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nA cosa serve? Quando il nostro job non richiede pi\u00f9 cos\u00ec tante risorse, Spark deve restituirle al pool comune. La fase pi\u00f9 dispendiosa in termini di tempo in quasi qualsiasi compito MapReduce \u00e8 la fase di Shuffle. Questo parametro consente di conservare i dati che si generano in questa fase e, di conseguenza, liberare gli executor. Un executor \u00e8 il processo che calcola tutto sul worker. Ha una certa quantit\u00e0 di core CPU e una certa quantit\u00e0 di memoria.<\/p>\n<p>Abbiamo aggiunto questo parametro. Tutto sembrava funzionare. \u00c8 diventato evidente che ai partecipanti venivano effettivamente fornite pi\u00f9 risorse quando ne avevano bisogno. Ma \u00e8 emerso un altro problema: a un certo punto, altri partecipanti si svegliavano e volevano anche utilizzare Spark, mentre era tutto occupato, e non erano soddisfatti. Si possono capire. Abbiamo iniziato a consultare la documentazione. Si \u00e8 scoperto che c'erano anche un certo numero di parametri tramite i quali si poteva influenzare il processo. Ad esempio, se l'executor \u00e8 in modalit\u00e0 attesa, dopo quanto tempo si possono riprendere le risorse?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nNel nostro caso, se i vostri executors non fanno nulla per due minuti, per favore riportateli nel pool generale. Ma nemmeno questo parametro era sempre sufficiente. Era evidente che una persona non stava facendo nulla da tempo, ma le risorse non venivano rilasciate. Si \u00e8 scoperto che c'era anche un parametro speciale: dopo quanto tempo ritirare gli executors che contengono dati nella cache. Di default, questo parametro era impostato su: infinity! L'abbiamo corretto.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nCio\u00e8, se i vostri executors non fanno nulla per 5 minuti, restituiteli al pool generale. In questo modo, la velocit\u00e0 di rilascio e assegnazione delle risorse per un gran numero di utenti \u00e8 diventata soddisfacente. Il numero di insoddisfazioni \u00e8 diminuito. Ma abbiamo deciso di andare oltre e limitare il numero massimo di executors per una singola applicazione \u2014 fondamentalmente per un singolo partecipante al programma.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nOra, ovviamente, ci sono stati scontenti dall'altra parte \u2014 \"il cluster \u00e8 inattivo e ho solo 19 executors\", ma cosa possiamo fare \u2014 \u00e8 necessario trovare un giusto equilibrio. Non \u00e8 possibile rendere tutti felici.<\/p>\n<p>E un'altra piccola storia, legata alla specificit\u00e0 del nostro caso. Un giorno, alcune persone sono arrivate in ritardo a una lezione pratica, e per qualche motivo Spark non \u00e8 partito. Abbiamo guardato al numero di risorse disponibili \u2014 sembrava che ci fossero. Spark dovrebbe partire. Per fortuna, a quel punto la documentazione era gi\u00e0 nella nostra mente, e ci siamo ricordati che all'avvio Spark cerca una porta su cui avviarsi. Se la prima porta dell'intervallo \u00e8 occupata, passa a quella successiva. Se \u00e8 libera, la occupa. E c'\u00e8 un parametro che indica il numero massimo di tentativi per questo. Di default, \u00e8 impostato su 16. Questo numero \u00e8 inferiore a quello delle persone nel nostro gruppo per la lezione. Di conseguenza, dopo 16 tentativi, Spark abbandonava e diceva che non riusciva a partire. Abbiamo corretto questo parametro.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nOra parler\u00f2 di alcune configurazioni, non molto correlate alla specificit\u00e0 del nostro caso.<\/p>\n<p>Per un avvio pi\u00f9 rapido di Spark, \u00e8 consigliato archiviare la cartella jars, che si trova nella directory principale di SPARK_HOME, e caricarla su HDFS. In questo modo non perder\u00e0 tempo a caricare questi jar sui worker.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\n\u00c8 consigliabile utilizzare kryo come serializzatore per un funzionamento pi\u00f9 veloce. \u00c8 pi\u00f9 ottimizzato rispetto a quello predefinito.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nC'\u00e8 anche un problema noto con Spark, che spesso va in crash per mancanza di memoria. Questo accade frequentemente quando i worker hanno completato i calcoli e inviano il risultato al driver. Abbiamo impostato questo parametro su un valore maggiore. Di default \u00e8 1GB, noi lo abbiamo impostato a 3.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nE infine, come dessert. Come aggiornare Spark alla versione 2.1 sulla distribuzione HortonWorks \u2014 HDP 2.5.3.0. Questa versione di HDP include una versione preinstallata 2.0, ma un giorno abbiamo deciso che Spark si sviluppa molto rapidamente, e ogni nuova versione risolve alcuni bug e offre ulteriori funzionalit\u00e0, incluso il supporto per l'API Python, quindi abbiamo deciso di fare un aggiornamento.<\/p>\n<p>Abbiamo scaricato la versione dal sito ufficiale per Hadoop 2.7. L'abbiamo estratta e posizionata nella cartella di HDP. Abbiamo creato i collegamenti simbolici necessari. Tentiamo di avviare \u2014 ma non si avvia. Riporta un errore poco chiaro.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nCercando su Google, abbiamo scoperto che Spark ha deciso di non aspettare che Hadoop si evolvesse, e ha scelto di usare una nuova versione di jersey. Si stanno confrontando su questo tema nella JIRA. La soluzione \u00e8 stata \u2014 scaricare <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey versione 1.17.1<\/a><\/noindex>. Metterlo nella cartella jars in SPARK_HOME, ricreare il zip e caricarlo su HDFS.<\/p>\n<p>Abbiamo bypassato questo errore, ma ne \u00e8 emerso uno nuovo e piuttosto evasivo.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: L'applicazione Yarn \u00e8 gi\u00e0 terminata! Potrebbe essere stata interrotta o non riuscita a avviare l'application master<\/code><\/pre>\n<p>\nNel frattempo proviamo a eseguire la versione 2.0 \u2014 tutto ok. Prova a indovinare quale sia il problema. Siamo entrati nei log di questa applicazione e abbiamo visto qualcosa del genere:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nDunque, per qualche motivo hdp.version non era risolvibile. Cercando online, abbiamo trovato la soluzione. \u00c8 necessario accedere alle impostazioni di YARN in Ambari e aggiungere il parametro nelle impostazioni personalizzate di yarn-site:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nQuesta magia ha funzionato e Spark ha iniziato a funzionare. Abbiamo testato alcuni dei nostri notebook Jupyter. Tutto funziona. Siamo pronti per la prima lezione di Spark di sabato (gi\u00e0 domani)!<\/p>\n<p><b>UPD<\/b>. Durante la lezione \u00e8 emerso un altro problema. A un certo punto YARN ha smesso di fornire contenitori per Spark. Era necessario modificare un parametro in YARN che di default era impostato a 0.2:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nCio\u00e8 solo il 20% delle risorse ha partecipato alla distribuzione delle risorse. Modificando i parametri, abbiamo riavviato YARN. Il problema \u00e8 stato risolto e anche gli altri partecipanti sono riusciti a avviare il contesto spark.<br \/>\n<br \/>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47Configurazione di Spark su YARN | ProHoster","description":"Habr, ciao!","canonical_url":"https:\/\/prohoster.info\/it\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}