Apache Flink vs. Apache Spark

Jos katsot tätä kuvaa, jossa on luettelo big data -työkaluista, saattaa vaikuttaa siltä, että kaikki mahdolliset markkinaraon paikat tällä alalla on jo varattu. Kun kilpailua on niin paljon, uraauurtavaa teknologiaa pitäisi olla hyvin vaikea keksiä.

Apache Flinkin luojilla on tästä erilainen ajatus. Se alkoi tutkimusprojektina nimeltä Stratosphere. Stratosphere haarautui, ja tästä haarautumisesta tuli se, minkä tunnemme nimellä Apache Flink. Vuonna 2014 se hyväksyttiin Apache Incubator -projektiksi, ja vain muutamaa kuukautta myöhemmin siitä tuli huipputason Apache-projekti. Tätä kirjoitettaessa projektissa on lähes kaksitoista tuhatta kommitointia ja yli 300 osallistujaa.

Miksi siihen kiinnitetään niin paljon huomiota? Se johtuu siitä, että Apache Flinkiä kutsuttiin uuden sukupolven big data -käsittelykehykseksi, ja sillä on tarpeeksi innovaatioita vyöllään korvatakseen Apache Sparkin ja tullakseen uudeksi de-facto-työkaluksi erä- ja virtakäsittelyyn.

Pitäisikö sinun vaihtaa Apache Flinkiin? Pitäisikö sinun pysyä Apache Sparkissa vielä jonkin aikaa? Vai onko Apache Flink vain uusi kikka? Tässä artikkelissa yritetään antaa vastauksia näihin ja muihin kysymyksiin.

Jos et ole elänyt kiven alla viimeiset pari vuotta, olet kuullut Apache Sparkista. Näyttää siltä, että jokainen nykyaikainen järjestelmä, joka tekee minkäänlaista tietojenkäsittelyä, käyttää Apache Sparkia tavalla tai toisella.

Pitkän aikaa Spark oli alan uusin ja paras työkalu. Se tarjosi edeltäjiinsä verrattuna vaikuttavia ominaisuuksia, kuten:

  • Vaikuttava nopeus: Se on kymmenen kertaa nopeampi kuin Hadoop, jos tietoja käsitellään levyllä, ja jopa 100 kertaa nopeampi, jos tietoja käsitellään muistissa.
  • Yksinkertaisempi suunnatun asyklisen graafin malli: Sen sijaan, että määrittelisit tietojenkäsittelytehtävät jäykän MapReduce-kehyksen avulla, Spark mahdollistaa tehtävien graafin määrittelyn, jolla voidaan toteuttaa monimutkaisia tietojenkäsittelyalgoritmeja
  • Virtaprosessointi: Esineiden internetin kaltaisten uusien teknologioiden myötä ei enää riitä, että yksinkertaisesti käsitellään valtavia tietomääriä. Nyt on käsiteltävä valtava määrä dataa sitä mukaa, kun sitä saapuu reaaliajassa. Tämän vuoksi Apache Spark on ottanut käyttöön virtakäsittelyn, joka mahdollistaa potentiaalisesti äärettömän tietovirran käsittelyn.
  • Runsaat kirjastot: Ydinominaisuuksiensa lisäksi Apache Spark tarjoaa tehokkaita kirjastoja koneoppimiseen, graafien käsittelyyn ja SQL-kyselyjen suorittamiseen.

Jotta saat paremman käsityksen siitä, miten sovelluksia kirjoitetaan Apache Sparkilla, katsotaanpa, miten voit toteuttaa yksinkertaisen sanojen laskentasovelluksen, joka laskisi, kuinka monta kertaa kutakin sanaa käytettiin tekstidokumentissa:

// 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(_ + _)

Jos osaat Scalaa, tämän koodin pitäisi tuntua suoraviivaiselta, ja se on samanlainen kuin työskentely tavallisten kokoelmien kanssa. Ensin luetaan luettelo riveistä tiedostosta, joka sijaitsee osoitteessa file/path”. Tämä tiedosto voi olla joko paikallinen tiedosto tai HDFS:ssä tai S3:ssa oleva tiedosto.

Sitten jokainen rivi jaetaan sanaluetteloksi käyttäen flatMap-metodia, joka yksinkertaisesti jakaa merkkijonon välilyöntimerkillä. Sitten sanojen laskennan toteuttamiseksi käytämme map-metodia, jolla jokainen sana muunnetaan pariksi, jossa parin ensimmäinen elementti on sana syötetekstistä ja toinen elementti on yksinkertaisesti numero yksi.

Viimeisessä vaiheessa yksinkertaisesti lasketaan, kuinka monta kertaa kutakin sanaa käytettiin laskemalla yhteen kaikkien parien numerot samalle sanalle.

Apache Spark vaikuttaa loistavalta ja monipuoliselta työkalulta. Mutta mitä Apache Flink tuo mukanaan?

Ensi silmäyksellä ei näytä olevan paljon eroja. Arkkitehtuurikaavio näyttää hyvin samankaltaiselta:

Jos katsot koodiesimerkkiä sanojen laskentasovelluksesta Apache Flinkille, huomaat, ettei eroja ole juuri lainkaan:

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

Vähäisiä huomattavia eroja on se, että tässä tapauksessa joudumme käyttämään metodia readTextFile metodin sijasta metodia textFile ja että joudumme käyttämään metodien paria: groupBy ja sum eikä reduceByKey.

Mitä tämä kaikki hössötys sitten on? Apache Flinkissä ei ehkä ole ulkoisesti näkyviä eroja, mutta siinä on varmasti tarpeeksi uudistuksia, jotta siitä voi tulla seuraavan sukupolven tietojenkäsittelytyökalu. Tässä vain muutamia niistä:

  • Toteuttaa todellisen suoratoistoprosessoinnin: Kun käsittelet virtaa Apache Sparkissa, se käsittelee sitä monina pieninä eräongelmina, mikä tekee virran käsittelystä erikoistapauksen. Apache Flink sen sijaan käsittelee eräkäsittelyä erikoisuutena eikä käytä mikroeräkäsittelyä.
  • Parempi tuki sykliselle ja iteratiiviselle käsittelylle: Flink tarjoaa joitakin lisäoperaatioita, jotka mahdollistavat syklien toteuttamisen suoratoistosovelluksessasi ja algoritmeissa, joiden on suoritettava useita iteraatioita erätiedoille.
  • Mukautettu muistinhallinta: Apache Flink on Java-sovellus, mutta se ei luota täysin JVM:n roskienkerääjään. Se toteuttaa mukautetun muistinhallinnan, joka tallentaa käsiteltävät tiedot tavujoukkoihin. Näin voidaan vähentää roskienkerääjän kuormitusta ja lisätä suorituskykyä. Voit lukea siitä tästä blogikirjoituksesta.
  • Pienempi viive ja suurempi läpimeno: Useat kolmansien osapuolten tekemät testit viittaavat siihen, että Apache Flinkin viive on pienempi ja läpäisy suurempi kuin sen kilpailijoilla.
  • Tehokkaat windows-operaattorit: Kun sinun on käsiteltävä tietovirtaa, useimmissa tapauksissa sinun on sovellettava funktiota virtauksen rajalliseen elementtiryhmään. Sinun on esimerkiksi laskettava, kuinka monta klikkausta sovelluksesi on saanut kullakin viiden minuutin jaksolla, tai haluat ehkä tietää, mikä oli Twitterin suosituin twiitti kullakin kymmenen minuutin jaksolla. Vaikka Spark tukee joitakin näistä käyttötapauksista, Apache Flink tarjoaa huomattavasti tehokkaamman joukon operaattoreita virtojen käsittelyyn.
  • Toteuttaa kevyitä hajautettuja tilannekuvia:

Työskentelet siis uuden projektin parissa, ja sinun on valittava siihen ohjelmisto. Mitä ypi pitäisi käyttää? Sparkia? Flink?

Ei tässä tietenkään ole oikeaa tai väärää vastausta. Jos sinun täytyy tehdä monimutkaista stream-prosessointia, suosittelen Apache Flinkin käyttöä. Siinä on parempi tuki virrankäsittelylle ja joitain merkittäviä parannuksia.

Jos et tarvitse verenvuodatuksen huippuominaisuuksia virrankäsittelyyn ja haluat pysyä varmalla puolella, voi olla parempi pitäytyä Apache Sparkissa. Se on kypsempi projekti sillä on suurempi käyttäjäkunta, enemmän koulutusmateriaalia ja enemmän kolmannen osapuolen kirjastoja. Muista kuitenkin, että Apache Flink kuroo tätä eroa umpeen minuutti minuutilta. Yhä useammat projektit valitsevat Apache Flinkin, kun siitä tulee kypsempi projekti.

Jos toisaalta haluat kokeilla uusinta teknologiaa, sinun on ehdottomasti annettava Apache Flinkille mahdollisuus.

Tarkoittaako tämä kaikki sitä, että Apache Spark on vanhentunut ja parin vuoden kuluttua me kaikki käytämme Apache Flinkiä? Vastaus saattaa yllättää sinut. Vaikka Flinkillä on joitakin vaikuttavia ominaisuuksia, Spark ei pysy ennallaan. Apache Spark otti esimerkiksi käyttöön mukautetun muistinhallinnan vuonna 2015 projektin Tungstenin julkaisun myötä, ja sen jälkeen se on lisännyt ominaisuuksia, jotka Apache Flink esitteli ensimmäisenä. Voittajaa ei ole vielä päätetty.

Tulevissa blogikirjoituksissa kirjoitan lisää siitä, miten voit käyttää Apache Flinkiä erä- ja virtakäsittelyyn, joten pysy kuulolla!

Jos haluat tietää lisää Apache Flinkistä, voit tutustua Pluralsight-kurssiini, jossa käsittelen Apache Flinkiä tarkemmin. Tässä on lyhyt esikatselu tästä kurssista.

Jätä kommentti