On Github gronnbeck / storm-intro-talk
Created by MacMan and KennyG
Outline:NoData, BigSQL
when I test the alpha release
Kompleks event-prosessering, kontinuerlig kalkulering og data-aggregering.
Kompleks event-prosesseringTwitter: Trending topics fra firehose-api'et
Loggly: Log aggregation as a service - filter, parse, analyse data.
Weather channel - vasking av data slik at det passer egent format før lagring.
Flipboard - Social magazine. søk, real-time analytics, generering av custom-feeds on the fly. Integrert med HBase, ElasticSearch.
S->B->B->B
I Storm kan "sourcene" for eventene sees på som en kran. Og de har dermed fått navnet "Spout" som rett og slett betyr kran. Og som dere ser her har jeg lagt ved et elegant bilde av en kran.
Spoutene er utvikles av utviklerne, og Storm gir oss kun et enkelt interface som må implementeres.Spouts, kan og vil ofte, fungere som koblingen mellom "den ekte verden" og "storm sin verden". Der den siste nevnte har en flukserende og ikke nødvendigvis en fullstendig state. Og derfor kan utnytte dette til å gjøre ting raskt.
Eksempler på hva man kan bruke en Spout til:
Bolts. Usain Bolt. Disse kompoenentene har fått navnet sitt fordi de skal være uavhengige og raske, som et lyn.
Derfor følte jeg at det passet med et bilde av Usain. Jeg vet ikke hvor uavhengig han er, men jeg vet at han er jærlig rask.
Nok om det Usain. Det er i boltene Storm vil at vi skal implementere logikk og potensielt state. Ved å implentere bolter slik at de er uavhengig av hverandre, tidligere meldinger (til den graden det er mulig) og feil tolerante. Kan man få et event strøm prosesseringsmiljø som kan skaleres veldig bra.
Hvor mye det vil skalere er basert på hvor godt boltene er programmert. Men Storm tvinger utviklere til å tenke funksjonelt og stateless. Slik at man faktisk vil klare å utvikle en skalerbar Storm topologi.
Eksempler på hva man kan bruke en Bolt til er å:
Kommunisere mellom noder ved hjelp av meldinger. En melding er representert som en Tuppel
Felter og Verdier
Immutable
Spouter og Usain Bolter må snakke sammen. Disse to snakker sammen kun via meldinger. Der Spouter kan sende meldinger til Bolter. Og bolter igjen til andre bolter. Meldinger er strukturert som Immutable Tupler. Der hver verdi ligger i et forhåndsdefinert felt.Nå tenkte jeg at vi skulle gå igjennom et eksempel på hvordan man kan bruke Storm. Jeg har elegant sakset koden fra Nathan Marz sin introduksjon til Storm.
Så eksempelet er gankse triviellt, men tar oss igjennom de viktigste konseptene for å komme i gang med Storm. Bare husk at det vi presenterer her er kun overflaten av hva man kan få til i rammeverket / platformen.
Tilbake til eksempelet. Helt konkret skal vi lage en topologi som tar inn en menge med setninger, og teller "word-occurance" for alle inkommende setninger.
FixedBatchSpout spout = new FixedBatchSpout( new Fields("sentence"), 3, new Values("the cow jumped over the moon"), new Values("the man went to the store and bought some candy"), new Values("four score and seven years ago"), new Values("how many apples can you eat")); spout.setCycle(true);
Denne Spouten er ganske triviell og lite brukelig til noe annet enn eksempel kode.
Kort fortalt tar denne disse fire sentingene om kuer epler og godterier og sender dem til topologien.
Hvor de blir sendt kommer vi tilbake til senere
public class Split extends BaseFunction { public void execute(TridentTuple tuple, TridentCollector collector) { String sentence = tuple.getString(0); for(String word: sentence.split(" ")) { collector.emit(new Values(word)); } } }
Her kommer et eksempel på en bolt. Dette er en helt enkel Java-snippet.
Og som dere ser tar denne inn en setning, splitter opp setningen til ord og sender dem videre ut til den store verdenen.
TridentTopology topology = new TridentTopology(); TridentState wordCounts = topology.newStream( "spout1" , spout ) .each( new Fields( "sentence" ), new Split(), new Fields( "word" ) ) .groupBy( new Fields( "word" ) ) .persistentAggregate( new MemoryMapState.Factory(), new Count(), new Fields( "count" )) .parallelismHint(6);
Det er her, når man skal definere topolgien, man bestemmer hvor spoutene og boltene skal levere meldingene sine.
I dette kodeeksempelet har vi brukt Trident. Trident er et høynivå API for å definere topologier. Trident sørger også for at meldinger garantert blir prosessert.
Steffen: Husker du hvordan garanterer dette?