{"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\/pt\/blog\/news\/konfigurirovanie-spark-na-yarn","title":{"rendered":"Configura\u00e7\u00e3o do Spark no YARN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ol\u00e1, Habr! Ontem, no <noindex><a rel=\"nofollow\" href=\"https:\/\/www.facebook.com\/events\/1825957590998380\/\">encontro dedicado ao Apache Spark<\/a><\/noindex>, dos nossos colegas da Rambler&#038;Co, houve muitas perguntas dos participantes relacionadas \u00e0 configura\u00e7\u00e3o desta ferramenta. Decidimos compartilhar nossas experi\u00eancias a respeito. O tema \u00e9 complexo \u2014 por isso, incentivamos a troca de experi\u00eancias tamb\u00e9m nos coment\u00e1rios, talvez possamos entender ou usar algo de maneira diferente.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nUma breve introdu\u00e7\u00e3o \u2014 como utilizamos o Spark. Temos um programa de tr\u00eas meses <noindex><a rel=\"nofollow\" href=\"http:\/\/newprolab.com\/ru\/bigdata?utm_source=habr&amp;utm_campaign=spark\">\u201cEspecialista em Big Data\u201d<\/a><\/noindex>, e durante o segundo m\u00f3dulo nossos participantes trabalham com essa ferramenta. Portanto, nossa tarefa, como organizadores, \u00e9 preparar um cluster para uso nesse contexto.<\/p>\n<p>A peculiaridade do nosso uso \u00e9 que o n\u00famero de pessoas que trabalham simultaneamente no Spark pode ser igual ao total do grupo. Por exemplo, em um semin\u00e1rio, quando todos est\u00e3o tentando algo ao mesmo tempo e copiando o que nosso instrutor faz. Isso pode chegar a quase 40 pessoas, por vezes. Provavelmente, n\u00e3o h\u00e1 muitas empresas no mundo que enfrentam esse cen\u00e1rio de uso.<\/p>\n<p>A seguir, vou explicar como e por que escolhemos determinados par\u00e2metros de configura\u00e7\u00e3o.<\/p>\n<p>Comecemos pelo come\u00e7o. O Spark tem 3 op\u00e7\u00f5es de opera\u00e7\u00e3o em um cluster: standalone, usando Mesos e usando YARN. Decidimos escolher a terceira op\u00e7\u00e3o, pois parecia l\u00f3gica para n\u00f3s. J\u00e1 temos um cluster Hadoop. Nossos participantes j\u00e1 est\u00e3o bem familiarizados com sua arquitetura. Vamos usar o YARN.<\/p>\n<pre><code class=\"apache\">spark.master=yarn<\/code><\/pre>\n<p>\nAgora fica mais interessante. Cada uma dessas 3 op\u00e7\u00f5es de implanta\u00e7\u00e3o tem 2 op\u00e7\u00f5es de implementa\u00e7\u00e3o: client e cluster. Com base em <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/running-on-yarn.html\">documenta\u00e7\u00e3o<\/a><\/noindex> e diferentes refer\u00eancias na internet, pode-se concluir que o modo client \u00e9 adequado para trabalho interativo \u2014 por exemplo, atrav\u00e9s do jupyter notebook, enquanto o modo cluster \u00e9 mais adequado para solu\u00e7\u00f5es em produ\u00e7\u00e3o. No nosso caso, est\u00e1vamos interessados no trabalho interativo, portanto:<\/p>\n<pre><code class=\"apache\">spark.deploy-mode=client<\/code><\/pre>\n<p>\nNa verdade, a partir deste momento, o Spark j\u00e1 funcionar\u00e1 de alguma forma no YARN, mas isso n\u00e3o era suficiente para n\u00f3s. Como temos um programa sobre grandes dados, \u00e0s vezes os participantes sentiam falta do que era poss\u00edvel com um corte uniforme de recursos. E aqui encontramos algo interessante - a aloca\u00e7\u00e3o din\u00e2mica de recursos. Resumidamente, a ideia \u00e9 a seguinte: se voc\u00ea tem uma tarefa pesada e o cluster est\u00e1 livre (por exemplo, de manh\u00e3), ent\u00e3o, com essa op\u00e7\u00e3o, o Spark pode te fornecer recursos adicionais. A necessidade \u00e9 calculada por uma f\u00f3rmula astuta. N\u00e3o vamos entrar em detalhes - ela funciona bem.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.enabled=true<\/code><\/pre>\n<p>\nColocamos esse par\u00e2metro, e ao iniciar o Spark ele reclamou e n\u00e3o come\u00e7ou. Certo, porque era necess\u00e1rio ler <noindex><a rel=\"nofollow\" href=\"http:\/\/spark.apache.org\/docs\/latest\/configuration.html\">documenta\u00e7\u00e3o<\/a><\/noindex> com mais aten\u00e7\u00e3o. L\u00e1 est\u00e1 indicado que, para tudo estar certo, \u00e9 necess\u00e1rio ativar um par\u00e2metro adicional.<\/p>\n<pre><code class=\"apache\">spark.shuffle.service.enabled=true<\/code><\/pre>\n<p>\nPara que ele serve? Quando o nosso job n\u00e3o exige mais tanta quantidade de recursos, o Spark deve devolv\u00ea-los ao pool geral. A fase mais trabalhosa em quase qualquer tarefa MapReduce \u00e9 a fase Shuffle. Este par\u00e2metro permite armazenar os dados que s\u00e3o gerados nessa fase e, consequentemente, liberar os executores. E o executor \u00e9 o processo que calcula tudo no worker. Ele tem um certo n\u00famero de n\u00facleos de processador e uma certa quantidade de mem\u00f3ria.<\/p>\n<p>Adicionamos esse par\u00e2metro. Tudo parece ter funcionado. Ficou evidente que os participantes realmente estavam recebendo mais recursos quando precisavam. Mas surgiu outro problema - em determinado momento, outros participantes acordavam e tamb\u00e9m queriam usar o Spark, e tudo estava ocupado, e eles ficaram insatisfeitos. \u00c9 compreens\u00edvel. Come\u00e7amos a olhar na documenta\u00e7\u00e3o. L\u00e1 parecia que havia mais alguns par\u00e2metros que podiam influenciar no processo. Por exemplo, se o executor est\u00e1 no modo de espera - ap\u00f3s quanto tempo ele pode ter seus recursos retirados?<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.executorIdleTimeout=120s<\/code><\/pre>\n<p>\nNo nosso caso, se seus executors n\u00e3o fizerem nada por dois minutos, por favor, devolva-os ao pool comum. Mas esse par\u00e2metro nem sempre foi suficiente. Era evidente que a pessoa j\u00e1 n\u00e3o estava fazendo nada h\u00e1 muito tempo, mas os recursos n\u00e3o estavam sendo liberados. Descobrimos que havia um par\u00e2metro especial - ap\u00f3s quanto tempo os executors que cont\u00eam dados em cache devem ser retirados. Por padr\u00e3o, esse par\u00e2metro estava configurado como - infinito! N\u00f3s o corrigimos.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.cachedExecutorIdleTimeout=600s<\/code><\/pre>\n<p>\nOu seja, se em 5 minutos seus executors n\u00e3o fizerem nada, devolva-os ao pool comum. Nesse modo, a velocidade de libera\u00e7\u00e3o e entrega de recursos para um grande n\u00famero de usu\u00e1rios tornou-se aceit\u00e1vel. O n\u00edvel de insatisfa\u00e7\u00e3o diminuiu. Mas decidimos ir mais longe e limitar o n\u00famero m\u00e1ximo de executors para um \u00fanico aplicativo - essencialmente para um \u00fanico participante do programa.<\/p>\n<pre><code class=\"apache\">spark.dynamicAllocation.maxExecutors=19<\/code><\/pre>\n<p>\nAgora, claro, surgiram descontentes do outro lado - \u201co cluster est\u00e1 ocioso e eu tenho apenas 19 executors\u201d, mas o que fazer - \u00e9 preciso encontrar um equil\u00edbrio adequado. N\u00e3o \u00e9 poss\u00edvel deixar todos felizes.<\/p>\n<p>E mais uma pequena hist\u00f3ria, relacionada \u00e0 especificidade do nosso caso. Certa vez, algumas pessoas se atrasaram para a aula pr\u00e1tica, e o Spark n\u00e3o conseguiu iniciar por algum motivo. Olhamos para a quantidade de recursos livres - parecia haver suficientes. O Spark deveria iniciar. Felizmente, naquela \u00e9poca a documenta\u00e7\u00e3o j\u00e1 havia se fixado na nossa mem\u00f3ria, e lembramos que ao iniciar o Spark busca uma porta para iniciar. Se a primeira porta do intervalo estiver ocupada, ele passa para a pr\u00f3xima. Se esta estiver livre, ele a captura. E h\u00e1 um par\u00e2metro que indica o n\u00famero m\u00e1ximo de tentativas para isso. Por padr\u00e3o, \u00e9 16. Um n\u00famero menor do que o n\u00famero de pessoas em nosso grupo na aula. Assim, ap\u00f3s 16 tentativas, o Spark desistia e dizia que n\u00e3o conseguia iniciar. Corrigimos esse par\u00e2metro.<\/p>\n<pre><code class=\"apache\">spark.port.maxRetries=50<\/code><\/pre>\n<p>\nA seguir, falarei sobre algumas configura\u00e7\u00f5es que j\u00e1 n\u00e3o est\u00e3o t\u00e3o relacionadas \u00e0 especificidade do nosso caso.<\/p>\n<p>Para um start mais r\u00e1pido do Spark, h\u00e1 a recomenda\u00e7\u00e3o de compactar a pasta jars, que fica no diret\u00f3rio inicial do SPARK_HOME, e coloc\u00e1-la no HDFS. Assim, ele n\u00e3o perder\u00e1 tempo carregando esses jars pelos workers.<\/p>\n<pre><code class=\"apache\">spark.yarn.archive=hdfs:\/\/\/tmp\/spark-archive.zip<\/code><\/pre>\n<p>\nAl\u00e9m disso, para um desempenho mais r\u00e1pido, recomenda-se usar o kryo como serializador. Ele \u00e9 mais otimizado do que o padr\u00e3o.<\/p>\n<pre><code class=\"apache\">spark.serializer=org.apache.spark.serializer.KryoSerializer<\/code><\/pre>\n<p>\nE h\u00e1 um problema antigo no Spark, que \u00e9 a falta de mem\u00f3ria. Isso costuma acontecer quando os trabalhadores calculam tudo e enviam o resultado para o driver. N\u00f3s aumentamos esse par\u00e2metro. Por padr\u00e3o, \u00e9 1GB, mas n\u00f3s ajustamos para 3.<\/p>\n<pre><code class=\"apache\">spark.driver.maxResultSize=3072<\/code><\/pre>\n<p>\nPor \u00faltimo, como um adicional. Como atualizar o Spark para a vers\u00e3o 2.1 na distribui\u00e7\u00e3o HortonWorks \u2014 HDP 2.5.3.0. Esta vers\u00e3o do HDP cont\u00e9m uma vers\u00e3o pr\u00e9-instalada 2.0, mas decidimos que o Spark est\u00e1 se desenvolvendo ativamente e cada nova vers\u00e3o corrige alguns bugs e oferece novas funcionalidades, incluindo para a API do Python, por isso decidimos realizar a atualiza\u00e7\u00e3o.<\/p>\n<p>Baixamos a vers\u00e3o do site oficial para Hadoop 2.7. Descompactamos e colocamos na pasta do HDP. Criamos os links simb\u00f3licos adequadamente. Ao iniciar, n\u00e3o funciona. Aparece um erro muito confuso.<\/p>\n<pre><code class=\"apache\">java.lang.NoClassDefFoundError: com\/sun\/jersey\/api\/client\/config\/ClientConfig<\/code><\/pre>\n<p>\nPesquisando no Google, descobrimos que o Spark decidiu n\u00e3o esperar o Hadoop e optou por usar uma nova vers\u00e3o do jersey. Eles comentam sobre isso entre si no JIRA. A solu\u00e7\u00e3o foi - baixar <noindex><a rel=\"nofollow\" href=\"https:\/\/mvnrepository.com\/artifact\/com.sun.jersey\/jersey-bundle\/1.17.1\">jersey vers\u00e3o 1.17.1<\/a><\/noindex>. Colocar isso na pasta jars em SPARK_HOME, compactar novamente e colocar no HDFS.<\/p>\n<p>Contornamos esse erro, mas um novo problema surgiu e foi bastante vago.<\/p>\n<pre><code class=\"apache\">org.apache.spark.SparkException: A aplica\u00e7\u00e3o Yarn j\u00e1 terminou! Ela pode ter sido encerrada ou n\u00e3o conseguiu iniciar o master da aplica\u00e7\u00e3o.<\/code><\/pre>\n<p>\nNesse meio tempo, tentamos iniciar a vers\u00e3o 2.0 \u2014 tudo ok. Tente adivinhar qual \u00e9 o problema. Analisamos os logs dessa aplica\u00e7\u00e3o e vimos algo assim:<\/p>\n<pre><code class=\"apache\">\/usr\/hdp\/${hdp.version}\/hadoop\/lib\/hadoop-lzo-0.6.0.${hdp.version}.jar<\/code><\/pre>\n<p>\nDe qualquer forma, por algum motivo, hdp.version n\u00e3o foi resolvida. Pesquisando, encontramos a solu\u00e7\u00e3o. \u00c9 necess\u00e1rio entrar nas configura\u00e7\u00f5es do Ambari em YARN e adicionar um par\u00e2metro nas configura\u00e7\u00f5es personalizadas do yarn-site:<\/p>\n<pre><code class=\"apache\">hdp.version=2.5.3.0-37<\/code><\/pre>\n<p>\nEssa m\u00e1gica funcionou e o Spark levantou. Testamos alguns de nossos notebooks jupyter. Tudo funciona. Estamos prontos para a primeira aula sobre Spark no s\u00e1bado (j\u00e1 amanh\u00e3)!<\/p>\n<p><b>ATUALIZA\u00c7\u00c3O<\/b>. Na aula, surgiu outro problema. Em algum momento, o YARN parou de fornecer cont\u00eaineres para o Spark. No YARN, era necess\u00e1rio ajustar um par\u00e2metro que estava como padr\u00e3o 0.2:<\/p>\n<pre><code class=\"apache\">yarn.scheduler.capacity.maximum-am-resource-percent=0.8<\/code><\/pre>\n<p>\nOu seja, apenas 20% dos recursos participaram na distribui\u00e7\u00e3o de recursos. Alteramos os par\u00e2metros e reiniciamos o YARN. O problema foi resolvido e os outros participantes tamb\u00e9m conseguiram iniciar o contexto do 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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Configura\u00e7\u00e3o do Spark no YARN | ProHoster","description":"Habr, ol\u00e1!","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/konfigurirovanie-spark-na-yarn","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/30548","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=30548"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/30548\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=30548"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=30548"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=30548"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}