Introduzione ad Apache NiFi – Big Data in streaming

Apache Nifi (aka NiFi) è un tool per l’ingestion dei dati in streaming, ma non solo. Permette di arricchire e modificare i dati mentre lo ”attraversano”e li salva in un database o un file system.

Nasce dall’esigenza di raccogliere dati da supporti IoT differenti; per questo ha differenti connettori in input, ma anche di output.

In questo articolo viene introdotta la struttura di NiFi; si vedrà la sua storia e i componenti di che lo formano. La lettura è indicata a chi vuole iniziare a conoscere uno strumento in grado di modificare e migliorare i metodi di ingestion ed elaborazione dei flussi di dati.

 

Storia di NiFi

NiFi nasce da ”Niagara Files”, una tecnologia sviluppata per quasi un decennio in seno all’NSA per sviluppare uno strumento in grado di ricevere, o recuperare, i dati da differenti fonti per poi fare una leggere preparazione del dato prima di salvarlo su differenti dispositivi. Uno degli obbiettivi che si erano prefissati era appunto che tale strumento doveva essere sufficientemente leggero e versatile da poter essere avviato anche su dispositivi embedded o comunque dalle risorse limitate. Successivamente il progetto viene messo a disposizione dell’Apache Foundation (Figura 3) ed effettivamente è in grado di girare tranquillamente su una Raspberry PI. A tal proposito è anche nato un progetto parallelo miniNiFi che è un’ulteriore alleggerimento del progetto padre.

NiFi_dev_progress

Lo sviluppo di NiFi ha ricevuto un buon riscontro da parte della community anche per alcune peculiarità:

  • Ha molteplici connettori per facilitare la distribuzione dei dati
  • Web-base User Interface per la creazione, il monitoring e il controllo dei data flows
  • Possibilità di modificare i data flows runtime
  • Tiene traccia della provenienza dei dati per ogni data flows
  • Facilmente estendibile tramite lo sviluppo di processors customizzati
  • E’ possibile utilizzare delle API rest per il management

 

Struttura di NiFi

I concetti fondamentali del design strutturale di NiFi sono fortemente legati alla Flow Based Programming [fbp]. Riportiamo una tabella di confronto tra i componenti di NiFi, alcuni li vedremo più nel dettaglio durante questo articolo, e questo modello di programmazione (Tabella 1).

tab_confronto_per_wp

NiFi é formato da una webUI attraverso la quale si crea il ”percorso” (aka DataFlow) che i dati andranno a seguire subendo eventuali elaborazioni. I vari componenti di elaborazione, chiamati processors, vengono collocati tramite Drag & Drop. E’ possibile eseguire NiFi come nodo singolo oppure in modalità cluster; in questo caso si avrà un’installazione adibita ad essere il manager, dove viene disegnato il DataFlow mentre le altre installazioni saranno effettivamente i nodi worker dove verranno eseguite le elaborazioni.

 

DataFlow

Come anticipato il DataFlow è il percorso che i dati seguono e viene disegnato inserendo i processors. Questi ultimi si collegano tra loro tramite delle queue. A seconda del processor si possono avere differenti code a seconda dell’esito dell’elaborazione; per esempio il processors che esegue una richiesta HTTP può avere una coda in caso di success ed una in caso di failure. Questo permette di splittare i rami di esecuzione per diversificare i comportamenti in base ad un evento o una variabile (in NiFi le variabili sono chiamate attributi ).

 

Processor

I processors si possono vedere come unità di elaborazione specializzata; ognuno di essi ha una funzione specifica dal prelevare un file sul filesystem locale all’eseguire una query SQL, ma ognuno di essi ha all’interno:

  • Settings – Imposta un nome (Name), la durata minima di tempo che deve intercorrere tra una esecuqione e l’altra (Yield duration)
    e quando il JOB deve considerarsi autoterminato (textitAuto terminate relationships); quest’ultimo punto è legato alle queue; infatti nell’esempio di prima è possibile assegnare una coda nel caso di success e decidere di terminarfe il JOB, specifico per quel dato (Content File), in caso di failure. Questo spuntando l’opzione in Auto terminate relationships. In questa scheda è inoltre possibile settare il livello di logging.
  • Scheduling – Definisce la Scheduling strategy; è possibile decidere se eseguirlo a giro di cron (CRON driven) oppure ogni tot secondi (Time Driven). E’ inoltre possibile decidere di eseguire questo processors solo sul nodo primario; attenzione: se un dato viene lavorato su un nodo, tutto il DataFlow sarà elaborato su quel nodo. Infine in questa sezione è possibile anche indicare il numero massimo di task concorrenti per processors per ogni singolo nodo.
  • Properties – E’ dove ci sono le configurazioni del processors, ad esempio il path su dove trovare un file da caricare. Possono essere predefinite oppure definibili dall’utente; è anche possibile utilizzare l’ Expression Language di NiFi per fare piccole elaborazioni. Ovviamente ogni processors ha le proprie configurazioni, ma il menù contestuale di ognuno ci da la possibilità di accedere alla documentazione (click destro sul processors e poi su Usage).
  • Comments – E’ possibile indicare dei commenti liberi

Di seguito un piccolo esempio dell’interfaccia web in cui sono stati posti due processors (di tipo rispettivamente GetFile e RoutOnAttribute) uniti da una queue in caso di success dell’esecuzione del primo processor.

NiFi_process_queue_example

L’interfaccia ci fornisce subito alcuni dati legati all’esecuzione: i dati in input e output negli ultimi 5 minuti. Quasi tutte le statistiche di NiFi vengono fornite con numero di FlowFile/bytes.

 

Queue

Abbiamo già detto che vengono usate per unire i vari processors, va aggiunto che hanno un concetto di priorità:

  • Su base temporale, in ordine di arrivo oppure importanza di un data set.
  • E’ possibile e relativmante semplice scrivere un prioritizer ad hoc

NiFi_queue_priority

 

Attributi e Content File

Fin’ora abbiamo parlato genericamente di dati che percorrono il DataFlow; ora definiamo questi pacchetti di dati come FlowFiles: è una serie di coppie key/velue detti attributi, sostanzialmente delle variabili. Inoltre è presente il dato raw che è contenuto nel Contenti File.

 

Conclusioni

Di sicuro le potenzialità di Apache NiFi sono davvero molte e continuano a crescere anche grazie alla community che rilascia continuamente nuovi processors, per tanto un articolo esaustivo è impossibile da redigere; tuttavia qui sono racchiuse tutte le informazioni necessarie per comprendere adeguatamente la documentazionee e poter iniziare a sviluppare i primi flow. Inoltre l’obbiettivo era anche quello di rendere più semplice la lettura dei successivi articoli di stampo nettamente più tecnico e pratico.

One Comment

Add a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *