{"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\/it\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","title":{"rendered":"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Introduzione<\/h3>\n<p><\/p>\n<p>\u00c8 successo che nel mio attuale posto di lavoro ho dovuto familiarizzare con questa tecnologia. Inizier\u00f2 con una breve introduzione. Durante un incontro, al nostro team \u00e8 stato detto che era necessario creare un'integrazione con <em>un noto sistema<\/em>. Con l'integrazione si intendeva che questo noto sistema ci inviasse richieste via HTTP a un determinato endpoint, e noi, per quanto strano possa sembrare, rispondessimo con risposte sotto forma di messaggi SOAP. Sembra tutto semplice e banale. Ne consegue che \u00e8 necessario\u2026<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3>Compito<\/h3>\n<p><\/p>\n<p>Creare 3 servizi. Il primo di essi \u00e8 il Servizio di aggiornamento del database. Questo servizio, all'arrivo di nuovi dati da un sistema esterno, aggiorna i dati nel database e genera un file in formato CSV, da trasferire al sistema successivo. Viene chiamato l'endpoint del secondo servizio - Servizio di trasporto tramite FTP, che riceve il file trasmesso, lo valida e lo deposita in un storage tramite FTP. Il terzo servizio - Servizio di consegna dati al consumatore, lavora in modo asincrono con i primi due. Accetta una richiesta da un sistema esterno per ricevere il file di cui si parlava sopra, prende il file di risposta pronto, lo modifica (aggiorna i campi id, description, linkToFile) e invia la risposta sotto forma di messaggio SOAP. Quindi, in generale, la situazione \u00e8 la seguente: i primi due servizi iniziano a lavorare solo quando arrivano dati per l'aggiornamento. Il terzo servizio lavora costantemente poich\u00e9 ci sono molti consumatori di informazioni, circa 1000 richieste di dati al minuto. I servizi sono costantemente disponibili e le loro istanze si trovano in ambienti diversi, come test, demo, preproduzione e produzione. Di seguito \u00e8 riportato uno schema di funzionamento di questi servizi. Preciso subito che alcuni dettagli sono semplificati per evitare complicazioni superflue.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/1edca5d5e917d8ac55ac96e892e816dd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"tehnicheskoe-uglublenie\">Approfondimento tecnico<\/h3>\n<p><\/p>\n<p>Nella pianificazione della soluzione del compito, si \u00e8 deciso prima di realizzare applicazioni in Java utilizzando il framework Spring, con un bilanciatore di carico Nginx, un database Postgres e altre tecnologie, alcune pi\u00f9 tecniche e altre meno. Poich\u00e9 il tempo per elaborare una soluzione tecnica permetteva di considerare approcci alternativi, l'attenzione si \u00e8 concentrata su una tecnologia alla moda in certi ambienti: Apache NIFI. Devo dire che questa tecnologia ci ha permesso di notare questi 3 servizi. In questo articolo verr\u00e0 descritta la realizzazione di un servizio di trasporto file e di un servizio di trasmissione dati al consumatore, ma se l'articolo riscuoter\u00e0 successo, scriver\u00f2 anche del servizio di aggiornamento dei dati nel database.<\/p>\n<p><\/p>\n<h3 id=\"chto-eto-takoe\">Che cos'\u00e8<\/h3>\n<p><\/p>\n<p>NIFI \u00e8 un'architettura distribuita per un caricamento e una lavorazione dati rapidi e paralleli, con un gran numero di plugin per fonti e trasformazioni, versioning delle configurazioni e molto altro. Un bonus gradito \u00e8 che \u00e8 molto semplice da usare. Processi banali, come getFile, sendHttpRequest e altri, possono essere rappresentati come quadrati. Ogni quadrato rappresenta un certo processo, il cui interazione pu\u00f2 essere vista nell'immagine sottostante. Una documentazione pi\u00f9 dettagliata sull'interazione e la configurazione dei processi \u00e8 scritta <noindex><a rel=\"nofollow\" href=\"https:\/\/nifi.apache.org\/docs.html\">qui<\/a><\/noindex> , per chi parla russo \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.arenadata.io\/ads\/UserNIFI\/index.html\">qui<\/a><\/noindex>. Nella documentazione \u00e8 spiegato benissimo come estrarre e avviare NIFI, cos\u00ec come come creare processi, anch'essi quadrati.<br \/>\nL'idea di scrivere un articolo \u00e8 nata dopo lunghe ricerche e strutturazione delle informazioni ricevute in qualcosa di comprensibile, oltre al desiderio di rendere un po' pi\u00f9 facile la vita ai futuri sviluppatori..<\/p>\n<p><\/p>\n<h3 id=\"primer\">Esempio<\/h3>\n<p><\/p>\n<p>\u00c8 stato esaminato un esempio di come interagiscono i quadrati tra di loro. Lo schema generale \u00e8 piuttosto semplice: riceviamo una richiesta HTTP (teoricamente con un file nel corpo della richiesta. Per dimostrare le possibilit\u00e0 di NIFI, in questo esempio la richiesta avvia il processo di acquisizione di un file dal nostro storage locale), quindi inviamo una risposta che indica che la richiesta \u00e8 stata ricevuta, parallelamente viene avviato il processo di acquisizione del file dallo storage e poi il processo di trasferimento tramite FTP nel nostro storage. Vale la pena chiarire che i processi interagiscono tra di loro tramite il cosiddetto flowFile. Questa \u00e8 l'entit\u00e0 di base in NIFI, che memorizza attributi e contenuto. Il contenuto \u00e8 rappresentato dai dati di un file di flusso. In altre parole, se hai ricevuto un file da un quadrato e lo trasferisci a un altro, il contenuto sar\u00e0 il tuo file.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/2649a29dcc9155ae7734db44fc6d3f9a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Come puoi notare, in questa illustrazione \u00e8 mostrato il processo generale. HandleHttpRequest accetta richieste, ReplaceText genera il corpo della risposta, HandleHttpResponse restituisce la risposta. FetchFile riceve un file dallo storage e lo trasferisce al quadrato PutSftp, che lo carica su FTP all'indirizzo specificato. Ora vediamo pi\u00f9 nel dettaglio questo processo. <\/p>\n<p><\/p>\n<p>In questo caso la request rappresenta l'inizio di tutto. Diamo un'occhiata alle sue impostazioni di configurazione. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/cf93a09a10ed9aebaae2c10b93619658.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nQui \u00e8 tutto piuttosto banale, tranne per StandartHttpContextMap, un servizio che consente di inviare e ricevere richieste. Puoi trovare maggiori dettagli e persino esempi qui \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/ddewaele.github.io\/http-communication-with-apache-nifi\/\">qui<\/a><\/noindex><\/p>\n<p>Passiamo ora alle impostazioni di configurazione del quadrato ReplaceText. \u00c8 importante prestare attenzione a ReplacementValue, che \u00e8 ci\u00f2 che verr\u00e0 restituito all'utente come risposta. Nelle impostazioni puoi regolare il livello di registrazione; puoi visualizzare i log {dove hai estratto nifi}\/nifi-1.9.2\/logs. Qui ci sono anche parametri di failure\/success: basandoti su questi parametri puoi regolare il processo in generale. In caso di elaborazione riuscita del testo, verr\u00e0 attivato il processo di invio della risposta all'utente, mentre nel caso di esito negativo, registreremo semplicemente il processo non riuscito. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/97341fd7f6ea34a219a16c2c732a8062.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nelle propriet\u00e0 di HandleHttpResponse non c'\u00e8 nulla di particolarmente interessante tranne lo stato in caso di creazione riuscita della risposta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/6082c84f81274927fdfbd20378cc252c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dopo aver esaminato richiesta e risposta, passiamo ora a come ottenere un file e caricarlo su un server FTP. FetchFile riceve il file dal percorso specificato nelle impostazioni e lo trasferisce al processo successivo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/d1368879e13a223404a53ab623ae4079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Il riquadro PutSftp posiziona il file nell'archivio file. Possiamo vedere di seguito i parametri di configurazione.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/c22648f39bb0ad4e7209911e614d3edf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c8 importante notare che ogni riquadro \u00e8 un processo separato che deve essere avviato. Abbiamo esaminato il caso pi\u00f9 semplice che non richiede alcuna personalizzazione complessa. Ora passeremo a un processo leggermente pi\u00f9 complicato, dove scriveremo un po' in Groovy. <\/p>\n<p><\/p>\n<h3 id=\"bolee-slozhnyy-primer\">Esempio pi\u00f9 complesso<\/h3>\n<p><\/p>\n<p>Il servizio di trasferimento dati al consumatore \u00e8 risultato un po' pi\u00f9 complesso a causa del processo di modifica del messaggio SOAP. Il processo generale \u00e8 illustrato nell'immagine sottostante.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/c48aa08c030cc252f9e53ce877329701.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Qui l'idea non \u00e8 particolarmente complicata: abbiamo ricevuto una richiesta dal consumatore per i dati, abbiamo inviato una risposta confermando di aver ricevuto il messaggio, abbiamo avviato il processo di ricezione del file di risposta, successivamente lo abbiamo modificato con una logica definita e infine abbiamo inviato il file al consumatore sotto forma di messaggio SOAP al server. <\/p>\n<p><\/p>\n<p>Non credo sia necessario descrivere nuovamente i riquadri gi\u00e0 visti sopra: passiamo direttamente ai nuovi. Se hai bisogno di modificare un file e i riquadri standard come ReplaceText non sono adatti, dovrai scrivere il tuo script. Puoi farlo utilizzando il riquadro ExecuteGroovyScript. Le sue impostazioni sono presentate di seguito.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/42d6691cf608b1620774426eae7b7027.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ci sono due opzioni per caricare lo script in questo quadrato. La prima consiste nel caricare un file contenente lo script. La seconda consiste nell'incollare lo script in scriptBody. Per quanto ne so, il quadrato executeScript supporta diversi linguaggi di programmazione, uno dei quali \u00e8 groovy. Deluder\u00f2 gli sviluppatori Java: non \u00e8 possibile scrivere script in questi quadrati utilizzando Java. Per coloro che ne sentono davvero il bisogno, \u00e8 necessario creare un quadrato personalizzato e inserirlo nel sistema NIFI. Tutta questa operazione \u00e8 accompagnata da numerosi passaggi complessi, che non tratteremo in questo articolo. Ho scelto il linguaggio groovy. Di seguito \u00e8 presentato uno script di prova che aggiorna semplicemente in modo incrementale l'id nel messaggio SOAP. \u00c8 importante notare che si prende il file da flowFile, lo si aggiorna e non si deve dimenticare di riporlo, aggiornato, all\u00ed dove era. Vale la pena notare che non tutte le librerie sono collegate. Potrebbe succedere che sia necessario importare una delle librerie. Un altro svantaggio \u00e8 che lo script in questo quadrato \u00e8 piuttosto difficile da fare il debug. Esiste un modo per collegarsi alla JVM NIFI e avviare il processo di debugging. Personalmente, ho avviato un'applicazione locale e ho simulato la ricezione del file dalla sessione. Ho anche svolto il debug localmente. Gli errori che emergono durante il caricamento dello script sono piuttosto facili da cercare su Google e sono registrati direttamente da NIFI nel 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(\"Error during processing of validate.groovy\", e)\n    session.transfer(flowFile, REL_FAILURE)\n}<\/code><\/pre>\n<p><\/p>\n<p>In effetti, qui termina la personalizzazione del quadrato. Successivamente, il file aggiornato viene trasferito in un quadrato che si occupa di inviare il file al server. Di seguito \u00e8 presentata la configurazione di questo quadrato.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/706c53d8deaf3d1ef47bd337e639197a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Descriviamo il metodo attraverso il quale verr\u00e0 inviato il messaggio SOAP. Indichiamo dove. Inoltre, \u00e8 necessario specificare che si tratta di SOAP.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Panoramica delle funzionalit\u00e0 in pratica\" src=\"\/wp-content\/uploads\/2019\/08\/7206bc2a1c66a0204c0589daf35fd328.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aggiungiamo alcune propriet\u00e0 come host e soapAction. Salviamo, verifichiamo. Per ulteriori dettagli su come inviare richieste SOAP, puoi consultare <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49457764\/nifi-how-to-use-invokehttp-processor-with-soap\/49565048\">qui<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Abbiamo esaminato diverse opzioni per l'utilizzo dei processi NIFI. Come interagiscono e quale sia il loro reale valore. Gli esempi esaminati sono testuali e differiscono leggermente da ci\u00f2 che accade in produzione. Spero che questo articolo sia utile per gli sviluppatori. Grazie per l'attenzione. Se hai domande, scrivi pure. Cercher\u00f2 di rispondere.<\/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.1.1 - 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\/it\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\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\/it\/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 Panoramica delle funzionalit\u00e0 nella pratica | ProHoster","description":"Introduzione \u00c8 successo che nel mio attuale luogo di lavoro abbia dovuto familiarizzare con questa tecnologia. Inizier\u00f2 con una breve storia.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/37567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=37567"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/37567\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/28196"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=37567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=37567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=37567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}