real-time streaming: apache spark streaming i apache storm

53
Real-Time Streaming: Apache Spark Streaming i Apache Storm Spark Meetup, 27.04.2015. Zagreb, Davorin Vukelić

Upload: davorin-vukelic

Post on 16-Jul-2015

168 views

Category:

Software


1 download

TRANSCRIPT

Real-Time Streaming: Apache Spark

Streaming i Apache Storm

Spark Meetup, 27.04.2015. Zagreb, Davorin Vukelić

Sadržaj

• Real-Time Streaming

• Apache Storm

• Apache Spark Streaming

• Demo

• Zaključak

Real-Time Streaming

• Kontinuirana obrada, agregacija i analiza podataka u trenutku stvaranja

podatka

• Sustavi za streaming su izrađeni kao usmjereni aciklički grafovi

• Podaci su reducirani prije nego što budu pohranjeni u centralni sustav

• Obrađuje se podatak jedan po jedan

• Sakupljaju se i obrađuju sve vrste podataka: strukturirani, polustrukturirani i

nestrukturirani iz različitih izvora

• Usmjereni aciklički graf je grafička

prezentacija razvijenih ulančanih

zadataka za obradu

• Prikazuje red izvršavanja zadataka

• Modeliraju se tokovi podataka kroz

transformacije

Real-Time Streaming

• Što se radi u realnom vremenu: • praćenje trendova

• komunikacija

• preporuke

• pretraživanje

• Reakcija u realnom vremenu bi trebala biti od 500 ms do jedne minute

• Podaci podijeljeni u poruke prolaze kroz lanac transformacija sve dok rezultat ne

bude isporučen u završnu destinaciju

• Završna destinacija može biti sustav za pohranu podataka ili direktna vizualizacija

• Za sigurnu obradu podataka je potrebno u slučaju pada sustava ponovno pokrenuti

proces obrade

• Semantika dostave podataka:• At most once: poruka može biti izgubljena i ne može biti ponovno dostavljena

• At least once: poruka neće biti izgubljena ali može biti ponovno dostavljena

• Exactly once: poruka nikad neće biti izgubljena ali i nikad ne će biti ponovno dostavljena, savršen sustav

Apache Storm

• Distribuirani sustav za obradu podataka u realnom vremenu

• Koncept obrade podataka se razvija u Storm API-u te se potom postavi na Storm klaster kako bi se

kontinuirano izvršavao

• Storm klaster je sustav koji se sastoji od dvije vrste servisa koji se pokreću na odvojenim čvorovima

(serverima)

• Event-Stream Processing – obrada podataka podijeljenih u poruke unutar toka podataka gdje se

poruke obrađuju jedna po jedna

Storm• Apstrakcije u Storm-u:

• Spout

• Izvorišni čvor u toku obrade podataka

• Dosad izrađeni spout-ovi za dohvaćanje podataka:

o Twitter api, web crawlers, FB api

o queueing broker: Kafka, Kestrel, RabbitMQ,

• Bolt

• Čvorovi u toku obrade u kojima se implementira logika obrade

• Služe također za dostavljanje podataka u završnu destinaciju

• Funkcije, filteri, spajanja tokova, agregacija tokova, pohrana podataka i lookup

podataka s baze podataka ili filesystema

• Topology

• Mreža spout-ova i bolt-ova

• Izvršava se neprekidno kada je postavljena na klaster

• Kraj mreže je najčešće bolt koji prosljeđuje podatke u: relacijsku bazu podataka,

filesystem, NoSql bazu podataka, drugu topologiju ili queueing sustav

• Tuple

• Model poruke za komunikaciju između čvorova u topologiji

• Definira nepromjenjivu listu objekata bilo kojeg tipa

Storm Tuple

• Potrebno je definirati kako se pojedini objekti serijaliziraju i

deserijaliziraju prilikom komunikacije između zadataka

• Kryo serijalizacija

• Novo izrađene serijalizacije je potrebno registrirati

• Storm može serijalizirati:

• primitive types,

• strings,

• byte arrays,

• ArrayList,

• HashMap,

• HashSet,

• Clojure collection types

Storm Topology

TopologyBuilder builder = new TopologyBuilder();

builder.setSpout("reader", new WordReader(),4);

builder.setBolt("normalizer", new WordNormalizer(),2).shuffleGrouping("reader")

.setNumTasks(2).;

builder.setBolt("counter", new WordCounter(), 2).fieldsGrouping("normalizer",

new Fields("word"));

Config conf = new Config();

conf.put(Config.TOPOLOGY_MAX_SPOUT_PENDING, 8);

LocalCluster cluster = new LocalCluster();

cluster.submitTopology("Toplogie",conf,builder.createTopology());

Storm

Ramasamy, Karthik : Audicity Real-Time Analytics with Apache Storm

• Sharding – razbijanje u dijelove

Storm

• SCALING – raspodjela obrade

Ramasamy, Karthik : Audicity Real-Time Analytics with Apache Storm

Storm Grouping• grupiranja definiraju kako se izmjenjuju poruke između dva čvora koja imaju više

paralelnih instanci u topologiji (podijeljeni su na više zadataka)

• Shuffle• Izvorni čvor nasumično bira kojoj instanci bolt-a će poruka biti odaslana

• Svaka paralelna instanca bolt-a će primiti jednak broj poruka

• Fields• Kontrolira se kako će biti odaslane poruke prema pojedinoj instanci bolt-a pomoću određenog elementa

• Poruke koje u definiranim elementima sadrže isu vrijednost će biti poslane u istu paralelnu instancu bolt-a

• Partial Key• Kontrolira se kako će biti odaslane poruke prema pojedinoj instanci bolt-a pomoću određenog elementa

u poruci

• Balansira slanje poruka između dvije instance bolta

• Koristi se kada su podaci iskrivljeni, kad jednih vrijednosti definiranog elementa ima više nego drugih, preraspodjeljuju se poruke u instancu bolt-a koja ima najmanje zaprimljenih poruka

• Bolja iskoristivost resursa

• All• Repliciraju se poruke i šalje se svim instancama

• Custom• Moguće je razviti svoje grupiranje

• Global Grouping• Sve instance izvornog čvora šalju poruku jednoj instanci bolta

Storm Grouping

• Local or shuffle grouping• Ako ciljani bolt ima jednu ili više paralelnih instanci na istom workeru, poruke će biti nasumično

raspodijeljene samo u te instance

• U slučaju da nema više instanci na jednom workeru poruke će se raspoređivati s običnim shuffle

grupiranjem

• Direct grouping• Čvor koji odašilje poruku odlučuje kojoj instanci bolta će poruka biti odaslana

• Instancu bola određujemo prema taskID, kojeg dobijemo iz OutputCollector (on sadrži sve

informacije o topologiji)

Storm Multiple Stream• Čvor u topologiji odašilje predefiniranu poruku svi čvorovima koji su

pretplaćeni na njega

• Multiple stream omogućuje da imamo više tokova iz izvorišnog čvora, a svaki

taj tok ima drugačiju predefiniranu poruku

• Čvorovi koji se pretplaćuju na izvorišni čvor moraju definirati id toka na koji se

žele pretplatiti

• Bolt (čvor) se također može pretplatiti na više čvorova.

• Prilikom primanja poruke iz konteksta poruke uzima se id čvora i prema

njemu se obrađuje poruka (poruke iz različitih čvorova mogu biti različite)

Storm Spoutpublic class WordReader implements IRichSpout {

private SpoutOutputCollector collector;

private FileReader fileReader;

private boolean completed = false;

private TopologyContext context;

public boolean isDistributed() {return false;}

public void ack(Object msgId) {System.out.println("OK:" + msgId);}

public void close() { }

public void fail(Object msgId) {System.out.println("FAIL:" + msgId);}

public void nextTuple() {

if (completed) {

String str;

BufferedReader reader = new BufferedReader(fileReader);

try {

while ((str = reader.readLine()) != null)

{ this.collector.emit(new Values(str), str); }

} catch (Exception e) {throw new RuntimeException("Error reading tuple", e);

} finally {completed = true;} }

public void open( Map conf, TopologyContext context, SpoutOutputCollector collector) {

this.context = context;

this.collector = collector;

try {this.fileReader = new FileReader(conf.get("wordsFile").toString());

} catch (FileNotFoundException e) {throw new RuntimeException("Error reading file[" conf.get("wordFile") + "]");

} }

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("line"));

}

public void activate() {}

public void deactivate() {}

public Map<String, Object> getComponentConfiguration() {

return null;

}

Storm Boltpublic class WordNormalizer implements IRichBolt {

private OutputCollector collector;

public void cleanup() {

}

public void execute(Tuple input) {

String sentence = input.getStringByField("line");

String[] words = sentence.split(" ");

for (String word : words) {

word = word.trim();

if (!word.isEmpty()) {

word = word.toLowerCase();

collector.emit( new Values(word));

}

}

collector.ack(input);

}

public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {

this.collector = collector;

}

public void declareOutputFields(OutputFieldsDeclarer declarer) {

declarer.declare(new Fields("word"));

}

public Map<String, Object> getComponentConfiguration() {

return null;

}

}

Storm demo

Storm demo

Storm demo

Storm - cluster• Master čvor– pokreče servis Nimbus

• On distribuira kod na cijeli klaster

• svakom workeru dodjeljuje njegov zadataka

• Nadzire kada dolazi do neuspjeha

• Worker čvor– pokreče servis Supervisor• Svaki Supervisor može imati više workera slotova

• Na svakom se izvršava jedan dio topologije

• Svaki worker slot može imati više pokrenutih izvršitelja (executor-a)

• Executor je jedan thrad u worker slotu

• Zookeeper• U njemu su pohranjena stanje svakog čvora u klasteru

Fan Jiang, Enabling Site-Aware Scheduling for Apache Storm in ExoGENI

Storm - cluster

• Tasks• Svaki spout ili bolt pokreće zadatke(task-ove) u jednom od worker slotova

• Svaka instanca spouta ili bolta je pokrenuta u jednom executoru

• nextTuple() i execute() su metode čvora koje se gledaju kao jedan zadatak (task)

• Jedna instanca čvora može pokretati više zadataka

• Grupiranja definiraju kako se šalju poruke iz jednog seta zadataka u drugi set zadataka

• Konfiguracija: .setNumTasks(#) – koliko zadataka (task-s) po izvršitelju (executor-u) , tj. Koliko threado-va po izvršitelju

• Workers (slots)• Svaki worker slot proces is fizički JVM koji izvršava dio zadataka svih zadataka u topologiji

• Svaki worker slot pokreče izvršitelje za određenu topologiju

• Na primjer ako kombinirani paralelizam topologije je 300 i imamo definiranih 50 workera tada svaki worker će izvršavati 6 zadataka

• Konfiguracija : setNumWorkers

• Executors• Each executor runs one or more tasks of the same component

• Svaki izvršitelj pokreče jedan ili više zadataka jedne komponenta (čvora)

• To su thread-ovi pokrenuti u jednom procesu JVM. Više taskova može biti dodijeljeno jednom izvršitelju

• Konfiguracija: setSpout(,,#) – koliko izvršitelja

• Konfiguracija : setBolt(.,#) –koliko izršitelja

• Broj zadataka za komponentu je uvijek isti u životnom ciklusu topologije, ali broj izvršitelja za komponetu može se mijenjati

Storm - cluster

• builder.setSpout(SENTENCE_SPOUT_ID, spout, 2);

• builder.setBolt(SPLIT_BOLT_ID, splitBolt, 2)

.setNumTasks(4)

.shuffleGrouping(SENTENCE_SPOUT_ID);

• builder.setBolt(COUNT_BOLT_ID, countBolt, 4)

.fieldsGrouping(SPLIT_BOLT_ID, new

Fields("word"));

P. Taylor Goetz,Brian O'Neill :Storm Blueprints: Patterns for Distributed Real-time Computation

Jonathan Leibiusky, Gabriel Eisbruch, Dario Simonassi: Getting Started with Storm

Storm

• Skalabilnost (Scalable):• Ima veliku propusnost poruka uz vrlo malo kašnjenje

• Jedan milijun poruka od 100 B po sekundi na jednom čvoru klastera (konfiguracija čvora:

Procesor: 2x Intel [email protected] GHz , RAM. 24 GB)

• Otpornost na padove (Fault-tolerant):• Automatsko pokretanje worker servisa koji su pali. Ako cijeli čvor padne worker će se

ponovno pokrenuti na drum čvoru klastera

• Padovi se očekuju i pripremljenja je procedura za njihovu obradu

• Ponovno će se pokrenuti kao da se ništa nije dogodilo

• Stanje čvora je pohranjeno na Zookeeper-u

• Sigurnost obrade podataka (Guarantees data processing – Reliable):• Prati se putanja poruka preko cijele topologije

• Poruka se ponovno šalje samo u slučaju da je došlo do neuspjeha obrade

• Anchoring (usidravanje) je specificirano za za povezane poruke u tuple tree. Izvršava se

svaki puta kada je poruka odaslana

• Zadano je da se po default-nim postavkama poruka obrađuje najmanje jednom (At least

once )

• Može se definirati i drugačije ali tada utječemo na latentnost sustava

Storm

• Programski jezici:• Storm je razvijen na Thrif-tu za definiranje i postavljanje topologije na klaster

• Većina jezika je podržana

• Open source:• Velika i rastući eko sustav library-a i alata za vezanje sa Storm-om

• Spot-ovi koji su povezani s queueing sustavima kao što su JMS, Redis pub/sub, Kafka

• Pomoćni bolt-ovi koji Storm povezuju s bazama kao što su MongoDB, RDBMS, Cassandra,

Hbase i HDFS datotečnim sustavom

• Transakcija:• Može se dobiti semantika jedne poruke prilikom obrade

Spark Streaming

• Open source obrada tokova podataka i engine za procesiranje

• Izrađen ja za brzu, jednostavnu i softificiranu analitiku

• Ekstenzija jezgre SPARK API-a

• Skalabilan, visoko propustan, otporan na padove sustav za obradu toka podataka

• Batch (gomila) obrada je koncept obrade velike količine podataka odjednom. Micro-batch je slučaj kada je količina podataka koje se obrađuje odjednom mala.

• Pokreće se na:• Hadoop YARN

• Mesos

• Spark klasteru

• EC2 (Amazon)

• lokalno

• Izvori:• Kafka

• Flume

• ZeroMQ

• TCP soketi

• Twitter

• Kinesis

• HDFS

Spark Streaming

• Završna destinacija:

• HDFS

• Baze podataka

• Sučelje

• Spark’s machine learning

• Spark’s graph processing algorithms

• Ulazni tok podataka dijeli se u micro-batche-ve te se izvršavaju transformacije nad pojedinim RDD-om ili grupi

RDD-ova

Holden Karau, Andy Konwinski, Patrick Wendell, Matei Zaharia: Learning Spark Lightning-Fast Big Data Analysis

Spark Streaming

• Abstrakcije u Spark Streaming-u:

• Dstream• Discretized stream – diskretizirani tok

• Dolazeće sekvence podataka

• Kontinuirane serije RDD-ova

• RDD• Resilient Distributed Dataset

• Elastična distribuirani set podataka

• Kolekcija objekata raspoređenih preko cijeloga klastera

• Particionirani i distribuirani

• Particije se rekalkuliraju nakon pada sustava

• Većina pohranjena u RAM, nešto malo na disk

• Spark Streaming kontekst radi s malim RDD-ovima

• Svaki RDD u Dstream-u sadrži podatke u određenom intervalu

• Na svakom malom RDD izvršava se transformacija kao i na normalnom

• PairDstream• DStream ključ-vrijednost parova, nad njima je moguće provoditi dodatne metoda kao što je reduceByKey i

join

• StreamingContext API

Spark StreamingSparkConf conf = new SparkConf().setAppName("twitter-stream").setMaster("local[2]");

JavaStreamingContext jssc = new JavaStreamingContext(conf,Durations.seconds(10));

jssc.checkpoint("/home/cloudera/Desktop/spark_tweets");

jssc.start()

jssc.awaitTermination()

Spark Streaming

• Operacije• Primjenjuju se na svaki RDD u Dstream-u

• Transformacije

• Svaka transformacija kreira DStream

• Operatori za izlaz podataka

• Zapisuje podatke na drugi sustav

• Može se pokretati periodično kako bi kreirali veći batch (gomilu) podataka za izlaz

• Checkpointing• Mora biti izdržljiv na padove sustava, u trenutku kada se JVM sruši

• Oporavlja sustav nakon pada

• Tipovi podatka koji su pohranjeni u checkpoint

• Metadata checkpointing – Konfiguracija , Dstream operacije, ne kompletni batch-evi podataka

• Data checkpointing - pohrana generiranih RDD-ova u pouzdan sustav za pohranu

Spark Streaming - Input

• predefinirani izrađeni izvori tokova podataka:• Kreiraju se multiplicirani receiveri koji istovremeno prihvaćaju više tokova podatka

• Osnovni izvori:• Datotečni sustavi

• čitaju podatke iz datoteka na datotečnom sustavu kao što je HDFS pomoću HDFS API-a

• Nadziru direktorij i procesiraju datoteke koje se u njemu pojave (kreiraju ili kopiraju)

• datoteke u direktoriju koji se nadzire ne smiju se cijelo vrijeme puniti, moraju biti preseljene

• Konekcije na soketu:• Tok podataka se djeli na intervale u vremena

• Akka actors

• RDD izrađen kao tok • Izrađeni RDD u Sparku stavlja se u tok koji šalje na obradu u Spark Streaming

• Tretira se kao batch (gomila) podataka u Dstream-u

• Napredni izvori:• Vanjski library koji nije dio Sparka

• Izvori implementirani od developera

• Kafka

• Flume

• Kinesis

• Twitter

• ZeroMQ

• MQTT

Spark Streaming - InputAuthorization auth = twitter.getAuthorization();

final String[] filters = { "#KCA", "#kca" };

JavaDStream<Status> tweets = TwitterUtils.createStream(jssc, auth, filters);

JavaDStream<String> statuses = tweets.map(new Function<Status, String>(){

public String call(Status status) {

return status.getText();

}

});

Spark Streaming - Transformations

Transformacije na Dstream-u Stateless transformations• Obrađuje svaki batch zasebno

• Ne ovisi o podacima iz prijašnjih batch-ev

• Batch u Dstream-u možemo razdvojiti iz jednog u Više RDD-ova ili spojiti iz više u jedan RDD

• Omogućuje izrađenu RDD-u-RDD funkciju da se izvrši na Dstream-u

• transform()

Transformation Meaning

map(func)Vraća novi Dstream tako da daje svaki element iz izvornog Dstrema sa nekom funkcijom.

flatMap(func)Kao i map ali svaki element izvorišnog može biti mapiran u nijednu ili više elemenata za

odredišni DStream

filter(func)Vračano novi Dstream tako što odabire zapise samo gdje funkcija vraća vrijednost true

repartition(numPartitions) Povećava nivo paralelizma tako da poveća broj particija

Spark Streaming - Transformations

Transformation Meaning

count()Vraća novi Dstream sa jednim elementom RDDa koji sadrži prebrojane vrijednosti

elemenata u RDD-u izvorišnog Dstream-a

reduce(func)

Vrača novi Dstream sa jednim elementom RDDa koji sadrži agregirane vrijednosti

elemenata u RDD-u izvorišnog Dstream-a koristeći funkciju koja uzima dva elementa i vraća

jedan.

reduceByKey() Koristi se kada imamo JavapairDStream koji sadrži ključ-vrijednost parove. Kombinira

ključeve u svakom batch-u i vraća njihovu vrijednost

groupByKey() Grupira vrijednosti sa istim ključem u svakom batch-u

Spark Streaming - Transformations

Spark Streaming - TransformationsJavaDStream<String> words = statuses.flatMap(new FlatMapFunction<String, String>() {

public Iterable<String> call(String in) {

return Arrays.asList(in.split(" "));

}

});

JavaPairDStream<String, Integer> pairs = words.mapToPair(new PairFunction<String, String, Integer>() {

public Tuple2<String, Integer> call(String in) throws Exception {

return new Tuple2<String, Integer>(in, 1);

}

});

JavaPairDStream<String, Integer> counts = pairs .reduceByKey(new Function2<Integer, Integer, Integer>() {

public Integer call(Integer a, Integer b) {

return a + b;

}

});

Spark Streaming - Transformations

• Transformacije na Dstream-u Stateful transformations• Uzimaju se prijašnji batch-evi za generiranje novih batch-eva

• Prati stanje tijekom vremena

• Checkpointing mora biti postavljen

• updateStateByKey():

• Vrača novo stanje Dstream-a gdje je se vrijednost svakog ključa ažurira na temelju funkcije koja zbraja trenutnu vrijednost i novu vrijednost za svaki ključ. Koristi se za održavanje stanja za svaki ključ.

• Sliding windows :• Transformacija na klizećem prozorom podataka

• Više batcheva tvori jedan prozor, koji se stvara u intervalima

• Parameters:• window length - vremensko trajanje prozora

• sliding interval - interval kada se prozor

primjenjuje

Batch=1 sec

window length = 2 sec

sliding interval = 3 sec

Spark Streaming - Transformations

Spark Streaming - Transformations

Transformation Meaning

window(windowLength, slideInterval) Vraća novi Dstream koji izračunat na batch-evima u prozoru izvorišnog Dstream-a

countByWindow(windowLength,slideInterval) Vraća vrijednosti klizećeg prozora izračunatih od elemenata u toku podataka

reduceByWindow(func, windowLength,slideInterval)

Vraća novi stream s pojedinim element ima koji su kreirani na temelju agregiranih vrijednosti u podatkovnom

toku u jednom intervalu klizećeg prozora. Kreira se pomoću asocijativne funkcije koja se izvršava u paraleli

reduceByKeyAndWindow(func,windowLength, slideIn

terval, [numTasks])

Na temelji Dstrem-a s ključ-vrijednost parovima vraća novi Dstream sa ključ-vrijednost parovima gdje je

vrijednost za ključ agregirana prema funkciji koja se primjenjuje na batcheve u definiranom klizećem

prozoru. Paralelizam je defaultna vrijednost postavljena na u lokalnom modu. U klasteru paralelizam je

definiran u konfiguracijskom svojstvu spark.default.parallelism.Također se može postaviti paralelizam sa numTasks argumentom

reduceByKeyAndWindow(func, invFunc,windowLengt

h, slideInterval, [numTasks])

Bolja verzija prethodne funkcije gdje se agregacija vrijednosti svakog klizećeg prozora izračunava

inkrementalno. Dodaju se nove vrijednosti koje ulaze u klizeći prozor i oduzimaju se vrijednosti koje izlaze iz

prozora s inverznom redukcijom.

countByValueAndWindow(windowLength,slideInterval

, [numTasks])

Na temelji Dstrem-a s ključ-vrijednost parovima vrača novi Dstream s ključ-vrijednost parovima gdje je

vrijednost za ključ gdje je vrijednost svakog ključa frekvencija u klizećem prozoru.

Spark Streaming - Transformations

Function2<List<Integer>, Optional<Integer>, Optional<Integer>> updateFunction =

new Function2<List<Integer>, Optional<Integer>, Optional<Integer>>() {

public Optional<Integer> call(List<Integer> values,Optional<Integer> state) {

Integer newSum = state.or(0);

for (int i : values) {

newSum += i;

}

return Optional.of(newSum);

}

};

JavaPairDStream<String, Integer> runningCounts = pairs.updateStateByKey(updateFunction);

Spark Streaming – Transformations join

• Radi sa PairDStream, moramo Dstream pripremiti da RDD-ovi bude ključ-

vrijednost parovi

• Podaci se uparaju prema ključu

• Uparuje podatke iz više različitih Dstream-ova sa transformacijama:• join()

• leftOuterJoin()

• rightOuterJoin,

• fullOuterJoin

• merge contents of two different Dstreams:

• union()

• Stream-stream joins

• Stream-dataset joins

Spark Streaming - Output

• Izlazne transformacije za pohranu podataka u vanjske baze podataka

i datotečne sustave

Output Operation Meaning

print()Ispisuje prvih deset elemenata svakog batch-a podataka u Dstream-u na čvoru klastera na

kojem se vrši aplikacija obrade toka podataka

saveAsTextFiles(prefix,

[suffix])

Pohranjuje Dstream kontekst kao tekstualnu datoteku. Ime datoteke za svaki batch interval

ima prefix i suffix: prefix-TIME_IN_MS.suffix

saveAsObjectFiles(prefix,

[suffix])

Pohranjuje Dstream kontekst kao SequenceFile serijaliziranog Java Objekta.

Save this DStream's contents as a SequenceFile of serialized Java objects. Ime datoteke za

svaki batch interval ima prefix i suffix: prefix-TIME_IN_MS.suffix

saveAsHadoopFiles(prefix,

[suffix])

Pohranjuje Dstream kontekst kao Hadoop datoteku na HDFS sustav. Ime datoteke za svaki

batch interval ima prefix i suffix: prefix-TIME_IN_MS.suffix

foreachRDD(func)

Najviše korištena izlazna transformacija koja se bazira na funkciji koja obrađuje svaki RDD u

njihovom toku. Funkcija će pohraniti podatke u svakom RDD-u generiranom u stream-u u bilo

koju bazu, sustav ili zaslon.

Spark Streaming - Output

sortedCounts.foreach(new Function<JavaPairRDD<Integer, String>, Void>() {

public Void call(JavaPairRDD<Integer, String> rdd) {

Jedis jedis = new Jedis("#.#.#.#");

for (Tuple2<Integer, String> t : rdd.collect()) {

jedis.publish("spark_words", t._2 + "|" + Integer.toString(t._1));

}

return null;

});

Spark Streaming demo

Spark Streaming - Output

JavaPairDStream<Text, IntWritable> writableDStream = runningCounts.mapToPair(

new PairFunction<Tuple2<String, Integer>, Text, IntWritable>() {

public Tuple2<Text, IntWritable> call(Tuple2<String, Integer> e) {

return new Tuple2(new Text(e._1()), new IntWritable(e._2()));

}

});

class OutFormat extends TextOutputFormat<Text, Integer> {};

writableDStream.saveAsHadoopFiles("hdfs://#.#.#.#/user/hdfs/tweets_spark/", "",

Text.class, IntWritable.class, OutFormat.class);

Spark Streaming Parallelism

• Broj prijemnika

• Izraditi više input Dstream-ova

• Potom ih spojoti sa merge operacijom

• Eksplicitno reparticioniranje primljenih podataka

• DStream.repartition

Spark Streaming

• Skalabilan

• Visoko propustan

• Otporan na padova sustava

• Sigurnost obrade podataka (Reliable):• Poruke se obrađuju jednom i ne šalju se ponovno(exactly once)

Spark Streaming

• MLlib

• Machine learning algoritmi koji istovremeno uče na podacima iz tokova te također primjenjuju

model na podacima u toku podataka

• Streaming linearna regresija

• Streaming KMeans,

• DataFrame

• Iz stream je moguće kreirati SQLContext koristeći SparkContext

• Definirati model podataka te nad njima vršiti upite

Storm vs Spark zaključak

- use case• Analitika u realnom vremenu

• online machine learning (Storm.R)

• Kontinuirana obrada podataka

• Distribuirani RPC(Remote Procedure Call)

• ETL

• Nadzor sustava

• Praćenje trendova koji mogu ukazati na problem• Pošalju upozorenje ili iniciraju rješavanje problema

• Snabdijevaju sučelja za vizualizaciju podataka• Trenutni podaci

• Povijesni podaci

Storm vs Spark zaključak - pristup

• Storm:• Izrada se zasniva na izradi klasa i implementiranju sučelja

• Prednost je što može biti implementiran u bilo kojem jeziku( kod pisan u R nije nativno podržan u

Sparku)

• Direktni usmjereni grafovi je prirodan opis modela procesiranja podataka. Tuple (model poruke)

je prirodni opis podataka koji se šalju između dva čvora

• Polučio je odlične rezultate transformacije podataka s vrlo malom latencijom sustava

• Spark:• Bazira se na izradi funkcija i predefiniranim metodama primitivnih obrada podataka koji su

sadržani u API-u, lakša implementacija

• Implementacija klizećih prozora kroz tok podataka

• Također sadrži Tuple (model poruke), koji je dosta nespretno izveden

• Može se koristiti na postoječem Hadoop ili Mesos klasteru

• Trivijalnost micro-batching-a daje nam stateful transformacije koje su veoma korisne

Storm vs Spark zaključak

Storm• Event-Streaming

• At most once / At least

once

• sub-second

• Java, Clojure, Scala,

Python, Ruby ...

• Use other tool for batch

Spark• Micro-Batching / Batch

(Spark Core)

• Exactly Once

• Seconds

• Java, Scala, Python

• batching and streaming

are very similar

vsProcessing Model

Delivery

Guarantees

Latency

Language

Options

Development

Process Fault Tolerance

Storm vs Spark zaključak - preporuka

• Storm:• Latencija < 1 sekunda (oko 500 msekundi)

• Real Time:

• Analitika

• Budgeting

• machine learning

• Nadzor sustava

• Spark:• ETL

• iterativni machine learning

• Interaktivna analitika

• Interaktivni upiti nad podacima

• Batch procesiranje

• graph processing

Storm vs Spark zaključak

• Storm:• Niži nivo API-a

• Nema koncepta agregiranja s povijesnim podacima (klizeći prozori koz podatke)

• Nema kombiniranja batch obrade i streaminga

• Spark:• veličina klastera manja od 1TB

• Latencija je od 500 milisekundi do 1 sekundu (koncept micro-batchinga ne dozvoljava manju

latenciju)

• Ulazi u streaming su replicirani u memoriji

Storm vs Spark literatura

• Jonathan Leibiusky, Gabriel Eisbruch, Dario Simonassi: Getting Started with Storm - Continuous

streaming computation with Twitter's cluster technology

• Anderson, Quinton: Storm Real-time Processing Cookbook - Efficiently Process Unbounded

Streams of Data in Real Time

• Holden Karau, Andy Konwinski, Patrick Wendell, Matei Zaharia: Learning Spark - Lightning-Fast

Big Data Analysis

• Apache Spark Streaming Programming Guide: • https://spark.apache.org/docs/latest/streaming-programming-guide.html

• Apache Storm• https://storm.apache.org/documentation/Home.html

• P. Taylor Goetz Brian O'Neill: Storm Blueprints - Patterns for Distributed Real-time Computation