{"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\/de\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Konfiguration von Spark auf YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Khabr, hallo! Gestern auf <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">dem Meetup, das sich mit Apache Spark besch\u00e4ftigte<\/a><\/noindex>, von den Jungs aus Rambler&amp;Co gab es einige Fragen von den Teilnehmern zum Konfigurieren dieses Tools. Deshalb haben wir beschlossen, unsere Erfahrungen damit zu teilen. Das Thema ist nicht einfach \u2013 daher schlagen wir vor, auch in den Kommentaren Erfahrungen zu teilen, vielleicht verstehen und nutzen wir auch etwas falsch.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nEine kurze Einf\u00fchrung \u2013 wie wir Spark verwenden. Wir haben ein dreimonatiges Programm <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201eSpezialist f\u00fcr gro\u00dfe Daten\u201c<\/a><\/noindex>, und im gesamten zweiten Modul arbeiten unsere Teilnehmer mit diesem Tool. Unsere Aufgabe als Veranstalter ist es, einen Cluster f\u00fcr die Verwendung in einem solchen Fall vorzubereiten.<\/p>\n<p>Das Besondere an unserer Nutzung ist, dass die Anzahl der Personen, die gleichzeitig mit Spark arbeiten, gleich der gesamten Gruppe sein kann. Beispielsweise beim Seminar, wenn alle gleichzeitig etwas ausprobieren und das Nachmachen, was unser Dozent zeigt. Das sind manchmal fast 40 Personen. Wahrscheinlich gibt es nicht viele Unternehmen auf der Welt, die mit diesem Nutzungsszenario konfrontiert sind.<\/p>\n<p>Im Folgenden werde ich erl\u00e4utern, wie und warum wir bestimmte Konfigurationsparameter ausgew\u00e4hlt haben.<\/p>\n<p>Lass uns ganz von vorne beginnen. Spark hat 3 M\u00f6glichkeiten, um auf einem Cluster zu arbeiten: standalone, mit Mesos und mit YARN. Wir haben uns f\u00fcr die dritte Option entschieden, weil sie f\u00fcr uns logisch war. Wir haben bereits einen Hadoop-Cluster. Unsere Teilnehmer sind mit seiner Architektur gut vertraut. Lassen Sie uns YARN verwenden.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nDann wird es interessanter. Jede dieser 3 Bereitstellungsoptionen hat 2 Bereitstellungsarten: client und cluster. Ausgehend von <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">Dokumentation<\/a><\/noindex> und verschiedenen Links im Internet kann man schlie\u00dfen, dass client f\u00fcr interaktive Arbeiten geeignet ist \u2014 beispielsweise \u00fcber Jupyter Notebook, w\u00e4hrend cluster mehr f\u00fcr Produktionsl\u00f6sungen geeignet ist. In unserem Fall interessierte uns die interaktive Arbeit, deshalb:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nIm Allgemeinen wird Spark ab diesem Zeitpunkt bereits auf YARN funktionieren, aber das war uns nicht genug. Da wir ein Programm \u00fcber gro\u00dfe Daten haben, fehlte es den Teilnehmern manchmal an den Ressourcen, die bei einer gleichm\u00e4\u00dfigen Verteilung zur Verf\u00fcgung standen. Und hier fanden wir eine interessante Sache \u2013 die dynamische Ressourcenallokation. Kurz gesagt, der Kern ist folgender: Wenn Sie eine rechenintensive Aufgabe haben und der Cluster frei ist (zum Beispiel morgens), dann kann Spark Ihnen mit dieser Option zus\u00e4tzliche Ressourcen zuteilen. Der Bedarf wird dort durch eine komplizierte Formel berechnet. Wir wollen ins Detail nicht eingehen \u2013 sie funktioniert ganz gut.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nWir haben diesen Parameter gesetzt, und beim Starten von Spark gibt es einen Fehler und es startet nicht. Richtig, denn wir h\u00e4tten lesen sollen <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">Dokumentation<\/a><\/noindex> aufmerksamer. Dort steht, dass f\u00fcr alles in Ordnung ist, noch ein zus\u00e4tzlicher Parameter aktiviert werden muss.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nWarum ist das n\u00f6tig? Wenn unser Job nicht mehr so viele Ressourcen ben\u00f6tigt, sollte Spark sie in den gemeinsamen Pool zur\u00fcckgeben. Der zeitaufw\u00e4ndigste Schritt in fast jeder MapReduce-Aufgabe ist die Shuffle-Phase. Dieser Parameter erm\u00f6glicht es, die Daten, die in dieser Phase entstehen, zu speichern und damit die Executors freizugeben. Ein Executor ist der Prozess, der auf dem Worker alles berechnet. Er hat eine bestimmte Anzahl von CPU-Kernen und einen bestimmten Speicher.<\/p>\n<p>Wir haben diesen Parameter hinzugef\u00fcgt. Es schien alles zu funktionieren. Es wurde deutlich, dass den Teilnehmern tats\u00e4chlich mehr Ressourcen zur Verf\u00fcgung gestellt wurden, wenn sie ben\u00f6tigt wurden. Aber ein anderes Problem trat auf \u2013 irgendwann wachten andere Teilnehmer auf und wollten ebenfalls Spark nutzen, aber alles war besetzt und sie waren unzufrieden. Das kann man nachvollziehen. Wir begannen, in der Dokumentation nachzusehen. Dort stellte sich heraus, dass es noch eine Reihe von Parametern gibt, mit denen man den Prozess beeinflussen kann. Zum Beispiel: Wenn der Executor im Leerlauf ist \u2013 nach wie viel Zeit k\u00f6nnen wir ihm die Ressourcen entziehen?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nIn unserem Fall \u2014 wenn Ihre Executors in zwei Minuten nichts tun, dann, seien Sie so freundlich, sie zur\u00fcck in den allgemeinen Pool zu geben. Aber auch dieser Parameter war nicht immer ausreichend. Es war deutlich zu sehen, dass die Person schon lange nichts macht, und die Ressourcen wurden nicht freigegeben. Es stellte sich heraus, dass es noch einen speziellen Parameter gibt \u2014 nach welcher Zeit die Executors ausgew\u00e4hlt werden sollen, die zwischengespeicherte Daten enthalten. Standardm\u00e4\u00dfig war dieser Parameter \u2014 unendlich! Wir haben ihn angepasst.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nDas hei\u00dft, wenn Ihre Executors in den letzten 5 Minuten nichts tun, geben Sie sie zur\u00fcck in den allgemeinen Pool. In diesem Modus wurde die Geschwindigkeit der Freigabe und Bereitstellung von Ressourcen f\u00fcr eine gro\u00dfe Anzahl von Benutzern akzeptabel. Die Anzahl der Unzufriedenen hat abgenommen. Aber wir haben uns entschieden, weiterzugehen und die maximale Anzahl der Executors f\u00fcr eine Anwendung zu begrenzen \u2014 im Grunde f\u00fcr einen Teilnehmer des Programms.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nNun gab es nat\u00fcrlich Beschwerden von anderer Seite \u2014 \u201eDer Cluster steht still, und ich habe nur 19 Executors\u201d, aber was soll's \u2014 es braucht irgendein richtiges Gleichgewicht. Es ist nicht m\u00f6glich, alle gl\u00fccklich zu machen.<\/p>\n<p>Und noch eine kleine Geschichte, die mit den Besonderheiten unseres Falls zusammenh\u00e4ngt. Einmal kamen einige Personen zu sp\u00e4t zum praktischen Unterricht, und aus irgendeinem Grund startete Spark nicht. Wir haben die Anzahl der verf\u00fcgbaren Ressourcen angeschaut \u2014 schien ausreichend zu sein. Spark sollte starten. Gl\u00fccklicherweise hatte sich zu diesem Zeitpunkt die Dokumentation bereits irgendwo ins Ged\u00e4chtnis eingepr\u00e4gt, und wir erinnerten uns, dass Spark beim Start einen Port sucht, auf dem es l\u00e4uft. Wenn der erste Port im Bereich belegt ist, wechselt es zum n\u00e4chsten. Wenn dieser frei ist, nimmt es ihn. Und es gibt einen Parameter, der die maximale Anzahl der Versuche daf\u00fcr angibt. Standardm\u00e4\u00dfig sind es 16. Das ist weniger als die Anzahl der Personen in unserer Gruppe beim Unterricht. Folglich brach Spark nach 16 Versuchen ab und sagte, dass es nicht starten k\u00f6nnte. Wir haben diesen Parameter angepasst.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nIch werde nun \u00fcber einige Einstellungen sprechen, die nicht mehr stark mit den Besonderheiten unseres Falls verbunden sind.<\/p>\n<p>Um Spark schneller zu starten, gibt es die Empfehlung, den Jar-Ordner, der im Stammverzeichnis von SPARK_HOME liegt, zu archivieren und auf HDFS zu legen. Dadurch wird die Zeit f\u00fcr das Laden dieser JARs auf den Workern eingespart.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nUm die Leistung zu verbessern, wird empfohlen, als Serialisierer Kryo zu verwenden. Es ist optimierter als der Standardserialisierer.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nEin weiteres bekanntes Problem mit Spark ist, dass es h\u00e4ufig aufgrund von Speichermangel abst\u00fcrzt. Dies geschieht oft, wenn die Worker alle Berechnungen abgeschlossen haben und das Ergebnis an den Driver senden. Wir haben diesen Parameter erh\u00f6ht. Standardm\u00e4\u00dfig betr\u00e4gt er 1 GB, wir haben ihn auf 3 GB erh\u00f6ht.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nUnd schlie\u00dflich, als Bonus. Wie man Spark auf Version 2.1 im HortonWorks-Distro \u2013 HDP 2.5.3.0 \u2013 aktualisiert. Diese HDP-Version enth\u00e4lt eine vorinstallierte Version 2.0, aber wir haben irgendwann entschieden, dass sich Spark ziemlich aktiv weiterentwickelt, und jede neue Version behebt Bugs und bietet zus\u00e4tzliche Funktionen, auch f\u00fcr die Python-API. Daher haben wir uns entschlossen, das Update durchzuf\u00fchren.<\/p>\n<p>Wir haben die Version von der offiziellen Website f\u00fcr Hadoop 2.7 heruntergeladen. Wir haben sie entpackt und in den HDP-Ordner verschoben. Wir haben die Symlinks wie gew\u00fcnscht erstellt. Wir starten \u2013 es funktioniert nicht. Es gibt eine sehr unklare Fehlermeldung.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nNach einer Google-Suche stellten wir fest, dass Spark beschlossen hat, nicht zu warten, bis Hadoop eine neue Version bereitstellt, und eine neue Version von Jersey verwenden wollte. Sie streiten sich dar\u00fcber in JIRA. Die L\u00f6sung war \u2013 herunterzuladen <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">Jersey Version 1.17.1<\/a><\/noindex>. Dieses in den jars-Ordner von SPARK_HOME verschieben, wieder zippen und auf HDFS hochladen.<\/p>\n<p>Wir haben diesen Fehler umgangen, aber ein neuer und recht vager trat auf.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: Yarn-Anwendung ist bereits beendet! Sie wurde m\u00f6glicherweise beendet oder konnte den Anwendungshauptprozess nicht starten.<\/code><\/pre>\n<p>\nWir versuchen dabei, Version 2.0 zu starten - alles in Ordnung. Versuche zu erraten, woran es liegt. Wir haben die Protokolle dieser Anwendung eingesehen und Folgendes gesehen:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nIm Allgemeinen wurde aus irgendeinem Grund hdp.version nicht aufgel\u00f6st. Nach einer Google-Suche fanden wir die L\u00f6sung. Man muss in Ambari zu den YARN-Einstellungen gehen und dort einen Parameter im benutzerdefinierten yarn-site hinzuf\u00fcgen:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nDiese Magie half, und Spark startete. Wir haben einige unserer Jupyter-Notebooks getestet. Alles funktioniert. F\u00fcr die erste Unterrichtsstunde zu Spark am Samstag (schon morgen) sind wir bereit!<\/p>\n<p><b>UPD<\/b>. W\u00e4hrend des Unterrichts stellte sich ein weiteres Problem heraus. Irgendwann h\u00f6rte YARN auf, Container f\u00fcr Spark auszugeben. In YARN musste der Parameter ge\u00e4ndert werden, der standardm\u00e4\u00dfig auf 0,2 eingestellt war:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nDas hei\u00dft, nur 20 % der Ressourcen waren an der Ressourcenverteilung beteiligt. Nach Anpassung der Parameter haben wir YARN neu geladen. Das Problem wurde gel\u00f6st, und auch die anderen Teilnehmer konnten den Spark-Kontext starten.<br \/>\n<br \/>Quelle: <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\/de\/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=\"de_DE\" \/>\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\/de\/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\udd47Konfiguration von Spark auf YARN | ProHoster","description":"Habr, hallo!","canonical_url":"https:\/\/prohoster.info\/de\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","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\/de\/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\/de\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}