{"id":37567,"date":"2019-10-31T22:18:22","date_gmt":"2019-10-31T19:18:22","guid":{"rendered":"https:\/\/prohoster.info\/blog\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike\/"},"modified":"2019-10-31T22:18:22","modified_gmt":"2019-10-31T19:18:22","slug":"apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","title":{"rendered":"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Introdu\u00e7\u00e3o<\/h3>\n<p><\/p>\n<p>Por um acaso, no meu trabalho atual, tive que me familiarizar com esta tecnologia. Come\u00e7arei com uma breve introdu\u00e7\u00e3o. Em uma reuni\u00e3o recente, nossa equipe foi informada que precisava criar uma integra\u00e7\u00e3o com <em>um sistema conhecido<\/em>. A integra\u00e7\u00e3o referia-se ao fato de que este famoso sistema nos enviaria solicita\u00e7\u00f5es via HTTP para um endpoint espec\u00edfico, e n\u00f3s, curiosamente, enviar\u00edamos de volta respostas no formato de mensagens SOAP. Parece tudo simples e trivial. A partir disso, \u00e9 necess\u00e1rio...<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3>Tarefa<\/h3>\n<p><\/p>\n<p>Criar 3 servi\u00e7os. O primeiro deles \u00e9 o Servi\u00e7o de Atualiza\u00e7\u00e3o do Banco de Dados. Este servi\u00e7o, ao receber novos dados de um sistema externo, atualiza as informa\u00e7\u00f5es no banco de dados e gera um arquivo em formato CSV, para ser enviado ao pr\u00f3ximo sistema. \u00c9 chamado o endpoint do segundo servi\u00e7o \u2014 o Servi\u00e7o de Transporte via FTP, que recebe o arquivo enviado, valida-o e o armazena em um reposit\u00f3rio de arquivos via FTP. O terceiro servi\u00e7o \u2014 o Servi\u00e7o de Transfer\u00eancia de Dados para o Consumidor, opera de forma ass\u00edncrona com os dois primeiros. Ele aceita uma solicita\u00e7\u00e3o de um sistema externo para obter o arquivo mencionado anteriormente, pega o arquivo de resposta pronto, modifica-o (atualiza os campos id, description, linkToFile) e envia a resposta no formato de mensagem SOAP. Portanto, em resumo, os dois primeiros servi\u00e7os iniciam seu trabalho apenas quando novos dados para atualiza\u00e7\u00e3o chegam. O terceiro servi\u00e7o opera continuamente, uma vez que h\u00e1 muitos consumidores de informa\u00e7\u00f5es, cerca de 1000 solicita\u00e7\u00f5es para obter dados por minuto. Os servi\u00e7os est\u00e3o dispon\u00edveis o tempo todo e suas inst\u00e2ncias est\u00e3o situadas em diferentes ambientes, como teste, demo, pr\u00e9-produ\u00e7\u00e3o e produ\u00e7\u00e3o. Abaixo est\u00e1 o esquema de funcionamento desses servi\u00e7os. Desde j\u00e1 explico que alguns detalhes foram simplificados para evitar complexidade desnecess\u00e1ria.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/1edca5d5e917d8ac55ac96e892e816dd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"tehnicheskoe-uglublenie\">Aprofundamento t\u00e9cnico<\/h3>\n<p><\/p>\n<p>Ao planejar uma solu\u00e7\u00e3o para o problema, decidimos inicialmente criar aplica\u00e7\u00f5es em Java usando o Spring framework, com um balanceador Nginx, um banco de dados Postgres e outras ferramentas t\u00e9cnicas, algumas mais complexas que outras. Como o tempo para desenvolver a solu\u00e7\u00e3o t\u00e9cnica permitia considerar outras abordagens, nossa aten\u00e7\u00e3o se voltou para a tecnologia Apache NIFI, popular em certos c\u00edrculos. De imediato, devo mencionar que essa tecnologia nos permitiu identificar esses 3 servi\u00e7os. Este artigo descrever\u00e1 o desenvolvimento do servi\u00e7o de transporte de arquivos e do servi\u00e7o de transfer\u00eancia de dados para o consumidor, mas se o artigo for bem recebido, escreverei sobre o servi\u00e7o de atualiza\u00e7\u00e3o de dados no banco de dados.<\/p>\n<p><\/p>\n<h3 id=\"chto-eto-takoe\">O que \u00e9 isso<\/h3>\n<p><\/p>\n<p>O NIFI representa uma arquitetura distribu\u00edda para carregamento e processamento de dados de forma r\u00e1pida e paralela, com muitos plugins para fontes e transforma\u00e7\u00f5es, versionamento de configura\u00e7\u00f5es e muito mais. Um b\u00f4nus agrad\u00e1vel \u00e9 que \u00e9 muito f\u00e1cil de usar. Processos triviais, como getFile, sendHttpRequest e outros, podem ser representados como quadrados. Cada quadrado representa um processo, cuja intera\u00e7\u00e3o pode ser visualizada na imagem abaixo. A documenta\u00e7\u00e3o mais detalhada sobre a configura\u00e7\u00e3o e intera\u00e7\u00e3o de processos est\u00e1 escrita <noindex><a rel=\"nofollow\" href=\"https:\/\/nifi.apache.org\/docs.html\">aqui<\/a><\/noindex> , para quem fala russo \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.arenadata.io\/ads\/UserNIFI\/index.html\">aqui<\/a><\/noindex>. A documenta\u00e7\u00e3o descreve muito bem como descompactar e iniciar o NIFI, al\u00e9m de como criar processos, que tamb\u00e9m s\u00e3o conhecidos como quadrados.<br \/>\nA ideia de escrever este artigo surgiu ap\u00f3s longas pesquisas e a organiza\u00e7\u00e3o das informa\u00e7\u00f5es obtidas em algo coerente, al\u00e9m do desejo de facilitar um pouco a vida dos futuros desenvolvedores.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Exemplo<\/h3>\n<p><\/p>\n<p>Foi apresentado um exemplo de como os quadrados interagem entre si. O esquema geral \u00e9 bastante simples: recebemos uma solicita\u00e7\u00e3o HTTP (teoricamente com um arquivo no corpo da solicita\u00e7\u00e3o. Para demonstrar as capacidades do NIFI, neste exemplo, a solicita\u00e7\u00e3o inicia o processo de obten\u00e7\u00e3o do arquivo do armazenamento local), em seguida, enviamos de volta uma resposta informando que a solicita\u00e7\u00e3o foi recebida, enquanto simultaneamente iniciamos o processo de obten\u00e7\u00e3o do arquivo do armazenamento e, em seguida, o processo de movimenta\u00e7\u00e3o via FTP para o armazenamento. Vale a pena enfatizar que os processos interagem entre si por meio do que \u00e9 chamado de flowFile. Esta \u00e9 a entidade b\u00e1sica no NIFI, que armazena atributos e conte\u00fado. O conte\u00fado \u00e9 os dados que s\u00e3o representados pelo arquivo de fluxo. Ou seja, de forma simplificada, se voc\u00ea recebeu um arquivo de um quadrado e o est\u00e1 transferindo para outro, o conte\u00fado ser\u00e1 o seu arquivo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/2649a29dcc9155ae7734db44fc6d3f9a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Como voc\u00ea pode notar \u2014 nesta imagem est\u00e1 representado o processo geral. HandleHttpRequest \u2014 recebe as solicita\u00e7\u00f5es, ReplaceText \u2014 gera o corpo da resposta, HandleHttpResponse \u2014 retorna a resposta. FetchFile \u2014 obt\u00e9m o arquivo do armazenamento de arquivos e o envia para o quadrado PutSftp \u2014 que coloca esse arquivo no FTP, no endere\u00e7o especificado. Agora, vamos ver mais detalhes sobre esse processo. <\/p>\n<p><\/p>\n<p>Neste caso \u2014 a solicita\u00e7\u00e3o \u00e9 o come\u00e7o de tudo. Vamos analisar seus par\u00e2metros de configura\u00e7\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/cf93a09a10ed9aebaae2c10b93619658.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nAqui tudo \u00e9 bastante trivial, exceto pelo StandartHttpContextMap \u2014 este \u00e9 um servi\u00e7o que permite enviar e receber solicita\u00e7\u00f5es. Voc\u00ea pode ver mais detalhadamente e at\u00e9 com exemplos \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/ddewaele.github.io\/http-communication-with-apache-nifi\/\">aqui<\/a><\/noindex><\/p>\n<p>Em seguida, veremos os par\u00e2metros de configura\u00e7\u00e3o do quadrado ReplaceText. \u00c9 importante prestar aten\u00e7\u00e3o no ReplacementValue \u2014 que \u00e9 o que retornar\u00e1 ao usu\u00e1rio na forma de resposta. Nas configura\u00e7\u00f5es, voc\u00ea pode regular o n\u00edvel de log, os logs podem ser visualizados {onde descompactamos nifi}\/nifi-1.9.2\/logs, l\u00e1 tamb\u00e9m existem os par\u00e2metros failure\/success \u2014 com base nesses par\u00e2metros, voc\u00ea pode ajustar o processo como um todo. Ou seja, em caso de processamento bem-sucedido do texto \u2014 o processo de envio da resposta ao usu\u00e1rio ser\u00e1 acionado, enquanto em outra situa\u00e7\u00e3o, simplesmente registramos o processo n\u00e3o-sucedido. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/97341fd7f6ea34a219a16c2c732a8062.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nas propriedades do HandleHttpResponse, n\u00e3o h\u00e1 nada especialmente interessante, exceto o status ao criar a resposta com sucesso. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/6082c84f81274927fdfbd20378cc252c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Com a solicita\u00e7\u00e3o e a resposta resolvidas \u2014 vamos prosseguir para a obten\u00e7\u00e3o do arquivo e coloc\u00e1-lo no servidor FTP. FetchFile \u2014 obt\u00e9m o arquivo do caminho especificado nas configura\u00e7\u00f5es e o passa para o pr\u00f3ximo processo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/d1368879e13a223404a53ab623ae4079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o bloco PutSftp \u2014 coloca o arquivo no armazenamento de arquivos. Podemos ver as configura\u00e7\u00f5es abaixo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/c22648f39bb0ad4e7209911e614d3edf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vale a pena notar que cada bloco \u00e9 um processo separado que deve ser iniciado. Analisamos o exemplo mais simples que n\u00e3o requer nenhuma personaliza\u00e7\u00e3o complicada. A seguir, veremos um processo um pouco mais complexo, onde escreveremos um pouco em Groovy. <\/p>\n<p><\/p>\n<h3 id=\"bolee-slozhnyy-primer\">Um exemplo mais complexo<\/h3>\n<p><\/p>\n<p>O servi\u00e7o de transfer\u00eancia de dados para o consumidor se tornou um pouco mais complexo devido ao processo de modifica\u00e7\u00e3o da mensagem SOAP. O processo geral \u00e9 apresentado na imagem abaixo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/c48aa08c030cc252f9e53ce877329701.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui, a ideia tamb\u00e9m n\u00e3o \u00e9 particularmente complexa: recebemos uma solicita\u00e7\u00e3o do consumidor de que ele precisa de dados, enviamos uma resposta informando que recebemos a mensagem, iniciamos o processo de obten\u00e7\u00e3o do arquivo de resposta, editamos com uma l\u00f3gica espec\u00edfica e, em seguida, transmitimos o arquivo ao consumidor na forma de uma mensagem SOAP no servidor. <\/p>\n<p><\/p>\n<p>Acho que n\u00e3o vale a pena descrever novamente os blocos que vimos acima \u2014 vamos direto para os novos. Se voc\u00ea precisar editar algum arquivo e blocos comuns como ReplaceText n\u00e3o forem suficientes, ter\u00e1 que escrever seu pr\u00f3prio script. Isso pode ser feito usando o bloco ExecuteGroovyScript. Suas configura\u00e7\u00f5es est\u00e3o apresentadas abaixo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/42d6691cf608b1620774426eae7b7027.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Existem duas op\u00e7\u00f5es para carregar o script neste quadrado. A primeira \u00e9 carregando um arquivo com o script. A segunda \u00e9 inserindo o script no scriptBody. Pelo que sei, o quadrado executeScript suporta v\u00e1rias linguagens de programa\u00e7\u00e3o \u2014 uma delas \u00e9 o groovy. Para desespero dos desenvolvedores Java \u2014 scripts em Java n\u00e3o podem ser escritos nesses quadrados. Para quem realmente deseja isso \u2014 \u00e9 necess\u00e1rio criar seu pr\u00f3prio quadrado personalizado e inseri-lo no sistema NIFI. Toda essa opera\u00e7\u00e3o \u00e9 acompanhada de uma dan\u00e7a bastante longa, que n\u00e3o abordaremos neste artigo. Eu escolhi a linguagem groovy. Abaixo est\u00e1 um script de teste que simplesmente atualiza incrementalmente o ID em uma mensagem SOAP. \u00c9 importante notar que voc\u00ea pega o arquivo do flowFile, atualiza-o e n\u00e3o deve esquecer de coloc\u00e1-lo de volta, atualizado. Tamb\u00e9m \u00e9 importante mencionar que nem todas as bibliotecas est\u00e3o conectadas. Pode acontecer que voc\u00ea ainda tenha que importar uma das libs. Outro ponto negativo \u00e9 que debugar o script nesse quadrado \u00e9 bastante complicado. Existe uma maneira de se conectar \u00e0 JVM NIFI e iniciar o processo de depura\u00e7\u00e3o. Pessoalmente, eu executei um aplicativo local e simulei a obten\u00e7\u00e3o de um arquivo da sess\u00e3o. A depura\u00e7\u00e3o tamb\u00e9m foi feita localmente. Os erros que surgem ao carregar o script s\u00e3o bastante f\u00e1ceis de pesquisar e s\u00e3o registrados pelo pr\u00f3prio NIFI no log.<\/p>\n<p><\/p>\n<pre><code class=\"java\">import org.apache.commons.io.IOUtils\nimport groovy.xml.XmlUtil\nimport java.nio.charset.*\nimport groovy.xml.StreamingMarkupBuilder\n\ndef flowFile = session.get()\nif (!flowFile) return\ntry {\n    flowFile = session.write(flowFile, { inputStream, outputStream -&gt;\n        String result = IOUtils.toString(inputStream, \"UTF-8\");\n        def recordIn = new XmlSlurper().parseText(result)\n        def element = recordIn.depthFirst().find {\n            it.name() == 'id'\n        }\n\n        def newId = Integer.parseInt(element.toString()) + 1\n        def recordOut = new XmlSlurper().parseText(result)\n        recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId\n\n        def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString()\n        outputStream.write(res.getBytes(StandardCharsets.UTF_8))\n} as StreamCallback)\n     session.transfer(flowFile, REL_SUCCESS)\n}\ncatch(Exception e) {\n    log.error(\"Erro ao processar validate.groovy\", e)\n    session.transfer(flowFile, REL_FAILURE)\n}<\/code><\/pre>\n<p><\/p>\n<p>Na verdade, aqui termina a personaliza\u00e7\u00e3o do quadrado. O arquivo atualizado \u00e9 ent\u00e3o transferido para o quadrado que se encarrega de enviar o arquivo ao servidor. Abaixo est\u00e3o as configura\u00e7\u00f5es deste quadrado.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/706c53d8deaf3d1ef47bd337e639197a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Descrevemos o m\u00e9todo pelo qual a mensagem SOAP ser\u00e1 enviada. Escrevemos para onde. Em seguida, \u00e9 necess\u00e1rio indicar que \u00e9 especificamente SOAP.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Vis\u00e3o geral breve das funcionalidades na pr\u00e1tica\" src=\"\/wp-content\/uploads\/2019\/08\/7206bc2a1c66a0204c0589daf35fd328.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Adicionamos algumas propriedades como host e a\u00e7\u00e3o (soapAction). Salvamos e verificamos. Mais detalhes sobre como enviar solicita\u00e7\u00f5es SOAP podem ser encontrados. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49457764\/nifi-how-to-use-invokehttp-processor-with-soap\/49565048\">aqui<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Analisamos v\u00e1rias op\u00e7\u00f5es de uso dos processos NIFI. Como eles interagem e qual \u00e9 seu valor real. Os exemplos discutidos s\u00e3o testes e diferem um pouco do que \u00e9 realmente usado em produ\u00e7\u00e3o. Espero que este artigo seja um pouco \u00fatil para os desenvolvedores. Obrigado pela aten\u00e7\u00e3o. Se houver alguma d\u00favida, escreva. Tentarei responder.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/465299\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438. \u041d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u043c \u043c\u0438\u0442\u0438\u043d\u0433\u0435, \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439. \u041f\u043e\u0434 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043c \u0441\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0447\u0435\u0440\u0435\u0437 HTTP \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0435\u043d\u0434\u043f\u043e\u0438\u043d\u0442, \u0430 \u043c\u044b, \u043a\u0430\u043a \u044d\u0442\u043e \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0441\u043b\u0430\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28196,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-37567","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438.\" \/>\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\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike\" \/>\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\udd47Apache NIFI \u2014 \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike\" \/>\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-31T19:18:22+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:18:22+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\udd47Apache NIFI \u2014 Vis\u00e3o geral das capacidades na pr\u00e1tica | ProHoster","description":"Introdu\u00e7\u00e3o Acontece que, no meu atual local de trabalho, precisei me familiarizar com essa tecnologia. Come\u00e7arei com uma pequena pr\u00e9-hist\u00f3ria.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","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\udd47Apache NIFI \u2014 \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043d\u0430 \u043c\u043e\u0435\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0435\u0439. \u041d\u0430\u0447\u043d\u0443 \u0441 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0441\u0442\u043e\u0440\u0438\u0438.","og:url":"https:\/\/prohoster.info\/pt\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","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-31T19:18:22+00:00","article:modified_time":"2019-10-31T19:18:22+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37567","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-23 18:24:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:24:24","updated":"2026-01-23 18:24:19","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\/37567","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=37567"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/37567\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/28196"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=37567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=37567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=37567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}