această postare este o publicație invitată scrisă de Yaroslav Tkachenko, Arhitect Software la Activision.
Apache Spark este unul dintre cele mai populare și puternice cadre de procesare a datelor la scară largă. A fost creat ca o alternativă la cadrul MapReduce Hadoop pentru sarcini de lucru lot, dar acum acceptă și SQL, învățare automată și procesare flux. Astăzi vreau să mă concentrez pe streamingul Spark și să arăt câteva opțiuni disponibile pentru procesarea fluxului.
prelucrarea datelor în flux este utilizată atunci când datele dinamice sunt generate continuu și se găsesc adesea în cazuri de utilizare a datelor mari. În majoritatea cazurilor, datele sunt procesate în timp aproape real, o înregistrare la un moment dat, iar informațiile derivate din date sunt, de asemenea, utilizate pentru a furniza alerte, a reda tablouri de bord și a alimenta modele de învățare automată care pot reacționa rapid la noile tendințe din date.
DStreams vs.DataFrames
Spark Streaming a mers alfa cu Spark 0.7.0. Se bazează pe ideea de fluxuri discretizate sau DStreams. Fiecare DStream este reprezentat ca o secvență de RDD-uri, deci este ușor de utilizat dacă provin de la nivel scăzut RDD-sprijinit lot sarcini de lucru. DStreams a suferit o mulțime de îmbunătățiri în acea perioadă de timp, dar au existat încă diverse provocări, în primul rând pentru că este un API de nivel foarte scăzut.
ca soluție la aceste provocări, streamingul structurat Spark a fost introdus în Spark 2.0 (și a devenit stabil în 2.2) ca o extensie construită pe partea de sus a Spark SQL. Din această cauză, profită de optimizările de cod SQL Spark și de memorie. Streamingul structurat oferă, de asemenea, abstracții foarte puternice, cum ar fi API-urile Dataset/DataFrame, precum și SQL. Nu mai face cu RDD direct!
atât streamingul structurat, cât și streamingul cu DStreams utilizează micro-dozare. Cea mai mare diferență este latența și garanțiile de livrare a mesajelor: streamingul structurat oferă exact o dată de livrare cu o latență de peste 100 de milisecunde, în timp ce streamingul cu abordarea DStreams garantează doar cel puțin o dată livrarea, dar poate oferi latențe de milisecunde.
eu personal prefer streamingul structurat Spark pentru cazuri simple de utilizare, dar streamingul Spark cu DStreams este foarte bun pentru topologii mai complicate datorită flexibilității sale. De aceea, mai jos vreau să arăt cum să folosesc Streaming cu DStreams și Streaming cu DataFrames (care este de obicei utilizat cu Spark Structured Streaming) pentru consumarea și prelucrarea datelor de la Apache Kafka. Voi folosi Scala, Apache Spark 2.3 și Apache Kafka 2.0.
de asemenea, de dragul exemplului, îmi voi executa lucrările folosind notebook-urile Apache Zeppelin furnizate de Qubole. Qubole este o platformă de date pe care o folosesc zilnic. Gestionează clusterele Hadoop și Spark, facilitează rularea interogărilor ad hoc Hive și Presto și oferă, de asemenea, notebook-uri Zeppelin gestionate pe care le folosesc fericit. Cu Qubole nu trebuie să mă gândesc prea mult la configurarea și reglarea Spark și Zeppelin, este doar manipulat pentru mine.
cazul real de utilizare pe care îl am este foarte simplu:
- un fel de telemetrie este scris la Kafka: mesaje JSON mici cu metadate și perechi de chei/valori arbitrare
- vreau să mă conectez la Kafka, să consum și să deserializez acele mesaje
- apoi să aplic transformări dacă este necesar
- colectați câteva agregări
- în cele din urmă, sunt interesat de anomalii și date în general proaste — din moment ce nu controlez producătorul, vreau să prind lucruri precum NULLs, șiruri goale, poate date incorecte și alte valori formate specifice etc.
- lucrarea ar trebui să ruleze o perioadă de timp, apoi să se termine automat. De obicei, lucrările de streaming Spark rulează continuu, dar uneori ar putea fi util să le rulați ad hoc pentru analiză/depanare (sau ca exemplu în cazul meu, deoarece este atât de ușor să rulați o lucrare Spark într-un notebook).
Streaming cu DStreams
în această abordare folosim DStreams, care este pur și simplu o colecție de RDD-uri.
Streaming cu DataFrames
acum putem încerca să combine Streaming cu DATAFRAMES API pentru a obține cele mai bune din ambele lumi!
concluzie
care abordare este mai bună? Deoarece DStream este doar o colecție de RDD-uri, este de obicei folosit pentru transformări de nivel scăzut și de prelucrare. Adăugarea unui API DataFrames pe partea de sus a care oferă abstracții foarte puternice, cum ar fi SQL, dar necesită un pic mai mult de configurare. Și dacă aveți un caz simplu de utilizare, streamingul structurat Spark ar putea fi o soluție mai bună în general!