Articles

Introduction to Apache Spark with Examples and Use Cases

kuulin Sparkista ensimmäisen kerran loppuvuodesta 2013, kun kiinnostuin Scalasta, millä kielellä Spark kirjoitetaan. Jonkin ajan kuluttua tein hauskan datatiedeprojektin, jossa yritin ennustaa selviytymistä Titanicilla. Tämä osoittautui oivaksi tavaksi päästä edelleen tutustumaan Spark-konsepteihin ja ohjelmointiin. Suosittelen sitä kaikille pyrkivä kipinä kehittäjät etsivät paikka päästä alkuun.

tänään, Spark on otettu käyttöön suuret toimijat, kuten Amazon, eBay, ja Yahoo! Monet organisaatiot pyörittävät Sparkia klustereissa, joissa on tuhansia solmuja. Spark FAQ: n mukaan suurimmassa tunnetussa klusterissa on yli 8000 solmua. Spark onkin tekniikka, joka kannattaa ottaa huomioon ja josta kannattaa ottaa oppia.

tässä artikkelissa on johdatus Sparkiin sisältäen käyttötapauksia ja esimerkkejä. Se sisältää tietoa Apache Spark-sivustolta sekä kirjasta Learning Spark – salamannopea Big Data-analyysi.

mikä on apassien kipinä? Johdanto

Spark on Apache-projekti, jota mainostetaan nimellä ”lightning fast cluster computing”. Sillä on kukoistava avoimen lähdekoodin yhteisö ja se on aktiivisin Apache-projekti tällä hetkellä.

Spark tarjoaa nopeamman ja yleisemmän tietojenkäsittelyalustan. Sparkilla voi ajaa ohjelmia jopa 100x nopeammin muistissa tai 10x nopeammin levyllä kuin Hadoop. Viime vuonna Spark otti Hadoopin haltuunsa suorittamalla 100 TB Daytona GraySort-kilpailun 3x nopeammin kymmenesosalla koneita ja siitä tuli myös nopein avoimen lähdekoodin Moottori petatavun lajitteluun.

kipinä mahdollistaa myös koodin kirjoittamisen nopeammin, sillä käytössäsi on yli 80 korkean tason toimijaa. Tämän osoittamiseksi katsotaanpa ” Hello World!”of BigData: Word Count esimerkki. Kirjoitettuna Javalla Mapreducea varten siinä on noin 50 riviä koodia, kun taas Sparkissa (ja Scalassa) sen voi tehdä yhtä yksinkertaisesti:

sparkContext.textFile("hdfs://...") .flatMap(line => line.split(" ")) .map(word => (word, 1)).reduceByKey(_ + _) .saveAsTextFile("hdfs://...")

toinen tärkeä seikka Apache Sparkia käytettäessä on sen tarjoama interaktiivinen komentotulkki (REPL). Käyttämällä REPL, yksi voi testata tuloksia kunkin rivin koodin tarvitsematta ensin koodata ja suorittaa koko työ. Työkoodin tie on siis paljon lyhyempi ja ad hoc-tietojen analysointi on mahdollista.

muita Spark-palvelun keskeisiä ominaisuuksia ovat:

  • tarjoaa tällä hetkellä sovellusliittymiä Scalassa, Javassa ja Pythonissa, ja tuki muille kielille (kuten R) matkalla
  • integroituu hyvin Hadoop-ekosysteemiin ja tietolähteisiin (HDFS, Amazon S3, Hive, HBase, Cassandra jne.)
  • voi ajaa Hadoop-langan tai Apache-Mesojen hallinnoimilla klustereilla ja myös itsenäisesti

Kipinäydintä täydentää joukko tehokkaita, korkeamman tason kirjastoja, joita voidaan käyttää saumattomasti samassa sovelluksessa. Näitä kirjastoja ovat tällä hetkellä SparkSQL, Spark Streaming, mllib (koneoppimiseen), ja GraphX, joista jokainen on tarkemmin tässä artikkelissa. Myös muita Spark-kirjastoja ja laajennuksia on parhaillaan kehitteillä.

spark libraries and extensions

Spark Core

Spark Core on perusmoottori laajamittaiseen rinnakkaiseen ja hajautettuun tietojenkäsittelyyn. Se vastaa:

  • muistinhallinta ja vianpalautus
  • aikataulutus, jakelu ja seuranta työt klusterissa
  • vuorovaikutuksessa tallennusjärjestelmien kanssa

Spark esittelee käsitteen RDD (Resilient Distributed Dataset), muuttumaton vikasietoinen, hajautettu kokoelma esineitä, joita voidaan käyttää rinnakkain. RDD voi sisältää minkä tahansa tyyppisen objektin, ja se luodaan lataamalla ulkoinen aineisto tai jakamalla kokoelma ajuriohjelmasta.

RDDs tukee kahdenlaisia toimia:

  • muunnokset ovat operaatioita (kuten kartta, suodatin, liittyä, unioni, ja niin edelleen), jotka suoritetaan RDD: llä ja jotka tuottavat uuden RDD: n, joka sisältää tuloksen.
  • toimet ovat operaatioita (kuten vähentää, laskea, ensimmäinen, ja niin edelleen), jotka palauttavat arvon suoritettuaan laskennan RDD: llä.

transformaatiot Kipinässä ovat ”laiskoja”, eli ne eivät laske tuloksiaan heti. Sen sijaan he vain ”muistavat” suoritettavan operaation ja aineiston (esim.tiedoston), johon toimenpide on suoritettava. Muunnokset lasketaan oikeastaan vasta, kun toiminto kutsutaan ja tulos palautetaan ajuriohjelmaan. Tämän rakenteen ansiosta Spark toimii tehokkaammin. Esimerkiksi, jos ISO tiedosto muunnetaan eri tavoin ja siirretään ensimmäiseen toimintaan, Spark käsittelisi ja palauttaisi tuloksen vain ensimmäiselle riville, eikä tekisi työtä koko tiedostolle.

oletusarvoisesti jokainen muunnettu RDD voidaan korvata joka kerta, kun suoritat toiminnon sille. Voit kuitenkin säilyttää RDD: n myös muistissa käyttäen säily-tai välimuistimenetelmää, jolloin Spark pitää elementit ympärillä klusterissa, jolloin se pääsee nopeammin käsiksi seuraavan kerran, kun kyselet sitä.

SparkSQL

SparkSQL on Kipukomponentti, joka tukee tietojen kyselyä joko SQL: n tai Hive-kyselykielen kautta. Se sai alkunsa Apache Hive portti ajaa päälle kipinä (sijasta MapReduce) ja on nyt integroitu kipinä pino. Sen lisäksi, että se tarjoaa tukea eri tietolähteille, se mahdollistaa SQL-kyselyjen kutomisen koodimuunnoksilla, jotka johtavat erittäin tehokkaaseen työkaluun. Alla on esimerkki Hive-yhteensopivasta kyselystä:

// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)sqlContext.sql("CREATE TABLE IF NOT EXISTS src (key INT, value STRING)")sqlContext.sql("LOAD DATA LOCAL INPATH 'examples/src/main/resources/kv1.txt' INTO TABLE src")// Queries are expressed in HiveQLsqlContext.sql("FROM src SELECT key, value").collect().foreach(println)

Spark Streaming

Spark Streaming tukee reaaliaikaista suoratoistodatan käsittelyä, kuten tuotannon web-palvelimen lokitiedostoja (esim.Apache Flume ja HDFS/S3), sosiaalista mediaa kuten Twitteriä ja erilaisia viestijonoja kuten Kafkaa. Konepellin alla Spark Streaming vastaanottaa syötetietovirrat ja jakaa datan eriin. Seuraavaksi ne käsitellään Kipinämoottori ja tuottaa lopullinen virta tuloksia erissä, kuten alla on kuvattu.

spark streaming

Spark Streaming API vastaa läheisesti Spark-ytimen rajapintaa, joten ohjelmoijien on helppo työskennellä sekä erä-että suoratoistodatan maailmoissa.

mllib

mllib on koneoppimisen kirjasto, joka tarjoaa erilaisia algoritmeja, jotka on suunniteltu skaalaamaan klusteria luokittelua, regressiota, ryhmittelyä, yhteistoiminnallista suodatusta ja niin edelleen varten (katso toptalin artikkeli koneoppimisesta lisätietoa aiheesta). Jotkut näistä algoritmeista toimivat myös streamausdatan kanssa, kuten lineaarinen regressio käyttäen tavallisia pienimpiä neliöitä tai k-tarkoittaa ryhmittelyä (ja enemmän matkalla). Apache Mahout (koneoppimisen kirjasto Hadoop) on jo kääntynyt pois Mapreducesta ja yhdistänyt voimansa Spark Mllibissä.

GraphX

graphx

GraphX on kuvaajien manipulointiin ja kuvaajan rinnakkaisten operaatioiden suorittamiseen tarkoitettu kirjasto. Se tarjoaa yhtenäisen työkalun ETL: lle, eksploratiiviselle analyysille ja iteratiiviselle kuvaajalaskennalle. Paitsi sisäänrakennetut toiminnot graafin manipulointiin, se tarjoaa kirjaston yleisiä graafialgoritmeja, kuten PageRank.

miten Apache Spark: Event Detection Use Case

nyt kun olemme vastanneet kysymykseen ”Mikä on Apache Spark?”, mietitään, millaisiin ongelmiin tai haasteisiin sitä voitaisiin tehokkaimmin käyttää.

törmäsin hiljattain artikkeliin kokeesta, jossa maanjäristys havaittiin analysoimalla Twitter-virtaa. On kiinnostavaa, että osoitettiin, että tällä menetelmällä saat todennäköisesti tiedon Japanissa sattuneesta maanjäristyksestä nopeammin kuin Japanin Ilmatieteen laitoksella. Vaikka he käyttivät artikkelissaan erilaista tekniikkaa, mielestäni on hyvä esimerkki nähdä, miten voisimme käyttää Sparkia yksinkertaistetuilla koodinpätkillä ja ilman liimakoodia.

ensin pitäisi suodattaa twiittejä, jotka tuntuvat asiallisilta, kuten ”maanjäristys” tai ”tärinä”. Voisimme helposti käyttää Spark Streaming tähän tarkoitukseen seuraavasti:

TwitterUtils.createStream(...) .filter(_.getText.contains("earthquake") || _.getText.contains("shaking"))

sitten meidän pitäisi ajaa joitakin semanttinen analyysi tweets määrittää, jos ne näyttävät viittaavan nykyinen maanjäristys esiintyminen. Twiitit kuten ” maanjäristys!”tai” nyt tärisee”, esimerkiksi, olisi pidettävä positiivisina matches, kun taas tweets kuten ”osallistuu maanjäristys konferenssi” tai ”maanjäristys eilen oli pelottava”ei. Lehden kirjoittajat käyttivät tähän tarkoitukseen tukivektorikonetta (support vector machine, SVM). Teemme samoin täällä, mutta voimme myös kokeilla suoratoistoversiota. Tuloksena oleva koodiesimerkki Mllibistä näyttäisi seuraavanlaiselta:

// We would prepare some earthquake tweet data and load it in LIBSVM format.val data = MLUtils.loadLibSVMFile(sc, "sample_earthquate_tweets.txt")// Split data into training (60%) and test (40%).val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)val training = splits(0).cache()val test = splits(1)// Run training algorithm to build the modelval numIterations = 100val model = SVMWithSGD.train(training, numIterations)// Clear the default threshold.model.clearThreshold()// Compute raw scores on the test set. val scoreAndLabels = test.map { point => val score = model.predict(point.features) (score, point.label)}// Get evaluation metrics.val metrics = new BinaryClassificationMetrics(scoreAndLabels)val auROC = metrics.areaUnderROC()println("Area under ROC = " + auROC)

Jos olemme tyytyväisiä mallin ennustusnopeuteen, voisimme siirtyä seuraavaan vaiheeseen ja reagoida aina, kun havaitsemme maanjäristyksen. Havaitaksemme yhden tarvitsemme tietyn määrän (eli tiheyden) positiivisia twiittejä määritellyssä aikaikkunassa (kuten artikkelissa on kuvattu). Huomaa, että twiiteissä, joissa Twitter-paikannuspalvelut ovat käytössä, poimimme myös maanjäristyksen sijainnin. Tällä tiedolla varustettuna voisimme käyttää SparkSQL: ää ja tiedustella olemassa olevaa Pesätaulukkoa (maanjäristysilmoitusten vastaanottamisesta kiinnostuneiden käyttäjien tallentamista) hakeaksemme heidän sähköpostiosoitteensa ja lähettääksemme heille henkilökohtaisen varoitussähköpostin, seuraavasti:

// sc is an existing SparkContext.val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)// sendEmail is a custom functionsqlContext.sql("FROM earthquake_warning_users SELECT firstName, lastName, city, email") .collect().foreach(sendEmail)

muut Apache Spark-käyttötapaukset

potentiaaliset käyttötapaukset Sparkille ulottuvat paljon maanjäristysten havaitsemista pidemmälle tietenkin.

tässä on nopea (mutta ei todellakaan läheskään tyhjentävä!) otanta muista käyttötapauksista, jotka edellyttävät big datan nopeuden, vaihtelun ja volyymin käsittelyä, johon Spark sopii niin hyvin:

pelialalla kuvioiden käsittely ja löytäminen reaaliaikaisten pelin sisäisten tapahtumien potentiaalisesta tuleniskusta ja kyky vastata niihin välittömästi on kyky, joka voi tuottaa tuottoisaa liiketoimintaa, esimerkiksi pelaajan säilyttämistä, kohdennettua mainontaa, monimutkaisuuden tason automaattista säätämistä ja niin edelleen.

verkkokauppateollisuudessa reaaliaikainen tapahtumatieto voitiin siirtää striimausalgoritmille kuten k-means tai yhteistyösuodatukselle kuten ALS. Tuloksia voitaisiin sitten jopa yhdistää muihin jäsentymättömiin tietolähteisiin, kuten asiakaskommentteihin tai tuotearvioihin, ja niitä voitaisiin käyttää jatkuvasti parantamaan ja mukauttamaan suosituksia ajan myötä uusien trendien myötä.

rahoitus-tai tietoturva-alalla Kipinäpinoa voisi soveltaa petoksen tai tunkeutumisen tunnistusjärjestelmään tai riskiperusteiseen tunnistautumiseen. Se voisi saavuttaa huippuluokan tuloksia keräämällä valtavia määriä arkistoituja lokeja, yhdistämällä sen ulkoisiin tietolähteisiin, kuten tietoihin tietomurroista ja vaarantuneista tileistä (KS.esimerkiksi https://haveibeenpwned.com/) ja yhteyden/pyynnön tietoihin, kuten IP-paikannukseen tai aikaan.

johtopäätös

yhteenvetona voidaan todeta, että Spark auttaa yksinkertaistamaan haastavaa ja laskennallisesti intensiivistä tehtävää käsitellä suuria määriä reaaliaikaista tai arkistoitua dataa, sekä strukturoitua että jäsentämätöntä, integroimalla saumattomasti asiaan liittyviä monimutkaisia ominaisuuksia, kuten koneoppimista ja graafialgoritmeja. Spark tuo massoille suurta tietojenkäsittelyä. Katsokaa!