Apache Flink vs. Apache Spark

Dacă vă uitați la această imagine cu o listă de instrumente de big data, se poate părea că toate nișele posibile în acest domeniu sunt deja ocupate. Cu atât de multă concurență, ar trebui să fie foarte greu să vii cu o tehnologie revoluționară.

Creatorii Apache Flink au un gând diferit în această privință. A început ca un proiect de cercetare numit Stratosphere. Stratosphere a fost bifurcat, iar această bifurcație a devenit ceea ce noi cunoaștem ca Apache Flink. În 2014, a fost acceptat ca proiect Apache Incubator și, doar câteva luni mai târziu, a devenit un proiect Apache de nivel superior. La momentul scrierii acestui articol, proiectul are aproape douăsprezece mii de comenzi și peste 300 de contribuitori.

De ce există atât de multă atenție? Acest lucru se datorează faptului că Apache Flink a fost numit un cadru de procesare a datelor mari de nouă generație și are suficiente inovații la activ pentru a înlocui Apache Spark și a deveni noul instrument de-facto pentru procesarea pe loturi și fluxuri.

Ar trebui să treceți la Apache Flink? Ar trebui să rămâneți cu Apache Spark pentru o vreme? Sau Apache Flink este doar o nouă găselniță? Acest articol va încerca să vă ofere răspunsuri la aceste și alte întrebări.

Dacă nu ați trăit sub o piatră în ultimii doi ani, ați auzit de Apache Spark. Se pare că fiecare sistem modern care face orice fel de procesare a datelor folosește Apache Spark într-un fel sau altul.

Pentru o lungă perioadă de timp, Spark a fost cel mai nou și cel mai bun instrument din acest domeniu. Acesta a oferit câteva caracteristici impresionante în comparație cu predecesorii săi, cum ar fi:

  • Viteză impresionantă: Este de zece ori mai rapid decât Hadoop dacă datele sunt procesate pe un disc și de până la 100 de ori mai rapid dacă datele sunt procesate în memorie.
  • Model mai simplu de graf aciclic dirijat: În loc să definiți sarcinile de procesare a datelor utilizând cadrul rigid MapReduce, Spark permite definirea unui graf de sarcini care poate implementa algoritmi complecși de procesare a datelor
  • Procesare în flux: Odată cu apariția noilor tehnologii, cum ar fi Internetul lucrurilor, nu mai este suficient să se proceseze pur și simplu o cantitate uriașă de date. Acum, avem nevoie de procesarea unei cantități uriașe de date pe măsură ce acestea sosesc în timp real. Acesta este motivul pentru care Apache Spark a introdus procesarea fluxurilor care permite procesarea unui flux de date potențial infinit.
  • Set bogat de biblioteci: În plus față de caracteristicile sale de bază, Apache Spark oferă biblioteci puternice pentru învățare automată, procesare grafică și efectuarea de interogări SQL.

Pentru a vă face o idee mai bună despre cum scrieți aplicații cu Apache Spark, să vedem cum puteți implementa o aplicație simplă de numărare a cuvintelor care ar număra de câte ori a fost folosit fiecare cuvânt într-un document de text:

// Read fileval file = sc.textFile("file/path")val wordCount = file // Extract words from every line .flatMap(line => line.split(" ")) // Convert words to pairs .map(word => (word, 1)) // Count how many times each word was used .reduceByKey(_ + _)

Dacă știți Scala, acest cod ar trebui să vă pară simplu și este similar cu lucrul cu colecții obișnuite. În primul rând, citim o listă de linii dintr-un fișier situat în fișier/cărare”. Acest fișier poate fi fie un fișier local, fie un fișier din HDFS sau S3.

Apoi, fiecare linie este împărțită într-o listă de cuvinte folosind metoda flatMap care pur și simplu împarte un șir de caractere prin simbolul spațiu. Apoi, pentru a implementa numărarea cuvintelor, folosim metoda map pentru a converti fiecare cuvânt într-o pereche în care primul element al perechii este un cuvânt din textul de intrare, iar al doilea element este pur și simplu un număr unu.

Ultimul pas numără pur și simplu de câte ori a fost folosit fiecare cuvânt prin însumarea numerelor pentru toate perechile pentru același cuvânt.

Apache Spark pare a fi un instrument grozav și versatil. Dar ce aduce Apache Flink?

La prima vedere, nu pare să existe multe diferențe. Diagrama de arhitectură arată foarte asemănător:

Dacă aruncați o privire la exemplul de cod pentru aplicația de numărare a cuvintelor pentru Apache Flink, ați vedea că nu există aproape nicio diferență:

val file = env.readTextFile("file/path")val counts = file .flatMap(line => line.split(" ")) .map(word => (word, 1)) .groupBy(0) .sum(1)

Câteva diferențe notabile, este că în acest caz trebuie să folosim metoda readTextFile în loc de metoda textFile și că trebuie să folosim o pereche de metode: groupBy și sum în loc de reduceByKey.

Atunci de ce atâta agitație? Apache Flink poate că nu are diferențe vizibile la exterior, dar cu siguranță are suficiente inovații, pentru a deveni instrumentul de prelucrare a datelor de ultimă generație. Iată doar câteva dintre ele:

  • Implementează procesarea efectivă în flux continuu: Atunci când procesați un flux în Apache Spark, acesta îl tratează ca pe mai multe probleme de loturi mici, făcând astfel din procesarea fluxurilor un caz special. Apache Flink, în schimb, tratează procesarea pe loturi ca pe un caz special și nu utilizează micro-lotching.
  • Suport mai bun pentru procesarea ciclică și iterativă: Flink oferă unele operații suplimentare care permit implementarea ciclurilor în aplicația de streaming și a algoritmilor care trebuie să efectueze mai multe iterații pe datele de lot.
  • Gestionarea personalizată a memoriei: Apache Flink este o aplicație Java, dar nu se bazează în întregime pe colectorul de gunoi JVM. Acesta implementează un manager de memorie personalizat care stochează datele de procesat în array-uri de octeți. Acest lucru permite reducerea sarcinii asupra unui garbage collector și creșterea performanței. Puteți citi despre aceasta în această postare pe blog.
  • Latență mai mică și randament mai mare: Mai multe teste efectuate de terți sugerează că Apache Flink are o latență mai mică și un randament mai mare decât concurenții săi.
  • Operatori Windows puternici: Atunci când trebuie să procesați un flux de date, în majoritatea cazurilor trebuie să aplicați o funcție unui grup finit de elemente dintr-un flux. De exemplu, este posibil să aveți nevoie să numărați câte clicuri a primit aplicația dvs. în fiecare interval de cinci minute sau să doriți să știți care a fost cel mai popular tweet pe Twitter în fiecare interval de zece minute. În timp ce Spark suportă unele dintre aceste cazuri de utilizare, Apache Flink oferă un set mult mai puternic de operatori pentru procesarea fluxurilor.
  • Implementează instantanee distribuite ușoare: Acest lucru îi permite lui Apache Flink să ofere o supraîncărcare redusă și garanții de procesare doar o singură dată în procesarea fluxurilor, fără a utiliza micro-lotching, așa cum face Spark.

Deci, lucrați la un nou proiect și trebuie să alegeți un software pentru acesta. Ce ar trebui să folosiți ypi? Spark? Flink?

Desigur, nu există un răspuns corect sau greșit aici. Dacă trebuie să faceți o procesare complexă a fluxurilor, atunci v-aș recomanda să folosiți Apache Flink. Are un suport mai bun pentru procesarea fluxurilor și unele îmbunătățiri semnificative.

Dacă nu aveți nevoie de caracteristici de procesare a fluxurilor de ultimă generație și doriți să rămâneți pe partea sigură, ar fi mai bine să rămâneți cu Apache Spark. Este un proiect mai matur, are o bază de utilizatori mai mare, mai multe materiale de instruire și mai multe biblioteci terțe. Dar țineți cont de faptul că Apache Flink reduce această diferență cu fiecare minut. Din ce în ce mai multe proiecte aleg Apache Flink pe măsură ce acesta devine un proiect mai matur.

Dacă, pe de altă parte, vă place să experimentați cu cele mai noi tehnologii, trebuie neapărat să îi dați o șansă lui Apache Flink.

Toate acestea înseamnă că Apache Spark este învechit și că în câțiva ani cu toții vom folosi Apache Flink? Răspunsul s-ar putea să vă surprindă. În timp ce Flink are câteva caracteristici impresionante, Spark nu rămâne la fel. De exemplu, Apache Spark a introdus gestionarea personalizată a memoriei în 2015, odată cu lansarea proiectului Tungsten și, de atunci, a adăugat caracteristici care au fost introduse inițial de Apache Flink. Câștigătorul nu este încă decis.

În următoarele articole de pe blog voi scrie mai multe despre modul în care puteți utiliza Apache Flink pentru procesarea pe loturi și fluxuri, așa că rămâneți pe recepție!

Dacă doriți să aflați mai multe despre Apache Flink, puteți arunca o privire la cursul meu Pluralsight în care abordez Apache Flink în mai multe detalii. Iată o scurtă previzualizare a acestui curs.

Lasă un comentariu