{"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\/pl\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","title":{"rendered":"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h3>Wprowadzenie<\/h3>\n<p><\/p>\n<p>Zdarzy\u0142o si\u0119, \u017ce w moim obecnym miejscu pracy musia\u0142em zapozna\u0107 si\u0119 z t\u0105 technologi\u0105. Zaczn\u0119 od kr\u00f3tkiej historii. <em>znanego systemu<\/em>. Integracja oznacza\u0142a, \u017ce ten znany system b\u0119dzie wysy\u0142a\u0142 do nas zapytania przez HTTP na okre\u015blony punkt ko\u0144cowy, a my, co mo\u017ce wydawa\u0107 si\u0119 dziwne, b\u0119dziemy odsy\u0142a\u0107 odpowiedzi w postaci wiadomo\u015bci SOAP. Wydaje si\u0119, \u017ce wszystko jest proste i trywialne. Z tego wynika, \u017ce nale\u017cy&#8230;<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><\/p>\n<h3>Zadanie<\/h3>\n<p><\/p>\n<p>Utworzy\u0107 3 us\u0142ugi. Pierwsza z nich to Us\u0142uga aktualizacji bazy danych. Ta us\u0142uga, po otrzymaniu nowych danych z systemu zewn\u0119trznego, aktualizuje dane w bazie danych i generuje pewien plik w formacie CSV, aby przekaza\u0107 go do nast\u0119pnego systemu. Wywo\u0142ywany jest punkt ko\u0144cowy drugiej us\u0142ugi \u2014 Us\u0142ugi transportu przez FTP, kt\u00f3ra otrzymuje przes\u0142any plik, waliduje go i zapisuje w magazynie plik\u00f3w przez FTP. Trzecia us\u0142uga \u2014 Us\u0142uga przesy\u0142ania danych do konsumenta, dzia\u0142a asynchronicznie w por\u00f3wnaniu do dw\u00f3ch pierwszych. Odbiera zapytanie z zewn\u0119trznego systemu, dotycz\u0105ce pliku, o kt\u00f3rym mowa powy\u017cej, pobiera gotowy plik odpowiedzi, modyfikuje go (aktualizuje pola id, description, linkToFile) i wysy\u0142a odpowied\u017a w postaci wiadomo\u015bci SOAP. W skr\u00f3cie, obraz przedstawia si\u0119 nast\u0119puj\u0105co: pierwsze dwie us\u0142ugi zaczynaj\u0105 dzia\u0142a\u0107 tylko wtedy, gdy przychodz\u0105 dane do aktualizacji. Trzecia us\u0142uga dzia\u0142a nieprzerwanie, poniewa\u017c jest wielu konsument\u00f3w informacji, oko\u0142o 1000 zapyta\u0144 o dane na minut\u0119. Us\u0142ugi s\u0105 zawsze dost\u0119pne, a ich instancje znajduj\u0105 si\u0119 w r\u00f3\u017cnych \u015brodowiskach, takich jak testowe, demo, preprodukcja i produkcja. Poni\u017cej przedstawiona jest schemat pracy tych us\u0142ug. Od razu wyja\u015bni\u0119, \u017ce niekt\u00f3re szczeg\u00f3\u0142y zosta\u0142y uproszczone, aby unikn\u0105\u0107 zb\u0119dnej z\u0142o\u017cono\u015bci.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/1edca5d5e917d8ac55ac96e892e816dd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"tehnicheskoe-uglublenie\">Techniczne zag\u0142\u0119bienie<\/h3>\n<p><\/p>\n<p>Podczas planowania rozwi\u0105zania problemu, pierwotnie zdecydowano si\u0119 na stworzenie aplikacji w j\u0119zyku Java z wykorzystaniem frameworka Spring, balancerem Nginx, baz\u0105 danych Postgres oraz innymi technicznymi i mniej technicznymi komponentami. Poniewa\u017c czas na opracowanie rozwi\u0105zania technicznego pozwala\u0142 na rozwa\u017cenie innych podej\u015b\u0107 do tego zadania, uwag\u0119 zwr\u00f3ci\u0142a modna w pewnych kr\u0119gach technologia Apache NIFI. Od razu zaznaczam, \u017ce ta technologia pozwoli\u0142a nam dostrzec te trzy us\u0142ugi. W tym artykule zostanie opisana praca nad us\u0142ug\u0105 transportu pliku i us\u0142ug\u0105 przesy\u0142ania danych do odbiorcy, jednak je\u015bli artyku\u0142 si\u0119 spodoba, napisz\u0119 o us\u0142udze aktualizacji danych w bazie danych.<\/p>\n<p><\/p>\n<h3 id=\"chto-eto-takoe\">Czym to jest<\/h3>\n<p><\/p>\n<p>NIFI to rozproszona architektura do szybkiego r\u00f3wnoleg\u0142ego \u0142adowania i przetwarzania danych, z du\u017c\u0105 ilo\u015bci\u0105 wtyczek dla \u017ar\u00f3de\u0142 i transformacji, wersjonowaniem konfiguracji i wieloma innymi funkcjami. Mi\u0142ym plusem jest to, \u017ce jest bardzo prosty w u\u017cyciu. Trywialne procesy, takie jak getFile, sendHttpRequest i inne \u2014 mo\u017cna przedstawi\u0107 w postaci kwadrat\u00f3w. Ka\u017cdy kwadrat reprezentuje pewien proces, kt\u00f3rego interakcj\u0119 mo\u017cna zobaczy\u0107 na poni\u017cszym rysunku. Szczeg\u00f3\u0142owa dokumentacja dotycz\u0105ca interakcji i konfiguracji proces\u00f3w jest napisana <noindex><a rel=\"nofollow\" href=\"https:\/\/nifi.apache.org\/docs.html\">tutaj<\/a><\/noindex> , dla tych, kt\u00f3rzy m\u00f3wi\u0105 po rosyjsku \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.arenadata.io\/ads\/UserNIFI\/index.html\">tutaj<\/a><\/noindex>. W dokumentacji doskonale opisano, jak rozpakowa\u0107 i uruchomi\u0107 NIFI, a tak\u017ce jak tworzy\u0107 procesy, kt\u00f3re s\u0105 kwadratami<br \/>\nPomys\u0142 napisania artyku\u0142u pojawi\u0142 si\u0119 po d\u0142ugotrwa\u0142ych poszukiwaniach i strukturyzacji zebranych informacji w co\u015b zrozumia\u0142ego, a tak\u017ce z ch\u0119ci u\u0142atwienia \u017cycia przysz\u0142ym programistom.<\/p>\n<p><\/p>\n<h3 id=\"primer\">Przyk\u0142ad<\/h3>\n<p><\/p>\n<p>Rozwa\u017cmy przyk\u0142ad, jak kwadraty ze sob\u0105 wsp\u00f3\u0142pracuj\u0105. Og\u00f3lny schemat jest do\u015b\u0107 prosty: Otrzymujemy \u017c\u0105danie HTTP (teoretycznie z plikiem w tre\u015bci \u017c\u0105dania. Dla zobrazowania mo\u017cliwo\u015bci NIFI, w tym przyk\u0142adzie \u017c\u0105danie uruchamia proces pobierania pliku z lokalnego FX), nast\u0119pnie wysy\u0142amy z powrotem odpowied\u017a, \u017ce \u017c\u0105danie zosta\u0142o odebrane, r\u00f3wnocze\u015bnie uruchamia si\u0119 proces pobierania pliku z FX, a nast\u0119pnie proces przenoszenia go przez FTP do FX. Warto wyja\u015bni\u0107, \u017ce procesy wsp\u00f3\u0142dzia\u0142aj\u0105 ze sob\u0105 za po\u015brednictwem tzw. flowFile. To podstawowy byt w NIFI, kt\u00f3ry przechowuje atrybuty i zawarto\u015b\u0107. Zawarto\u015b\u0107 \u2014 to dane, kt\u00f3re s\u0105 reprezentowane przez plik strumieniowy. M\u00f3wi\u0105c w uproszczeniu, je\u015bli otrzyma\u0142e\u015b plik z jednego kwadratu i przekazujesz go do drugiego, zawarto\u015bci\u0105 b\u0119dzie tw\u00f3j plik.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/2649a29dcc9155ae7734db44fc6d3f9a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Jak zauwa\u017cy\u0142e\u015b \u2014 na tym rysunku przedstawiono og\u00f3lny proces. HandleHttpRequest \u2014 przyjmuje \u017c\u0105dania, ReplaceText \u2014 generuje tre\u015b\u0107 odpowiedzi, HandleHttpResponse \u2014 zwraca odpowied\u017a. FetchFile \u2014 pobiera plik z przechowalni plik\u00f3w i przekazuje go do kwadratu PutSftp \u2014 umieszcza ten plik na FTP, pod wskazanym adresem. Teraz bardziej szczeg\u00f3\u0142owo o tym procesie. <\/p>\n<p><\/p>\n<p>W tym przypadku \u2014 request to wszystko, co zaczyna. Przyjrzyjmy si\u0119 jego parametrom konfiguracyjnym. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/cf93a09a10ed9aebaae2c10b93619658.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\nTutaj wszystko jest do\u015b\u0107 trywialne, z wyj\u0105tkiem StandardHttpContextMap \u2014 to pewnego rodzaju us\u0142uga, kt\u00f3ra umo\u017cliwia wysy\u0142anie i odbieranie \u017c\u0105da\u0144. Mo\u017cna to zobaczy\u0107 bardziej szczeg\u00f3\u0142owo, nawet z przyk\u0142adami \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/ddewaele.github.io\/http-communication-with-apache-nifi\/\">tutaj<\/a><\/noindex><\/p>\n<p>Dalej przyjrzymy si\u0119 parametrom konfiguracyjnym kwadratu ReplaceText. Nale\u017cy zwr\u00f3ci\u0107 uwag\u0119 na ReplacementValue \u2014 to, co wr\u00f3ci do u\u017cytkownika jako odpowied\u017a. W ustawieniach mo\u017cna regulowa\u0107 poziom logowania, logi mo\u017cna sprawdzi\u0107 {gdzie rozpakowano nifi}\/nifi-1.9.2\/logs, tam s\u0105 tak\u017ce parametry failure\/success \u2014 na podstawie tych parametr\u00f3w mo\u017cna regulowa\u0107 proces w ca\u0142o\u015bci. To znaczy, w przypadku pomy\u015blnego przetwarzania tekstu \u2014 wywo\u0142a si\u0119 proces wys\u0142ania odpowiedzi do u\u017cytkownika, a w innym przypadku po prostu zalogujemy nieudany proces. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/97341fd7f6ea34a219a16c2c732a8062.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>W w\u0142a\u015bciwo\u015bciach HandleHttpResponse nie ma nic szczeg\u00f3lnie interesuj\u0105cego, poza statusem przy pomy\u015blnym utworzeniu odpowiedzi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/6082c84f81274927fdfbd20378cc252c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Z \u017c\u0105daniem odpowiedzi si\u0119 uporali\u015bmy \u2014 przejd\u017amy dalej do otrzymywania pliku i umieszczania go na serwerze FTP. FetchFile \u2014 pobiera plik z okre\u015blonej w ustawieniach \u015bcie\u017cki i przekazuje go do nast\u0119pnego procesu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/d1368879e13a223404a53ab623ae4079.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A nast\u0119pnie kwadrat PutSftp \u2014 umieszcza plik w magazynie plik\u00f3w. Parametry konfiguracyjne mo\u017cemy zobaczy\u0107 poni\u017cej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/c22648f39bb0ad4e7209911e614d3edf.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Warto zwr\u00f3ci\u0107 uwag\u0119, \u017ce ka\u017cdy kwadrat to oddzielny proces, kt\u00f3ry musi by\u0107 uruchomiony. Rozpatrzyli\u015bmy najprostszy przyk\u0142ad, kt\u00f3ry nie wymaga \u017cadnej skomplikowanej personalizacji. Nast\u0119pnie rozwa\u017cymy nieco bardziej z\u0142o\u017cony proces, w kt\u00f3rym troch\u0119 napiszemy na Groovy. <\/p>\n<p><\/p>\n<h3 id=\"bolee-slozhnyy-primer\">Bardziej z\u0142o\u017cony przyk\u0142ad<\/h3>\n<p><\/p>\n<p>Us\u0142uga przesy\u0142ania danych do konsumenta okaza\u0142a si\u0119 nieco bardziej skomplikowana z powodu procesu modyfikacji wiadomo\u015bci SOAP. Og\u00f3lny proces przedstawiono na rysunku poni\u017cej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/c48aa08c030cc252f9e53ce877329701.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tutaj idea r\u00f3wnie\u017c nie jest zbyt skomplikowana: otrzymali\u015bmy zapytanie od konsumenta, \u017ce potrzebuje danych, wys\u0142ali\u015bmy odpowied\u017a, \u017ce otrzymali\u015bmy wiadomo\u015b\u0107, uruchomili\u015bmy proces otrzymywania pliku odpowiedzi, nast\u0119pnie edytowali\u015bmy go zgodnie z okre\u015blon\u0105 logik\u0105, po czym przekazali\u015bmy plik konsumentowi w postaci wiadomo\u015bci SOAP na serwer. <\/p>\n<p><\/p>\n<p>My\u015bl\u0119, \u017ce nie ma sensu opisywa\u0107 na nowo tych kwadrat\u00f3w, kt\u00f3re widzieli\u015bmy wcze\u015bniej \u2014 przejd\u017amy od razu do nowych. Je\u015bli musisz edytowa\u0107 jaki\u015b plik, a standardowe kwadraty typu ReplaceText nie pasuj\u0105, b\u0119dziesz musia\u0142 napisa\u0107 w\u0142asny skrypt. Mo\u017cna to zrobi\u0107 za pomoc\u0105 kwadratu ExecuteGroogyScript. Ustawienia s\u0105 przedstawione poni\u017cej.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/42d6691cf608b1620774426eae7b7027.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Istniej\u0105 dwie metody \u0142adowania skryptu do tego kwadratu. Pierwsza to wgranie pliku ze skryptem. Druga to wstawienie skryptu do scriptBody. O ile mi wiadomo, kwadrat executeScript obs\u0142uguje kilka j\u0119zyk\u00f3w programowania \u2014 jednym z nich jest groovy. Rozczaruj\u0119 programist\u00f3w java \u2014 w javie nie mo\u017cna pisa\u0107 skrypt\u00f3w w takich kwadratach. Dla tych, kt\u00f3rzy naprawd\u0119 chc\u0105 \u2014 trzeba stworzy\u0107 sw\u00f3j w\u0142asny niestandardowy kwadrat i wprowadzi\u0107 go do systemu NIFI. Ca\u0142a ta operacja wi\u0105\u017ce si\u0119 z do\u015b\u0107 d\u0142ugimi ta\u0144cami wok\u00f3\u0142 b\u0119bna, kt\u00f3rymi nie b\u0119dziemy si\u0119 zajmowa\u0107 w ramach tego artyku\u0142u. Wybra\u0142am j\u0119zyk groovy. Poni\u017cej znajduje si\u0119 testowy skrypt, kt\u00f3ry po prostu inkrementalnie aktualizuje id w wiadomo\u015bci SOAP. Wa\u017cne jest, aby pami\u0119ta\u0107, \u017ce bierzesz plik z flowFile, aktualizujesz go, nie zapominaj\u0105c w\u0142o\u017cy\u0107 go z powrotem. R\u00f3wnie\u017c nale\u017cy zauwa\u017cy\u0107, \u017ce nie wszystkie biblioteki s\u0105 pod\u0142\u0105czone. Mo\u017ce si\u0119 zdarzy\u0107, \u017ce b\u0119dziesz musia\u0142 zaimportowa\u0107 jedn\u0105 z bibliotek. Kolejnym minusem jest to, \u017ce skrypt w tym kwadracie jest do\u015b\u0107 trudny do debugowania. Istnieje spos\u00f3b na po\u0142\u0105czenie si\u0119 z JVM NIFI i rozpocz\u0119cie procesu debugowania. Osobi\u015bcie uruchomi\u0142am lokaln\u0105 aplikacj\u0119 i symulowa\u0142am odbieranie pliku z sesji. Debugowaniem r\u00f3wnie\u017c zajmowa\u0142am si\u0119 lokalnie. B\u0142\u0119dy, kt\u00f3re pojawiaj\u0105 si\u0119 podczas \u0142adowania skryptu, s\u0105 do\u015b\u0107 \u0142atwe do znalezienia i s\u0105 rejestrowane przez NIFI w logach.<\/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>Na tym ko\u0144czy si\u0119 dostosowywanie kwadratu. Uaktualniony plik jest nast\u0119pnie przekazywany do kwadratu, kt\u00f3ry zajmuje si\u0119 wysy\u0142aniem pliku na serwer. Poni\u017cej przedstawiono ustawienia tego kwadratu.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/706c53d8deaf3d1ef47bd337e639197a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Opisujemy metod\u0119, za pomoc\u0105 kt\u00f3rej b\u0119dzie przekazywana wiadomo\u015b\u0107 SOAP. Wskazujemy, dok\u0105d. Nast\u0119pnie nale\u017cy okre\u015bli\u0107, \u017ce jest to dok\u0142adnie SOAP.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"Apache NIFI \u2014 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce\" src=\"\/wp-content\/uploads\/2019\/08\/7206bc2a1c66a0204c0589daf35fd328.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dodajemy kilka w\u0142a\u015bciwo\u015bci, takich jak host i akcja (soapAction). Zapisujemy i sprawdzamy. Wi\u0119cej informacji na temat wysy\u0142ania \u017c\u0105da\u0144 SOAP mo\u017cna znale\u017a\u0107. <noindex><a rel=\"nofollow\" href=\"https:\/\/stackoverflow.com\/questions\/49457764\/nifi-how-to-use-invokehttp-processor-with-soap\/49565048\">tutaj<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Przeanalizowali\u015bmy kilka przypadk\u00f3w u\u017cycia proces\u00f3w NIFI. Jak one wsp\u00f3\u0142dzia\u0142aj\u0105 i jakie przynosz\u0105 rzeczywiste korzy\u015bci. Rozwa\u017cane przyk\u0142ady s\u0105 testowe i nieco r\u00f3\u017cni\u0105 si\u0119 od tego, co dzieje si\u0119 w produkcji. Mam nadziej\u0119, \u017ce ten artyku\u0142 b\u0119dzie nieco przydatny dla programist\u00f3w. Dzi\u0119kuj\u0119 za uwag\u0119. Je\u015bli masz jakiekolwiek pytania \u2013 pisz. Postaram si\u0119 odpowiedzie\u0107.<\/p>\n<p>\u0179r\u00f3d\u0142o: <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\/pl\/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=\"pl_PL\" \/>\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\/pl\/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 Kr\u00f3tkie om\u00f3wienie mo\u017cliwo\u015bci w praktyce | ProHoster","description":"Wprowadzenie Tak si\u0119 z\u0142o\u017cy\u0142o, \u017ce w moim obecnym miejscu pracy musia\u0142em zapozna\u0107 si\u0119 z t\u0105 technologi\u0105. Zaczn\u0119 od kr\u00f3tkiej historii.","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/news\/apache-nifi-kratkij-obzor-vozmozhnostej-na-praktike","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/37567","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=37567"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/37567\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/28196"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=37567"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=37567"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=37567"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}