{"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\/es\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Configuraci\u00f3n de Spark en YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola, Habr! Ayer en <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">el meetup dedicado a Apache Spark<\/a><\/noindex>, de los chicos de Rambler&amp;Co, hubo muchas preguntas de los participantes relacionadas con la configuraci\u00f3n de esta herramienta. Decidimos compartir nuestra experiencia al respecto. El tema no es sencillo, as\u00ed que tambi\u00e9n les proponemos compartir sus experiencias en los comentarios, tal vez nosotros tambi\u00e9n entendamos y usemos algo erroneamente.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nUna breve introducci\u00f3n: c\u00f3mo utilizamos Spark. Tenemos un programa de tres meses <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201cEspecialista en Big Data\u201d<\/a><\/noindex>, y en todo el segundo m\u00f3dulo nuestros participantes trabajan con esta herramienta. Por lo tanto, nuestra tarea como organizadores es preparar un cl\u00faster para su uso en este contexto.<\/p>\n<p>La particularidad de nuestro uso es que el n\u00famero de personas que trabajan simult\u00e1neamente en Spark puede ser igual a todo el grupo. Por ejemplo, en el seminario, cuando todos prueban algo simult\u00e1neamente y siguen a nuestro instructor. Y eso no son pocos, a veces casi 40 personas. Probablemente, no haya muchas empresas en el mundo que enfrenten un escenario de uso as\u00ed.<\/p>\n<p>A continuaci\u00f3n, explicar\u00e9 c\u00f3mo y por qu\u00e9 elegimos ciertos par\u00e1metros de configuraci\u00f3n.<\/p>\n<p>Comencemos desde el principio. Spark tiene 3 opciones para funcionar en un cl\u00faster: standalone, usando Mesos y usando YARN. Decidimos elegir la tercera opci\u00f3n, ya que era l\u00f3gica para nosotros. Ya tenemos un cl\u00faster de Hadoop. Nuestros participantes ya est\u00e1n familiarizados con su arquitectura. As\u00ed que vamos a usar YARN.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nLuego, se pone m\u00e1s interesante. Cada una de estas 3 opciones de despliegue tiene 2 variantes de despliegue: client y cluster. A partir de <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">la documentaci\u00f3n<\/a><\/noindex> y diferentes enlaces en Internet, se puede concluir que client es adecuado para el trabajo interactivo, por ejemplo, a trav\u00e9s de Jupyter Notebook, mientras que cluster es m\u00e1s adecuado para soluciones de producci\u00f3n. En nuestro caso, nos interesaba el trabajo interactivo, as\u00ed que:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nEn general, a partir de este momento, Spark ya funcionar\u00e1 de alguna manera en YARN, pero eso no era suficiente para nosotros. Dado que nuestro programa trata sobre grandes datos, a veces a los participantes les faltaba lo que se obten\u00eda con un corte uniforme de recursos. Y aqu\u00ed encontramos algo interesante: la asignaci\u00f3n din\u00e1mica de recursos. En pocas palabras, la idea es la siguiente: si tienes una tarea pesada y el cl\u00faster est\u00e1 libre (por ejemplo, por la ma\u00f1ana), esta opci\u00f3n de Spark puede darte recursos adicionales. La necesidad se calcula mediante una f\u00f3rmula ingeniosa. No entraremos en detalles; funciona bastante bien.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nEstablecimos este par\u00e1metro, y al iniciar Spark, dio un error y no se ejecut\u00f3. Correctamente, porque hab\u00eda que leer <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">la documentaci\u00f3n<\/a><\/noindex> con m\u00e1s atenci\u00f3n. All\u00ed se indica que, para que todo est\u00e9 bien, tambi\u00e9n hay que activar un par\u00e1metro adicional.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\n\u00bfPara qu\u00e9 sirve? Cuando nuestro trabajo ya no requiere tanta cantidad de recursos, Spark debe devolverlos al pool com\u00fan. La etapa m\u00e1s intensiva en recursos en casi cualquier tarea de MapReduce es la etapa de Shuffle. Este par\u00e1metro permite conservar los datos que se generan en esta etapa y, en consecuencia, liberar los ejecutores. Un ejecutor es un proceso que realiza todos los c\u00e1lculos en el trabajador. Tiene una cierta cantidad de n\u00facleos de procesador y una cierta cantidad de memoria.<\/p>\n<p>Agregamos este par\u00e1metro. Todo parec\u00eda estar funcionando. Se not\u00f3 que a los participantes realmente se les estaban otorgando m\u00e1s recursos cuando los necesitaban. Pero surgi\u00f3 otro problema: en alg\u00fan momento, otros participantes se despertaban y tambi\u00e9n quer\u00edan usar Spark, pero todo estaba ocupado, y estaban descontentos. Se les puede entender. Comenzamos a revisar la documentaci\u00f3n. Ah\u00ed result\u00f3 que hay otro conjunto de par\u00e1metros que pueden influir en el proceso. Por ejemplo, si un ejecutor est\u00e1 en modo de espera, \u00bfdespu\u00e9s de cu\u00e1nto tiempo se pueden recuperar los recursos?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nEn nuestro caso, si tus executores no hacen nada durante dos minutos, por favor, devu\u00e9lvelos al grupo general. Pero incluso este par\u00e1metro no siempre era suficiente. Era evidente que la persona no hab\u00eda hecho nada durante mucho tiempo, pero los recursos no se liberaban. Result\u00f3 que hab\u00eda otro par\u00e1metro especial: despu\u00e9s de cu\u00e1nto tiempo recoger los executores que contienen datos en cach\u00e9. Por defecto, este par\u00e1metro estaba en infinito. Lo corregimos.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nEs decir, si en 5 minutos tus executores no hacen nada, devu\u00e9lvelos al grupo general. En este modo, la velocidad de liberaci\u00f3n y entrega de recursos para un gran n\u00famero de usuarios se volvi\u00f3 adecuada. La cantidad de quejas disminuy\u00f3. Pero decidimos ir m\u00e1s all\u00e1 y limitar el n\u00famero m\u00e1ximo de executores por aplicaci\u00f3n, esencialmente por participante del programa.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nAhora, por supuesto, aparecieron quejas desde el otro lado: \"el cl\u00faster est\u00e1 inactivo, y solo tengo 19 executores\", pero qu\u00e9 se le va a hacer, se necesita encontrar un equilibrio adecuado. No se puede hacer feliz a todo el mundo.<\/p>\n<p>Y otra peque\u00f1a historia relacionada con la especificidad de nuestro caso. En una ocasi\u00f3n, algunas personas llegaron tarde a una clase pr\u00e1ctica, y su Spark, por alguna raz\u00f3n, no se inici\u00f3. Miramos la cantidad de recursos libres y parec\u00eda que hab\u00eda suficientes. Spark deber\u00eda iniciar. Afortunadamente, para ese momento la documentaci\u00f3n ya se hab\u00eda grabado en nuestra memoria, y recordamos que al iniciar, Spark busca un puerto para iniciar. Si el primer puerto del rango est\u00e1 ocupado, pasa al siguiente. Si est\u00e1 libre, lo ocupa. Y hay un par\u00e1metro que indica el n\u00famero m\u00e1ximo de intentos para esto. Por defecto, es 16. Menos que el n\u00famero de personas en nuestro grupo en la clase. Por lo tanto, despu\u00e9s de 16 intentos, Spark se rend\u00eda y dec\u00eda que no pod\u00eda iniciar. Ajustamos ese par\u00e1metro.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nA continuaci\u00f3n, hablar\u00e9 de algunas configuraciones, que ya no est\u00e1n muy relacionadas con la especificidad de nuestro caso.<\/p>\n<p>Para un inicio m\u00e1s r\u00e1pido de Spark, hay una recomendaci\u00f3n de archivar la carpeta jars, ubicada en el directorio principal de SPARK_HOME, y colocarla en HDFS. De este modo, no gastar\u00e1 tiempo cargando estos archivos jar a trav\u00e9s de los trabajadores.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nTambi\u00e9n se recomienda usar kryo como serializador para un funcionamiento m\u00e1s r\u00e1pido. Est\u00e1 m\u00e1s optimizado que el predeterminado.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nY hay un problema antiguo de Spark, que a menudo se queda sin memoria. Esto ocurre frecuentemente en el momento en que los trabajadores han calculado todo y env\u00edan el resultado al driver. Aumentamos este par\u00e1metro. Por defecto es 1 GB, nosotros lo fijamos en 3.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nY por \u00faltimo, como postre. C\u00f3mo actualizar Spark a la versi\u00f3n 2.1 en la distribuci\u00f3n de HortonWorks \u2014 HDP 2.5.3.0. Esta versi\u00f3n de HDP contiene la versi\u00f3n 2.0 preinstalada, pero en su momento decidimos que Spark est\u00e1 evolucionando r\u00e1pidamente, y cada nueva versi\u00f3n corrige errores y a\u00f1ade capacidades adicionales, incluyendo para la API de python, por lo que decidimos que era necesario hacer la actualizaci\u00f3n.<\/p>\n<p>Descargamos la versi\u00f3n desde el sitio oficial para Hadoop 2.7. Descomprimimos, la colocamos en la carpeta de HDP. Hicimos los enlaces simb\u00f3licos como era necesario. Al ejecutar \u2014 no arranca. Muestra un error bastante confuso.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nBuscando en Google, descubrimos que Spark decidi\u00f3 no esperar a que Hadoop tuviera una actualizaci\u00f3n y decidi\u00f3 usar una nueva versi\u00f3n de jersey. Ellos mismos tienen conflictos sobre este tema en JIRA. La soluci\u00f3n fue descargar <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey versi\u00f3n 1.17.1<\/a><\/noindex>. Colocarlo en la carpeta jars de SPARK_HOME, nuevamente hacer un zip y colocar en HDFS.<\/p>\n<p>Evitamos este error, pero surgi\u00f3 un nuevo problema que es bastante ambiguo.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: \u00a1La aplicaci\u00f3n Yarn ya ha terminado! Puede que haya sido eliminada o no se pudo lanzar el maestro de la aplicaci\u00f3n<\/code><\/pre>\n<p>\nMientras tanto, intentamos ejecutar la versi\u00f3n 2.0 \u2014 todo bien. Intenta adivinar cu\u00e1l es el problema. Revisamos los registros de esta aplicaci\u00f3n y vimos algo as\u00ed:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nEn resumen, por alguna raz\u00f3n hdp.version no se resolv\u00eda. Buscando en Google, encontramos una soluci\u00f3n. Hay que entrar en Ambari en la configuraci\u00f3n de YARN y agregar este par\u00e1metro en yarn-site personalizado:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nEsta magia ayud\u00f3, y Spark despeg\u00f3. Probamos varios de nuestros cuadernos de jupyter. Todo funciona. \u00a1Estamos listos para la primera clase de Spark el s\u00e1bado (ya ma\u00f1ana)!<\/p>\n<p><b>UPD<\/b>. En la clase surgi\u00f3 otro problema. En alg\u00fan momento YARN dej\u00f3 de entregar contenedores para Spark. En YARN hab\u00eda que ajustar un par\u00e1metro, que por defecto estaba en 0.2:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nEs decir, solo el 20% de los recursos participaron en la distribuci\u00f3n de recursos. Al cambiar los par\u00e1metros, reiniciamos YARN. El problema se resolvi\u00f3 y los dem\u00e1s participantes tambi\u00e9n pudieron iniciar el contexto de Spark.<br \/>\n<br \/>Fuente: <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.2 - 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\/es\/blog\/news\/konfigurirovanie-spark-na-yarn\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Configuraci\u00f3n de Spark en YARN | ProHoster","description":"\u00a1Hola Habr!","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}