Portal wraz z jego całą zawartością powstał w celu podzielenia się informacjami na temat Apache NiFi, niezawodnym narzędziem do budowania przepływów danych.
Zdecydowałem się o pracy nad takim projektem głównie z paru przyczyn:
- Zbudowania ogólnej bazy wiedzy, do której można wrócić w każdej chwili
- Utrwalenie wiedzy, którą posiadam, ponieważ pamięć ludzka jest ograniczona
- Udostępnienie informacji na temat Apache NiFi
Tyle tytułem wstępu, a teraz skupmy się na tym, czym w ogóle jest NiFi i do czego można go wykorzystać. Z racji tego, że artykuł jest obszerny pozwoliłem sobie podzielić go na kluczowe zagadnienia.
Czym jest w ogóle ten NiFi?
Apache NiFi jest to projekt, który umożliwia programowanie oparte na przepływach w graficznym interfejsie. Owe oprogramowanie zostało stworzone przez Apache Software Foundation, którego celem jest automatyzacja przepływu danych między różnymi systemami. NiFi został stworzony na podstawie oprogramowania „NiagaraFiles” opracowany przez amerykańską Agencję Bezpieczeństwa Narodowego (NSA), od którego otrzymał również część obecnej nazwy. Został on udostępniony w 2014 roku na zasadach open source w ramach programu transferu technologii NSA. Koncepcja jaką wykorzystuje NiFi to „Extract, transform, load”, w skrócie ETL:
- Extract jest to wyodrębnienie danych z dowolnego źródła danych np. poprzez API, z bazy danych, ze strony internetowej, z plików płaskich np. xlsx, csv.
- Transform polega na transformacji danych do jednolitej postaci, która pozwoli te dane analizować np. poprzez agregowanie danych, oczyszczanie, łączenie, filtrowanie itp.
- Load to ostatni krok, w którym wcześniej przygotowane dane zostaną załadowane do postaci dodcelowej np. do tabeli bazodanowej, do pliku płaskiego itp.
NiFi działa w trybie single node, czyli pojedynczej instancji oraz w trybie klastra, które do działania potrzebuje minimum dwóch połączonych ze sobą instancji. Stworzony w ten sposób klaster NiFi można wykorzystać do przetworzenia większego strumienia danych. Takie rozwiązanie zapewnia niezawodne działanie oraz zapewnia elastyczne skalowalnie środowiska na wypadek np. wzmożonego zapotrzebowania na przetwarzanie danych. W kontekście bezpieczeństwa NiFi można skonfigurować, aby korzystał on z bezpiecznego protokołu TLS, który rozszerza również funkcjonalność o możliwość kreowania użytkowników oraz polityk bezpieczeństwa.
Budowa NiFi
To w jaki sposób wyglądają poszczególne elementy składowe tego oprogramowania jest ściśle powiązane z głównymi założeniami oraz ideami programowania opartego na przepływach i graficznym interfejsie. Oto główne elementy NiFi:
Interfejs graficzny
WebUI oprogramowania NiFi jest bardzo intuicyjne i proste w korzystaniu lub w zarządzaniu. W górnym panelu znajdują się główne elementy, które są potrzebne do budowania przepływów mianowicie:
- Processor umożliwia nam wybranie pożądanego przez nas klocka z listy
- Input oraz Output Port służy do tworzenia wejścia/wyjścia między grupami
- Process Group i Remote Process Group, pozwala na grupowanie klocków w ramach grupy lub zdalne połączenie się do grupy
- Funnel punkt, do którego możemy wyprowadzić połączenie z procesora, jeżeli nie chcemy przetwarzać dalej danych
- Template pozwala na import gotowego szablonu przepływu danych
- Label, notatka służąca głównie do przekazania krótkiej informacji
Natomiast po lewej stronie znajduje się mapka nawigacyjna z rozmieszczeniem bloków oraz dedykowane funkcje, które można wykorzystać np. ustawienia procesora bądź grupy, uruchomienie, zatrzymanie, włączenie lub wyłączenie poszczególnych bloków. Kolejne elementy tego panelu umożliwiają stworzenie lub załadowanie gotowego szablonu przepływu danych.
Podstawowe elementy NiFi
Określenie | Opis |
---|---|
Processor | Wykonuje pracę, do której został zaprojektowany np. dokonuje transformacji danych. Posiada dostęp do atrybutów danego FlowFile i jego strumienia danych. Istnieje możliwość napisania własnego procesora |
Process Group | Grupa procesorów to określony zestaw procesorów oraz ich połączeń między sobą. Pozwala to na tworzenie odrębnych komponentów i wydzielanie pewnych zadań. Mogą one odbierać pewne dane przez porty wejściowe jak i wysyłać dane przez porty wyjściowe. |
Remote Process Group | Zdalna grupa procesorów, która pozwala skonfigurować połączenie do grupy na innej instancji NiFi. Portami wejścia/wyjścia można przesłać i odebrać dane. Umożliwia nam to wydzielenie pracy, między różnymi instancjami lub odbierać dane np. z MiNiFi. |
Connection | Zapewnia rzeczywiste połączenie między procesorami lub grupami. Działają one jak kolejki i mogą posłużyć do trasowania danych między instancjami w klastrze. Pozwalają ustawić górne granice kolejki np. poprzez ilość FlowFile lub poprzez zajętość miejsca. |
FlowFile | Reprezentuje obiekt poruszający się w przepływie danych, posiada on atrybuty oraz strumień danych. NiFi umożliwia odtworzenie każdego kroku przez co możemy prześledzić wszystkie operacje dokonane na danym FlowFile |
Wersjonowanie zmian za pomocą NiFi Registry
NiFi Registry jest to podprojekt Apache NiFi do wersjonowania i przechowywania przepływów danych. Zbudowane przepływy danych należy wersjonować, ponieważ poza kontrolą wersji znacznie skraca czas wdrażania nowej instancji NiFi. Instalacja i konfiguracja oczywiście odbywa się poprzez CLI maszyny, na której docelowo ma być uruchomione. Natomiast commitowanie czy też wprowadzanie przepływu danych do Registry odbywa się za pomocą WebUI NiFi. Wersjonowanie pozwala na kontrolowanie zgodności przepływu oraz scentralizowane zarządzanie przepływami między instancjami NiFi. Dzięki temu mamy pewność, że użyty zestaw procesorów jest taki sam jak na innym klastrze, każda zmiana w przepływie jest odpowiednio sygnalizowana przez co łatwo zlokalizować różnicę. Dla programistów nie jest to zaś idealne rozwiązanie, ponieważ NiFi Registry nie posiada tak rozbudowanej funkcjonalności jak Git np. gałęzie. Przez co czynności związane z CI/CD dla NiFi mogą stanowić wyjątek.
MiNiFi do pozyskiwania danych z urządzeń IoT i urządzeń stacjonarnych
Kolejnym podprojektem jest Apache MiNiFi jest to uzupełnienie całego ekosystemu NiFi. Narzędzie to minimalistycznym rozwiązaniem, bez GUI, a jego zawartość w procesory jest okrojona. Głównym zadaniem owego narzędzia jest gromadzenie danych u źródła ich powstania np. czujniki, sensory itp. Oprócz gromadzenia danych MiNiFi pozwala na, niektóre transformacje danych z racji tego, że ma ograniczone możliwości w stosunku do NiFi przeważne dane z MiNiFi są przesyłane do instancji NiFi i tam dalej modyfikowane, więc w rzeczywistości MiNiFi działa jako agent do zbierania danych. Cechuje się małym zużyciem zasobów oraz niewielkim rozmiarem przez co idealnie wpasowuje się na urządzenia typu IoT.