Potrivit unui raport recent al IBM Marketing cloud, „90% din datele din lumea de astăzi au fost create numai în ultimii doi ani, creând 2.5 quintilioane de octeți de date în fiecare zi – iar odată cu apariția de noi dispozitive, senzori și tehnologii, rata de creștere a datelor va accelera probabil și mai mult”.
Din punct de vedere tehnic, acest lucru înseamnă că lumea noastră de procesare Big Data va fi mai complexă și mai provocatoare. Și o mulțime de cazuri de utilizare (de exemplu, reclamele din aplicațiile mobile, detectarea fraudelor, rezervarea de taxiuri, monitorizarea pacienților,etc.) au nevoie de procesarea datelor în timp real, pe măsură ce sosesc datele, pentru a lua decizii rapide și acționabile. Acesta este motivul pentru care procesarea distribuită a fluxurilor a devenit foarte populară în lumea Big Data.
Astăzi există o serie de cadre de streaming open source disponibile. Interesant este faptul că aproape toate sunt destul de noi și au fost dezvoltate doar în ultimii câțiva ani. Prin urmare, este destul de ușor pentru o persoană nouă să se încurce în înțelegerea și diferențierea între cadrele de streaming. În această postare voi vorbi mai întâi despre tipurile și aspectele procesării fluxurilor în general și apoi voi compara cele mai populare cadre de streaming open source: Flink, Spark Streaming, Storm, Kafka Streams. Voi încerca să explic cum funcționează (pe scurt), cazurile lor de utilizare, punctele forte, limitările, asemănările și diferențele.
Ce este Streaming/Stream Processing :
Cea mai elegantă definiție pe care am găsit-o este : un tip de motor de procesare a datelor care este proiectat având în vedere seturi infinite de date. Nimic mai mult.
Dincolo de procesarea pe loturi, unde datele sunt delimitate cu un început și un sfârșit într-un job și jobul se termină după procesarea acelor date finite, Streaming-ul este menit să proceseze date nelimitate care vin în timp real în mod continuu timp de zile, luni, ani și pentru totdeauna. Ca atare, fiind menită să fie mereu în funcțiune, o aplicație de streaming este greu de implementat și mai greu de întreținut.
Aspecte importante ale procesării în flux:
Există câteva caracteristici și termeni importanți asociați cu procesarea în flux pe care ar trebui să îi cunoaștem pentru a înțelege punctele forte și limitările oricărui cadru de streaming :
- Garanții de livrare :
Înseamnă care este garanția că, indiferent de situație, o anumită înregistrare care intră într-un motor de streaming va fi procesată. Aceasta poate fi fie Atleast-once (va fi procesată cel puțin o dată chiar și în cazul unor eșecuri) , Atmost-once (poate să nu fie procesată în cazul unor eșecuri) sau Exactly-once (va fi procesată o dată și exact o dată chiar și în cazul unor eșecuri) . Evident, Exactly-once este de dorit, dar este greu de realizat în sistemele distribuite și vine cu compromisuri în ceea ce privește performanța. - Toleranță la defecțiuni :
În cazul unor defecțiuni, cum ar fi defecțiuni ale nodurilor, defecțiuni ale rețelei etc., cadrul ar trebui să fie capabil să se recupereze și să înceapă din nou procesarea din punctul în care a rămas. Acest lucru se realizează prin verificarea din când în când a stării de streaming către o stocare persistentă. de exemplu, prin verificarea offseturilor kafka către zookeeper după obținerea înregistrărilor de la Kafka și procesarea lor. - Managementul stării :
În cazul cerințelor de procesare cu stare în care trebuie să menținem o anumită stare (de ex.g. numărătoarea fiecărui cuvânt distinct văzut în înregistrări), cadrul ar trebui să fie capabil să furnizeze un mecanism de păstrare și actualizare a informațiilor de stare. - Performanță :
Aceasta include latența (cât de repede poate fi procesată o înregistrare), debitul (înregistrări procesate/secundă) și scalabilitatea. Latența ar trebui să fie cât mai mică posibil, în timp ce debitul ar trebui să fie cât mai mare posibil. Este dificil să le obțineți pe amândouă în același timp. - Caracteristici avansate : Event Time Processing, Watermarks, Windowing
Acestea sunt caracteristici necesare dacă cerințele de procesare a fluxurilor sunt complexe. De exemplu, procesarea înregistrărilor în funcție de momentul în care au fost generate la sursă (procesare timp eveniment). Pentru a afla mai multe în detaliu, vă rugăm să citiți aceste postări pe care trebuie să le citiți neapărat de către Tyler Akidau, un tip de la Google : partea 1 și partea 2. - Maturitate :
Important din punct de vedere al adoptării, este bine dacă cadrul este deja dovedit și testat în luptă la scară largă de către companii mari. Este mai probabil să primească un sprijin bun din partea comunității și ajutor pe stackoverflow.
Două tipuri de procesare a fluxurilor:
Acum fiind conștienți de termenii pe care tocmai i-am discutat, este acum ușor de înțeles că există 2 abordări pentru a implementa un cadru de streaming:
Native Streaming :
Cunoscut și sub numele de Native Streaming. Aceasta înseamnă că fiecare înregistrare primită este procesată imediat ce sosește, fără a aștepta altele. Există câteva procese care rulează continuu (pe care le numim operatori/task-uri/bolțuri, în funcție de cadru) care rulează pentru totdeauna și fiecare înregistrare trece prin aceste procese pentru a fi procesată. Exemple : Storm, Flink, Kafka Streams, Samza.
Micro-batching :
Cunoscut și sub numele de Fast Batching. Înseamnă că înregistrările primite la fiecare câteva secunde sunt grupate împreună și apoi procesate într-un singur mini-lot cu o întârziere de câteva secunde. Exemple: Spark Streaming, Storm-Trident.
Ambele abordări au unele avantaje și dezavantaje.
Stringerea nativă pare naturală, deoarece fiecare înregistrare este procesată imediat ce sosește, permițând cadrului să obțină o latență minimă posibilă. Dar aceasta înseamnă, de asemenea, că este greu de realizat toleranța la erori fără a compromite randamentul, deoarece pentru fiecare înregistrare trebuie să urmărim și să verificăm punctul de control odată ce a fost procesată. De asemenea, gestionarea stării este ușoară, deoarece există procese care rulează de mult timp și care pot menține cu ușurință starea necesară.
Micro-batching , pe de altă parte, este cu totul opus. Toleranța la erori este gratuită, deoarece este în esență un lot, iar randamentul este, de asemenea, ridicat, deoarece procesarea și verificarea punctelor de control se vor face dintr-o singură lovitură pentru un grup de înregistrări. Dar acest lucru se va face cu un anumit cost de latență și nu se va simți ca un streaming natural. De asemenea, gestionarea eficientă a stării va fi o provocare pentru a fi menținută.
Streaming Frameworks One By One:
Storm :
Storm este Hadoop al lumii Streaming. Este cel mai vechi cadru de streaming open source și unul dintre cele mai mature și mai fiabile. Este un adevărat streaming și este bun pentru cazuri de utilizare bazate pe evenimente simple. Am împărtășit detalii despre Storm pe larg în aceste postări: partea1 și partea2.
Avantaje:
- Latență foarte scăzută, streaming adevărat, matur și debit ridicat
- Excelent pentru cazuri de utilizare a streamingului necomplicat
Dezavantaje
- Nu există gestionare a stării
- Nu există caracteristici avansate precum procesarea timpului de eveniment, agregare, windowing, sesiuni, filigrane, etc
- Garanție „o singură dată”
Spark Streaming :
Spark a apărut ca fiind adevăratul succesor al lui hadoop în ceea ce privește procesarea pe loturi și primul cadru care susține pe deplin arhitectura Lambda (în care sunt implementate atât Batch cât și Streaming; Batch pentru corectitudine, Streaming pentru viteză). Este extrem de popular, maturizat și adoptat pe scară largă. Spark Streaming este oferit gratuit împreună cu Spark și utilizează micro batching pentru streaming. Înainte de lansarea versiunii 2.0, Spark Streaming avea unele limitări serioase de performanță, dar cu noua versiune 2.0+ , se numește streaming structurat și este echipat cu multe caracteristici bune, cum ar fi gestionarea personalizată a memoriei (ca Flink) numită tungsten, filigrane, suport pentru procesarea timpului de eveniment etc. De asemenea, Structured Streaming este mult mai abstract și există opțiunea de a comuta între modul micro-batching și streaming continuu în versiunea 2.3.0. Modul Continuous Streaming promite să ofere sub latență ca Storm și Flink, dar este încă în stadiu incipient, cu multe limitări în operațiuni.
Avantaje:
- Suportă arhitectura Lambda, vine gratuit cu Spark
- Traseu ridicat, bun pentru multe cazuri de utilizare în care nu este necesară o sub-latență
- Toleranță la erori în mod implicit datorită naturii micro-batch
- Simplu de utilizat API-uri de nivel superior
- Comunitate mare și îmbunătățiri agresive
- Exactly Once
Dezavantaje
- Nu este un adevărat streaming, nu este potrivit pentru cerințele de latență scăzută
- Prea mulți parametri de reglat. Greu de făcut bine. Am scris o postare despre experiența mea personală în timpul reglării Spark Streaming
- Stateless by nature
- Lags behind Flink in many advanced features
Flink :
Flink provine, de asemenea, din medii academice similare cu Spark. În timp ce Spark provine de la UC Berkley, Flink provine de la Universitatea TU din Berlin. Ca și Spark, suportă, de asemenea, arhitectura Lambda. Dar implementarea este cu totul opusă celei din Spark. În timp ce Spark este, în esență, un batch cu Spark streaming ca micro-batching și un caz special de Spark Batch, Flink este, în esență, un adevărat motor de streaming care tratează batch-ul ca pe un caz special de streaming cu date delimitate. Deși API-urile din ambele cadre sunt similare, dar nu au nicio asemănare în ceea ce privește implementările. În Flink, fiecare funcție precum map,filter,reduce,etc. este implementată ca un operator de lungă durată (similar cu Bolt din Storm)
Flink pare a fi un adevărat succesor al lui Storm, așa cum Spark a succedat lui Hadoop în batch.
Avantaje:
- Liderul inovației în peisajul de streaming open source
- Primul cadru de streaming adevărat cu toate caracteristicile avansate, cum ar fi procesarea timpului de eveniment, filigranele, etc
- Letență redusă cu debit ridicat, configurabil în funcție de cerințe
- Auto-ajustare, nu sunt prea mulți parametri de reglat
- Exact o dată
- Căpătând o largă acceptare de către marile companii la scară precum Uber,Alibaba.
Dezavantaje
- Un pic mai târziu în joc, a existat o lipsă de adopție inițial
- Comunitatea nu este la fel de mare ca Spark, dar crește în ritm rapid acum
- Nici o adopție cunoscută a Flink Batch deocamdată, populară doar pentru streaming.
Kafka Streams :
Kafka Streams , spre deosebire de alte cadre de streaming, este o bibliotecă cu greutate redusă. Este utilă pentru streamingul de date de la Kafka , efectuând transformări și apoi trimițând înapoi la Kafka. O putem înțelege ca pe o bibliotecă similară cu Java Executor Service Thread pool, dar cu suport încorporat pentru Kafka. Poate fi integrată bine în orice aplicație și va funcționa din start.
Datorită naturii sale ușoare, poate fi utilizată în arhitectura de tip microservicii. Nu există nici un meci în ceea ce privește performanța cu Flink, dar, de asemenea, nu are nevoie de un cluster separat pentru a rula, este foarte la îndemână și ușor de implementat și de început să lucreze . La nivel intern, utilizează grupul Kafka Consumer și funcționează pe baza filozofiei de jurnal Kafka.
Acest post explică în detaliu cazurile de utilizare a Kafka Streams vs Flink Streaming.
Un avantaj major al Kafka Streams este că procesarea sa este Exact o dată de la un capăt la altul. Acest lucru este posibil deoarece atât sursa, cât și destinația, ambele sunt Kafka și de la versiunea Kafka 0.11 lansată în jurul lunii iunie 2017, Exactly once este suportat. Pentru a activa această caracteristică, trebuie doar să activăm un indicator și va funcționa din start. Pentru mai multe detalii împărtășite aici și aici.
Avantaje:
- Bibliotecă foarte ușoară, bună pentru microservicii, aplicații IOT
- Nu are nevoie de un cluster dedicat
- Impreună cu toate caracteristicile bune ale Kafka
- Suportă îmbinări Stream, utilizează intern rocksDb pentru menținerea stării.
- Exactly Once ( Kafka 0.11 onwards).
Dezavantaje
- Sunt strâns cuplate cu Kafka, nu se pot folosi fără Kafka în imagine
- Destul de nou, în stadiu incipient, încă nu a fost testat în marile companii
- Nu pentru lucrări grele precum Spark Streaming,Flink.
Samza :
Va acoperi Samza pe scurt. Samza de la 30 de metri pare similar cu Kafka Streams în abordare. Există multe asemănări. Ambele cadre au fost dezvoltate de aceiași dezvoltatori care au implementat Samza la LinkedIn și apoi au fondat Confluent, unde au scris Kafka Streams. Ambele tehnologii sunt strâns legate de Kafka, preiau date brute din Kafka și apoi redau datele procesate înapoi în Kafka. Utilizați aceeași filozofie Kafka Log. Samza este un fel de versiune la scară a Kafka Streams. În timp ce Kafka Streams este o bibliotecă destinată microserviciilor , Samza este un proces de cluster complet care rulează pe Yarn.
Vantaje :
- Mulțumesc foarte bine în menținerea unor stări mari de informații (bun pentru cazul de utilizare al unirii fluxurilor) folosind rocksDb și kafka log.
- Tolerant la erori și foarte performant folosind proprietățile Kafka
- Una dintre opțiunile de luat în considerare dacă se utilizează deja Yarn și Kafka în conducta de procesare.
- Bun cetățean Yarn
- Low latency , High throughput , matur și testat la scară
Dezavantaje :
- Totalmente cuplat cu Kafka și Yarn. Nu este ușor de utilizat dacă niciunul dintre acestea nu se află în pipeline-ul dvs. de procesare.
- Atleast-Once processing guarantee. Nu sunt sigur dacă suportă acum exact o dată ca și Kafka Streams după Kafka 0.11
- Lipsă de caracteristici avansate de streaming, cum ar fi Watermarks, Sessions, triggers, etc
Compararea cadrelor de streaming:
Potem compara tehnologiile doar cu oferte similare. În timp ce Storm, Kafka Streams și Samza par acum utile pentru cazuri de utilizare mai simple, adevărata competiție este clară între greii cu cele mai recente caracteristici: Spark vs Flink