SlideShare ist ein Scribd-Unternehmen logo
1 von 53
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 Spout
public 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 Bolt
public 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 E5645@2.4 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 Streaming
SparkConf 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 - Input
Authorization 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 - Transformations
JavaDStream<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
vs
Processing 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

Weitere ähnliche Inhalte

Ähnlich wie Real-Time Streaming: Apache Spark Streaming i Apache Storm

[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5. Stipe Predanic
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeMihovil Rister
 
[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOSStipe Predanic
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaFive
 
Računarski praktikum 1 - Konstruktor kopiranja
Računarski praktikum 1 - Konstruktor kopiranjaRačunarski praktikum 1 - Konstruktor kopiranja
Računarski praktikum 1 - Konstruktor kopiranjaGoran Igaly
 

Ähnlich wie Real-Time Streaming: Apache Spark Streaming i Apache Storm (8)

Baze podataka i SQL - Vlatko Vlahek
Baze podataka i SQL - Vlatko VlahekBaze podataka i SQL - Vlatko Vlahek
Baze podataka i SQL - Vlatko Vlahek
 
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5. [TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.
[TVZ Računarstvo] Dinamičke web aplikacije, predavanje 5.
 
241219695 protokol-tcp
241219695 protokol-tcp241219695 protokol-tcp
241219695 protokol-tcp
 
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil RisterJavantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
Javantura Zagreb 2014 - Vert.x 1.3 - Mihovil Rister
 
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacijeVert.x - asinkroni skalabilni i poliglotni framework nove generacije
Vert.x - asinkroni skalabilni i poliglotni framework nove generacije
 
[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS[ERRO] Predavanje: RTOS
[ERRO] Predavanje: RTOS
 
Vert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, JavanturaVert.x - Mihovil Rister, Javantura
Vert.x - Mihovil Rister, Javantura
 
Računarski praktikum 1 - Konstruktor kopiranja
Računarski praktikum 1 - Konstruktor kopiranjaRačunarski praktikum 1 - Konstruktor kopiranja
Računarski praktikum 1 - Konstruktor kopiranja
 

Real-Time Streaming: Apache Spark Streaming i Apache Storm

  • 1. Real-Time Streaming: Apache Spark Streaming i Apache Storm Spark Meetup, 27.04.2015. Zagreb, Davorin Vukelić
  • 2.
  • 3. Sadržaj • Real-Time Streaming • Apache Storm • Apache Spark Streaming • Demo • Zaključak
  • 4. 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
  • 5. 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
  • 6. 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
  • 7. 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
  • 8. 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
  • 9. 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());
  • 10. Storm Ramasamy, Karthik : Audicity Real-Time Analytics with Apache Storm • Sharding – razbijanje u dijelove
  • 11. Storm • SCALING – raspodjela obrade Ramasamy, Karthik : Audicity Real-Time Analytics with Apache Storm
  • 12. 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
  • 13. 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)
  • 14. 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)
  • 15. Storm Spout public 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;
  • 16. Storm Bolt public 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; } }
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. 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 E5645@2.4 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
  • 24. 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
  • 25. 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
  • 26. 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
  • 27. 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
  • 28. Spark Streaming SparkConf 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()
  • 29. 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
  • 30. 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
  • 31. Spark Streaming - Input Authorization 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(); } });
  • 32. 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
  • 33. 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
  • 34. Spark Streaming - Transformations
  • 35. Spark Streaming - Transformations JavaDStream<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; } });
  • 36. 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
  • 37. Spark Streaming - Transformations
  • 38. 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.
  • 39. 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);
  • 40. 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
  • 41. 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.
  • 42. 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; });
  • 44. 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);
  • 45. Spark Streaming Parallelism • Broj prijemnika • Izraditi više input Dstream-ova • Potom ih spojoti sa merge operacijom • Eksplicitno reparticioniranje primljenih podataka • DStream.repartition
  • 46. 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)
  • 47. 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
  • 48. 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
  • 49. 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
  • 50. 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 vs Processing Model Delivery Guarantees Latency Language Options Development Process Fault Tolerance
  • 51. 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
  • 52. 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
  • 53. 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

Hinweis der Redaktion

  1. Ni jedan pristup nije gori ili bolji, bitno je kako se gleda na cijelu stvar i od kuda imamo pristup
  2. Process Fault Tolerance: Is high-availability of primary concern? Both systems actually handle fault-tolerance of this kind really well and in relatively similar ways. Production Storm clusters will run Storm processes under supervision; if a process fails, the supervisor process will restart it automatically. State management is handled through ZooKeeper. Processes restarting will reread the state from ZooKeeper on an attempt to rejoin the cluster. Spark handles restarting workers via the resource manager: YARN, Mesos, or its standalone manager. Spark’s standalone resource manager handles master node failure with standby-masters and ZooKeeper. Or, this can be handled more primatively with just local filesystem state checkpointing, not typically recommended for production environments.