Kuidas omada sündmustepõhist graafianalüütikat Neo4j ja Apache Kafka abil

Foto autor Rawpixel saidil Unsplash

Sissejuhatus

Uute Neo4j Kafka voogudega, mis nüüd saadaval on, soovitasid mu kolleeg Neo4j kolleeg Tom Geudens ja ma seda proovida. Meil on meeles palju kasutusjuhtumeid, mis võimendavad graafiaandmebaaside ja sündmuspõhise arhitektuuri võimsust. Esimene, mida uurime, ühendab graafikute algoritmide võimsuse ja tehinguandmebaasi.

Uus Neo4j Kafka voogude kogu on Neo4j pistikprogramm, mille saate lisada igale Neo4j eksemplarile. See võimaldab kolme tüüpi Apache Kafka mehhanisme:

  • Lavastaja: põhineb Neo4j konfiguratsioonifailis üles seatud teemadel. Väljundid nimetatud teemadele toimuvad siis, kui täpsustatud sõlme või suhte tüüp muutub
  • Tarbija: põhineb Neo4j konfiguratsioonifailis üles seatud teemadel. Kui nimetatud teemade sündmused on üles korjatud, käivitatakse iga teema jaoks ette nähtud Cypher päring
  • Protseduur: otsene üleskutse Cypheris avaldada konkreetne nimikoor konkreetsel teemal

Siit saate üksikasjalikuma ülevaate, kuidas need kõik välja võiksid näha.

Ülevaade olukorrast

Graafiku algoritmid pakuvad võimsaid analüütilisi võimeid. Need aitavad meil suhteid analüüsides paremini mõista meie andmete konteksti. Graafiku algoritme kasutatakse näiteks selleks, et:

  • Mõista võrgusõltuvusi
  • Kogukondade tuvastamine
  • Tehke kindlaks mõjutajad
  • Arvutage soovitused
  • Ja nii edasi.

Neo4j pakub komplekti graafikalgoritme karbist välja pistikprogrammi kaudu, mida saab kasutada otse Neo4j-s olevate andmetega. See algoritmide kogu on väga populaarselt vastu võetud. Olen mitu korda saanud tagasisidet, et pistikprogrammid on sama kiired või kiiremad, kui kliendid on varem kasutanud. Sellise imelise tagasiside korral miks me ei tahaks neid optimeeritud ja toimivaid algoritme rakendada Neo4j andmebaasis?

Neo4j graafi algoritmi kategooriad

Mis tahes analüütilise protsessi täielik ärakasutamine vajab ressursse. Kena, esineva kogemuse saamiseks tahame pakkuda nii palju protsessorit ja mälu, kui me endale lubada võime.

Nüüd saaksime sellist tööd oma tehinguklastri kallal käivitada. Kuid selles tüüpilises arhitektuuris seisame silmitsi mõne väljakutsega. Näiteks kui üks masin on suur, peaksid klastri teised masinad vastama. See võib tähendada, et üles seatud arhitektuur on kallis.

Teine probleem, millega silmitsi seisame, on see, et meie klaster peaks haldama tehinguid - igapäevased päringud, näiteks taotluste töötlemine. Me ei taha seda kaaluda mudeli erinevate iteratsioonide ja permutatsioonide läbi krigistamisega. Ideaalis tahame selle koos sellega seotud analüütilise tööga maha laadida.

Kui me teame, et toimuv keeruline päring on ainult kirjutuskaitstud, on see lihtne lahendus. Saame koorma haldamiseks loetud repliike üles keerutada. See hoiab klastri keskendudes sellele, mida ta peaks tegema, toetades toimivat, tehingusüsteemi.

Kuid kuidas käsitleda analüütilise töötlemise osana operatsioonigraafikule kirjutamist? Tahame neid tulemusi, näiteks soovitusi, niipea kui need on kättesaadavad.

Loetud koopiad on nagu nimigi ütleb - need on mõeldud ainult kirjutuskaitstud rakendustele. Nad ei osale ei klastri juhtide valimistel ega ka kirjalikult. Neo4j-vooge kasutades saame voogesitada tulemused loetud koopiatest tagasi klastrisse tarbimiseks.

Sel viisil lähenemise suured eelised hõlmavad järgmist:

  • Meil on klastri poolt pakutav kõrge kättesaadavus / avariitaaste.
  • Andmed peavad olema ühesugused nii loetud repliigis kui ka klastris. Me ei pea muretsema loetud koopia värskendamise pärast, sest klaster hoolitseb selle eest meie eest.
  • Sõlmede ja suhete ID-d on klastri serverites ja loetud repliigis identsed. See teeb värskendamise tõesti lihtsaks.
  • Saame eraldada ressursse lugemiseks vajaliku koopia jaoks, mis tõenäoliselt erineb klastrist.

Meie arhitektuur näeb välja nagu joonisel. A on meie loetud koopia ja B on meie põhjuslik klaster. A saab tehinguteabe B-lt. Kõik A arvutatud tulemused voogesitatakse Kafka-teadete kaudu tagasi B-sse.

Jätkame siis meie värskendatud mustriga lihtsa näitega.

Näidiskomplekt

Me kasutame filmide andmebaasi andmekogumit, mis on saadaval aadressil: Esita filmide juhend Neo4j brauseris. Selles näites kasutame nelja Neo4j esinemisjuhtu:

  • Analüüsi eksemplar - see saab olema meie loetud koopia ja sellel eksemplaril hakkame PageRank-i käitama kõigis andmekomplekti Isiku sõlmedes. Väljundi postitamiseks meie Kafka teemale kutsume protseduuri streams.publish ().
  • Operatiivsed eksemplarid - see on meie kolme serveri põhjuslik klaster, mis võtab arvesse muutusi inimese sõlmes. Värskendame muudatuste saabudes.

Kafka puhul järgime juhiseid kiirjuhendist kuni 2. etapini. Enne Kafka kasutuselevõtmist peame seadistama Neo4j konfiguratsioonifailidesse tarbijaelemendid. Samuti loome klastri ise. Pange tähele, et praegu töötab neo4j-stream ainult Neo4j versiooniga 3.4.x.

Kolme serveriklastri ja loetud repliigi seadistamiseks järgime Neo4j-i toimingute juhendis toodud juhiseid. Järgige tuumade ja ka ühe loetud koopia juhiseid.

Lisaks peame põhjusliku klastri serverite jaoks lisama neo4j.config järgmised andmed:

# ************
# Kafka Config - tarbija
# ************
kafka.zookeeper.connect = localhost: 2181
kafka.bootstrap.servers = localhost: 9092
kafka.group.id = neo4j-core1
streams.sink.enabled = true
streams.sink.topic.cypher.neorr = ÜHENDUSEGA.laadimine kasuliku koormusena MATCH (p: isik) KUS ID (p) = kasulik koormus [0] SET p.pagerank = kasulik koormus [1]

Pange tähele, et tahame muuta kafka.group.id vastavalt neo4j-core2 ja neo4j-core3.

Loetud koopia jaoks peame saidile neo4j.config lisama järgmise:

# ************
# Kafka konfiguratsioon - protseduur
# ************
kafka.zookeeper.connect = localhost: 2181
kafka.bootstrap.servers = localhost: 9092
kafka.group.id = neo4j-read1

Peate alla laadima ja salvestama neo4j-voogude jari pluginate kausta. Samuti peate lisama graafiku algoritmi teegi Neo4j Desktopi kaudu või käsitsi.

Pärast vastavate konfiguratsioonifailide muudatuste seadmist ja salvestamist ning pistikprogrammide installimist käivitame kõik järgmises järjekorras:

  • Apache loomaaednik
  • Apache Kafka
  • Neo4j põhjusliku klastri kolm juhtumit
  • Loetud koopia

Kui kõik Neo4j eksemplarid on üles töötatud ja klaster on kõik liikmed avastanud, saame loetud repliigil käivitada järgmise päringu:

CALL algo.pageRank.stream ('MATCH (p: Person) RETURN id (p) AS id',
'MATCH (p1: inimene) -> () <- (p2: isik) TAGASI erinev id (p1) AS-i allikas, id (p2) AS-i sihtmärk', {graafik: 'cypher'}) YIELD nodeId, score
WITH [nodeId, score] AS res
CALL streams.publish ('neorr', res)
TAGASI COUNT (*)

See Cypher päring kutsub määratud konfiguratsiooniga PageRank algoritmi. Kui algoritm on valmis, voogesitame tagastatud sõlme ID-d ja PageRanki skoori määratud teemaga.

Apache Kafka kiirjuhendi 5. sammu (testi asendamine neorr'iga) abil saame vaadata, kuidas neorr teema välja näeb:

Kokkuvõte

Selles postituses oleme näidanud:

  • Tehinguandmete ja analüütiliste andmete eraldamine
  • Valutult voolanud analüütilised tulemused vastavad reaalajas tarbimisele tagasi

Ehkki oleme kasutanud lihtsat näidet, näete, kuidas saab läbi viia keeruka analüütilise töö, toetades sündmuspõhist arhitektuuri.