Automatisering av flowleverans i Apache NiFi

Hej alla!

Automatisering av flowleverans i Apache NiFi

Uppgiften bestÄr i följande - det finns en flow som visas pÄ bilden ovan, som mÄste rullas ut pÄ N servrar med Apache NiFi. Flowet Àr ett test - det handlar om att generera en fil och skicka den till en annan NiFi-instans. Dataöverföringen sker via NiFi Site to Site-protokollet.

NiFi Site to Site (S2S) Àr ett sÀkert, lÀttanpassat sÀtt att överföra data mellan NiFi-instanser. Hur S2S fungerar kan du lÀsa om i dokumentationen och det Àr viktigt att inte glömma att konfigurera NiFi-instansen för att tillÄta S2S, se ). Ett typiskt exempel pÄ anvÀndning:.

I de fall dÀr det handlar om dataöverföring med S2S - en instans kallas klient, den andra server. Klienten skickar data, servern tar emot. Det finns tvÄ sÀtt att stÀlla in dataöverföring mellan dem:

  1. Push. FrÄn klientinstansen skickas data med hjÀlp av Remote Process Group (RPG). PÄ serverinstansen tas data emot via Input Port
  2. Pull. Servern tar emot data via RPG, klienten skickar med hjÀlp av Output port.


Flowet för rullning lagrar vi i Apache Registry.

Apache NiFi Registry Àr ett underprojekt av Apache NiFi, som representerar ett verktyg för att lagra flöden och hantera versioner. En sorts GIT. Information om installation, konfiguration och arbete med registry kan hittas i den officiella dokumentationen. Flödena för lagring samlas i en processgrupp och lagras sÄ i registry. Vi kommer att Äterkomma till detta lÀngre fram i artikeln.

I början, nÀr N Àr ett litet antal, levereras och uppdateras flödet manuellt inom rimlig tid.

Men med ökande N blir problemen fler:

  1. det tar lÀngre tid att uppdatera flödet. Man mÄste logga in pÄ alla servrar
  2. det uppstÄr fel vid uppdatering av mallar. HÀr har vi uppdaterat, men hÀr har vi glömt
  3. mÀnskliga fel vid utförande av ett stort antal likadana operationer

Allt detta leder oss till att vi mÄste automatisera processen. Jag har testat följande lösningar pÄ detta problem:

  1. AnvÀnda MiNiFi istÀllet för NiFi
  2. NiFi CLI
  3. NiPyAPI

AnvÀndning av MiNiFi

Apache MiNiFy — delprojekt Apache NiFi. MiNiFy — en kompakt agent som anvĂ€nder samma processorer som NiFi, vilket möjliggör skapandet av samma flöden som i NiFi. Agentens lĂ€ttviktighet uppnĂ„s delvis genom att MiNiFy inte har nĂ„got grafiskt grĂ€nssnitt för konfiguration av flöden. Avsaknaden av ett grafiskt grĂ€nssnitt i MiNiFy innebĂ€r att man mĂ„ste lösa problemet med att leverera flöden till Minifi. Eftersom MiNiFy anvĂ€nds aktivt inom IoT, finns det mĂ„nga komponenter, och processen att leverera flöden till slutliga Minifi-instans mĂ„ste automatiseras. KĂ€nns det igen?

En annan delprojekt som kan hjÀlpa att lösa ett sÄdant problem Àr MiNiFi C2 Server. Denna produkt Àr avsedd att fungera som en central punkt i arkitekturen för distribution av konfigurationer. Hur man konfigurerar miljön beskrivs i denna artikel Habré, och informationen Àr tillrÀcklig för att lösa den aktuella uppgiften. MiNiFi uppdaterar automatiskt sin konfiguration i tandem med C2 server. Den enda nackdelen med detta tillvÀgagÄngssÀtt Àr att man mÄste skapa mallar pÄ C2 Server, ett enkelt Ätagande i registret Àr inte tillrÀckligt.

Alternativet som beskrivs i artikeln ovan Àr funktionellt och inte svÄrt att implementera, men man fÄr inte glömma följande:

  1. Det finns inte alla processorer frÄn NiFi i MiNiFi.
  2. Versionsnummerna pÄ processorerna i MiNiFi ligger efter versionerna i NiFi.

Vid tidpunkten för skrivandet av publiceringen Ă€r den senaste versionen av NiFi — 1.9.2. Versionsnumret pĂ„ processorerna i den senaste versionen av MiNiFi Ă€r 1.7.0. Processorer kan lĂ€ggas till MiNiFi, men pĂ„ grund av versionsskillnader mellan NiFi- och MiNiFi-processorerna kanske det inte fungerar.

NiFi CLI

Enligt beskrivningen av verktyget pÄ den officiella webbplatsen, detta Àr ett verktyg för att automatisera interaktionen mellan NiFi och NiFi Registry inom omrÄdet för flödesleverans eller processhantering. För att börja anvÀnda detta verktyg mÄste det laddas ner. hÀrifrÄn.

Vi startar verktyget

.\/bin\/cli.sh
           _     ___  _
 Apache   (_)  .' ..](_)   ,
 _ .--.   __  _| |_  __    )
[ `.-. | [  |'-| |-'[  |  \/  
|  | | |  | |  | |   | | '    '
[___||__][___][___] [___]',  ,'
                           `'
          CLI v1.9.2

Skriv 'help' för att se en lista över tillgÀngliga kommandon, anvÀnd tab för att autocompleta.

För att ladda ner det nödvÀndiga flödet frÄn registret mÄste vi veta bucket identifierare (bucket identifier) och flödets identifierare (flow identifier). Dessa data kan erhÄllas antingen via CLI eller i webgrÀnssnittet för NiFi-registret. I webbgrÀnssnittet ser det ut sÄ hÀr:

Automatisering av flowleverans i Apache NiFi

Med hjÀlp av CLI gör man sÄ hÀr:

#> registry list-buckets -u http://nifi-registry:18080

#   Name             Id                                     Description
-   --------------   ------------------------------------   -----------
1   test_bucket   709d387a-9ce9-4535-8546-3621efe38e96   (empty)

#> registry list-flows -b 709d387a-9ce9-4535-8546-3621efe38e96 -u http://nifi-registry:18080

#   Name           Id                                     Description
-   ------------   ------------------------------------   -----------
1   test_flow   d27af00a-5b47-4910-89cd-9c664cd91e85

Vi startar importen av processgruppen frÄn registret:

#> nifi pg-import -b 709d387a-9ce9-4535-8546-3621efe38e96 -f d27af00a-5b47-4910-89cd-9c664cd91e85 -fv 1 -u http://nifi:8080

7f522a13-016e-1000-e504-d5b15587f2f3

En viktig punkt — vilken vĂ€rd som helst kan anges som processen som vi tillĂ€mpar processgruppen pĂ„.

Processgruppen har lagts till med stoppade processorer, de mÄste startas.

#> nifi pg-start -pgid 7f522a13-016e-1000-e504-d5b15587f2f3 -u http://nifi:8080

UtmÀrkt, processorerna har startat. Men enligt uppgiften behöver vi att NiFi-instanserna skickar data till andra instanser. LÄt oss anta att vi har valt Push-metoden för att överföra data till servern. För att organisera datatransmission mÄste vi aktivera överföringen pÄ den tillagda Remote Process Group (RPG) som redan ingÄr i vÄrt flöde.

Automatisering av flowleverans i Apache NiFi

I dokumentationen för CLI och andra kĂ€llor har jag inte hittat nĂ„got sĂ€tt att aktivera datatransmission. Om du vet hur man gör detta — vĂ€nligen skriv det i kommentarerna.

Eftersom vi har bash och Ă€r redo att gĂ„ hela vĂ€gen — lĂ„t oss hitta en lösning! Vi kan anvĂ€nda NiFi API för att lösa det hĂ€r problemet. Vi kommer att anvĂ€nda följande metod, ID tar vi frĂ„n exemplen ovan (i vĂ„rt fall Ă€r det 7f522a13-016e-1000-e504-d5b15587f2f3). Beskrivning av metoderna i NiFi API. ). Ett typiskt exempel pĂ„ anvĂ€ndning:.

Automatisering av flowleverans i Apache NiFi
I body mÄste vi skicka JSON av följande typ:

{
    "revision": {
	    "clientId": "value",
	    "version": 0,
	    "lastModifier": "value"
	},
    "state": "value",
    "disconnectedNodeAcknowledged": true
}

Parametrarna som mÄste fyllas i för att det ska "fungera":
state — överföringsstatus. TillgĂ€ngligt TRANSMITTING för att aktivera datatransmission, STOPPED för att stĂ€nga av.
version — processor-version.

version kommer som standard att vara 0 vid skapande, men dessa parametrar kan erhÄllas med metoden.

Automatisering av flowleverans i Apache NiFi

För bash-skriptets Ă€lskare kan denna metod verka anvĂ€ndbar, men det Ă€r inte riktigt min starka sida — bash-skript Ă€r inte min favorit. Den nĂ€sta metoden Ă€r enligt min Ă„sikt mer intressant och bekvĂ€m.

NiPyAPI

NiPyAPI — ett bibliotek för Python för att interagera med NiFi-instanser. Dokumentationssidan innehĂ„ller nödvĂ€ndig information för att arbeta med biblioteket. Snabbstart finns beskriven i projekt pĂ„ github.

VĂ„rt skript för att distribuera konfigurationen — ett program skrivet i Python. LĂ„t oss gĂ„ vidare med kodningen.
Vi konfigurerar instÀllningarna för framtida arbete. Vi behöver följande parametrar:

nipyapi.config.nifi_config.host = 'http://nifi:8080/nifi-api' #vÀg till nifi-api-instansen dÀr vi distribuerar processgruppen
nipyapi.config.registry_config.host = 'http://nifi-registry:18080/nifi-registry-api' #vÀg till nifi-registry-api-registret
nipyapi.config.registry_name = 'MyBeutifulRegistry' #namn pÄ registret som det kommer att kallas i nifi-instansen
nipyapi.config.bucket_name = 'BucketName' #namn pÄ bucketen frÄn vilken vi drar flödet
nipyapi.config.flow_name = 'FlowName' #namn pÄ flödet som vi drar in

Jag kommer nu att införa namnen pÄ metoderna i detta bibliotek som beskrivs ). Ett typiskt exempel pÄ anvÀndning:.

Vi ansluter registret till nifi-instansen med hjÀlp av

nipyapi.versioning.create_registry_client

I detta steg kan man ocksÄ lÀgga till en kontroll för att se om registret redan har lagts till instansen, för detta kan man anvÀnda metoden

nipyapi.versioning.list_registry_clients

Vi hittar bucket för vidare sökning av flow i korgen

nipyapi.versioning.get_registry_bucket

UtifrÄn den hittade bucketen söker vi efter flow

nipyapi.versioning.get_flow_in_bucket

Det Ă€r viktigt att förstĂ„ om denna processgrupp redan har lagts till. Processgruppen placeras utifrĂ„n koordinater och det kan hĂ€nda att en andra komponent överlappar en första. Jag har kontrollerat, sĂ„ kan det vara 🙂 För att fĂ„ alla tillagda processgrupper anvĂ€nder vi metoden

nipyapi.canvas.list_all_process_groups

och vi kan sedan söka, till exempel efter namn.

Jag kommer inte att beskriva processen för att uppdatera mallen, jag nÀmner bara att om processorer lÀggs till i den nya versionen av mallen finns det inga problem med meddelanden i köerna. Men om processorer tas bort kan problem uppstÄ (nifi tillÄter inte att ta bort en processor om det finns en kö med meddelanden framför den). Om du Àr intresserad av hur jag löste detta problem - skriv till mig, sÄ diskuterar vi detta. Kontakterna finns i slutet av artikeln. LÄt oss gÄ vidare till steget för att lÀgga till processgruppen.

Vid felsökning av skriptet stötte jag pÄ en egenskap som gör att den senaste versionen av flow inte alltid dras in, sÄ jag rekommenderar att man först kontrollerar denna version:

nipyapi.versioning.get_latest_flow_ver

Vi deployar processgruppen:

nipyapi.versioning.deploy_flow_version

Vi startar processorerna:

nipyapi.canvas.schedule_process_group

I avsnittet om CLI stod det att dataöverföring inte automatiskt aktiveras i remote process group? NÀr jag implementerade skriptet stötte jag ocksÄ pÄ detta problem. Vid den tidpunkten kunde jag inte starta dataöverföring via API och jag beslöt mig för att skriva till utvecklaren av NiPyAPI-biblioteket och be om rÄd/hjÀlp. Utvecklaren svarade mig, vi diskuterade problemet och han skrev att han behövde tid "för att kolla pÄ nÄgot". Och sÄ, efter ett par dagar kom ett brev dÀr en funktion pÄ Python som löser mitt problem dök upp!!! Vid den tidpunkten var versionen av NiPyAPI 0.13.3 och i den fanns sÄ klart inget sÄdant. Men i version 0.14.0, som nyligen slÀpptes, ingick den hÀr funktionen i biblioteket. HÀr Àr den,

nipyapi.canvas.set_remote_process_group_transmission

SÄ med hjÀlp av biblioteket NiPyAPI kopplade vi upp oss mot registry, skapade flow och till och med startade processorer och dataöverföring. Nu kan vi finslipa koden, lÀgga till olika kontroller, loggning och allt det dÀr. Men det Àr en helt annan historia.

Av de alternativ jag har övervÀgt tyckte jag att det senaste var det mest funktionella. För det första handlar det fortfarande om kod i Python, vilket gör att man kan integrera hjÀlpprogram och dra nytta av sprÄkets fördelar. För det andra utvecklas projektet NiPyAPI aktivt, och vid problem kan man kontakta utvecklaren. För det tredje Àr NiPyAPI ett mer flexibelt verktyg för att interagera med NiFi nÀr man hanterar komplexa problem. Till exempel i att faststÀlla om meddelandeköerna i flow just nu Àr tomma och om processgruppen kan uppdateras.

Det var allt. Jag har beskrivit tre tillvĂ€gagĂ„ngssĂ€tt för automatisering av leveransen av flow i NiFi, fallgropar som utvecklaren kan stöta pĂ„ och gett fungerande kod för automatisering av leveransen. Om du Ă€r lika intresserad av detta Ă€mne som jag Ă€r — hör av dig!

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster