9. •And some mind breaking Bulletpoints 1
•And some mind breaking Bulletpoints 2
•And some mind breaking Bulletpoints 3
• Or some great Sub-Bulletpoints 1
• Or some great Sub-Bulletpoints 2
• Or some great Sub-Bulletpoints 3
•And some mind breaking Bulletpoints 4
•And some mind breaking Bulletpoints 5
Geschwindigkeit & (Near) Real Time_
9
10. Erst Verarbeiten, dann speichern_
10
Persistenz
Query
Persistenzstream processing
stream processing
stream processing
12. –Tyler Akidau
“ ... an execution engine designed for
unbounded data sets, and nothing more”
12
13. •Unbegrenzter Datenstrom
•Verteilt über verschiedene Knoten
•Kontinuierliche Verarbeitung, Aggregation und Analyse
•MapReduce ähnliches Verarbeitungsmodell
•In-Memory Verarbeitung
•Latenz im Bereich von Millisekunden oder Sekunden
•Skalieren durch Verteilen
•Häufig modelliert als DAG
Distributed Stream Processing_
13
14. •Eventzeit:
• Zeitpunkt, an dem das Event aufgetreten ist
•Verarbeitungszeit:
• Zeitpunkt, an dem das Event vom System beobachtet und
verarbeitet wurde
Eventzeit vs. Verarbeitungszeit_
14
Event
Verarbeitung
1 2 3 4 5 6 7 8 9t in Minuten
15. •Differenz ist nicht konstant
• Ressourcen bedingt (CPU, Netzwerk,..)
• Software bedingt (verteilte Systeme..)
• Daten bedingt (Schlüsselverteilung, Varianzen in Daten selbst)
•Analyse nach Verarbeitungszeit
• einfacher aber ggfs. zu ungenau
•Analyse nach Eventzeit
• komplexer, dafür genauer
Eventzeit vs. Verarbeitungszeit_
15
16. •Nicht triviale Anwendungen benötigen meist einen State
• z.b. Aggregationen über einen längeren / unendlichen Zeitraum
• in-memory
• interessant im Fehlerfall
State & Window Verarbeitung_
16
17. •Window als (zeitlich) begrenzter State
• Tumbling Window
• Sliding Window
• Session Window
•Unterschiedliche Trigger
• Zeit
• Anzahl
Windowing & Sliding_
17
21. •Mit Verarbeitungszeit einfach
•Mit Eventzeit schwerer
• Vollständigkeit (out of order Events)
• Buffering
•Strategien bei Eventzeit Windows
• Watermarks
• Trigger
• Akkumulation
•Mehr Informationen
• https://www.oreilly.com/ideas/the-world-beyond-batch-
streaming-101
• http://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf
Window Verarbeitung und Zeiten_
21
22. •Wann werden States materialisiert?
•Watermark: Wann habe ich alle Daten zusammen?
•Trigger: Zusätzliche Auslöser, sowohl früher als auch später
•Akkumulation: Wie werden die einzelne Teile zusammengefügt?
Exkurs: Watermarks, Trigger, Akkumulation_
22
input
.apply(Window.into(FixedWindows.of(Duration.standardMinutes(2)))
.triggering(
AtWatermark()
.withEarlyFirings(AtPeriod(Duration.standardMinutes(1)))
.withLateFirings(AtCount(1))))
.withAllowedLateness(Duration.standardMinutes(1)))
.discardingFiredPanes())
.apply(Sum.integersPerKey());
vgl. https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102
24. •Gestartet 2010 durch BackType/Twitter, Apache seit 2013
•Pionier im Big Data / Stream Bereich
•Technologie der Lambda Architektur
•Low Level API
•Spouts und Bolts beschreiben eine Topologie
•Trident: High Level Erweiterung
• Aggregationen
• State & Window Operationen
• Join, Merge, Group, ...
Apache Storm_
24
25. •Entwickelt bei LinkedIn, Open Source 2013
•Verfolgt den Log Ansatz von Kafka
•Ausgeführt auf YARN
•Geeignet für große States
•Erweiterbar über APIs
Apache Samza_
25
26. •Open Source (2010) & Apache Projekt (2013)
•Einheitliche Batch & Stream Verarbeitung
•Hohe Verbreitung
•RDD als Basis, DataFrames/DataSets als Optimierung
Apache Spark_
26
27. •2010 als Forschungsprojekt gestartet, seit 2014 Apache
•Low Latency Streaming und High Throughput Batch Processing
•Streaming First Ansatz
•Flexible States und Windows
Apache Flink_
27
33. •Operatoren und Quellen als
Komponenten
•Eigene Komponenten
•manuelle Topologie Definition
Programmiermodell_
33
Komponentenbasiert
•High Level API
•Higher Order Functions
•Abstrakte Datentypen
•Fortgeschrittene Operationen
inkludiert
•Eingebaute Optimierungen
Deklarativ
34. Word Count - Flink_
34
val env = StreamExecutionEnvironment.getExecutionEnvironment
val text = env.socketTextStream("localhost", 9999)
val counts = text
.flatMap(_.toLowerCase.split("W+"))
.filter( _.nonEmpty)
.map(_, 1)
.groupBy(0)
.sum(1)
counts.print
env.execute("Scala Socket Stream WordCount")
Stateful Operation
35. Word Count - Spark_
35
val sparkConf =
new SparkConf().setAppName("Streaming Word Count")
val ssc = new StreamingContext(sparkConf, Seconds(1))
ssc.checkpoint(".")
val mappingFunc = (key: String, value: Option[Int], state:
State[Int]) => {
val sum = value.getOrElse(0) + state.getOption.getOrElse(0)
val output = (key, sum)
state.update(sum)
output
}
val wordCountState = StateSpec.function(mappingFunc)
36. Word Count - Spark_
36
val lines = ssc.socketTextStream(args(0), args(1).toInt)
val words = lines.flatMap(_.split(" "))
val wordsWithCount = words.map(x => (x, 1))
val stateDstream = wordsWithCount.mapWithState(wordCountState)
stateDstream.print()
ssc.start()
ssc.awaitTermination()
37. •Spark 2.0 wurde releast
• Dataframes für Streaming
• Schneller, flexibler, ...
• Preview Status
Spark 2.0_
37
38. Word Count - Storm_
38
TopologyBuilder builder = new TopologyBuilder();
builder.setSpout("spout", new RandomSentenceSpout(), 5);
builder.setBolt("split", new SplitSentence(), 8)
.shuffleGrouping(„spout");
builder.setBolt("count", new WordCount(), 12)
.fieldsGrouping("split", new Fields("word"));
39. Word Count - Storm_
39
Config conf = new Config();
conf.setMaxTaskParallelism(3);
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("word-count", conf,
builder.createTopology());
Thread.sleep(10000);
cluster.shutdown();
40. Word Count - Storm_
40
public static class WordCount extends BaseBasicBolt {
Map<String, Integer> counts = new HashMap<String, Integer>();
public void execute(Tuple tuple, BasicOutputCollector collector)
{
String word = tuple.getString(0);
Integer count = counts.get(word);
if (count == null)
count = 0;
count++;
counts.put(word, count);
collector.emit(new Values(word, count));
}
public void declareOutputFields(OutputFieldsDeclarer declarer)
{ declarer.declare(new Fields("word", "count")); }
}
41. Word Count - Storm Trident_
41
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);
Trident
42. Word Count - Storm Trident_
42
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));
}
}
}
Trident
43. Word Count - Samza_
43
class WordCountTask extends StreamTask with InitableTask {
private var store: CountStore = _
def init(config: Config, context: TaskContext) {
this.store = context.getStore("wordcount-store")
.asInstanceOf[KeyValueStore[String, Integer]]
}
49. •Erneute Verarbeitung nicht einfach möglich
•Anfang und Ende schwer zu bestimmen
•State muss auch gesichert werden
•Verschiedene Ansätze
• Record Ack
• Micro Batching
• Transactional Updates
• Snapshots
• Change Logs
Fault Tolerance_
49
64. Überblick_
64
Trident
Engine Nativ Microbatching Microbatching Nativ Nativ Nativ
Programmier-
modell
Komponentenbasiert Deklarativ Komp. basiert Deklarativ Beides
Durchsatz Mittel Gering Sehr Hoch Hoch Hoch Hoch
Latenz Sehr Gering Mittel Mittel Gering Gering Gering
Garantien At-least-once Exactly-once* Exactly-once* At-least-once Exactly-once* At-least-once
Eventzeit
Handling
Nein Nein Nein/Ja* Nein Ja Ja*
Reife Hoch Hoch Hoch Hoch Hoch Mittel
Community &
Ökosystem
Hoch Hoch Hoch Mittel Mittel Mittel
Laufzeit-
umgebung
Cluster Cluster Cluster Cluster Cluster Bibliothek
65. •bereits Spark Batch Anwendungen vorhanden sind
•komplexe Analysen ausgeführt werden sollen
•eine Hadoop Distribution vorhanden ist
•viele Umsysteme integriert werden
•eine große Community wichtig ist
•Scala kein Problem ist
•Latenz kein Kriterium ist
Spark Streaming wenn..._
65
66. •Sehr niedrige Latenz, niedriges Volumen
•At-Least Once Verarbeitung
•Zustandslose Verarbeitung
•Ggfs. Heron als Alternative
Storm für ..._
66
67. •Für Eventzeit Verarbeitung
•Für pures Streaming
•Sehr gute Konzepte
•Nutzen und Mitarbeit an einem jungen Projekt
Und Flink ..._
67
68. •Kafka omnipräsent ist
•Die Verarbeitung simpel ist
•Keine Streams korreliert werden
•Wenn das Deployment einfach sein soll
•Ein Scheduler vorhanden ist
Kafka Streams, wenn _
68
70. •And some mind breaking Bulletpoints 1
•And some mind breaking Bulletpoints 2
•And some mind breaking Bulletpoints 3
• Or some great Sub-Bulletpoints 1
• Or some great Sub-Bulletpoints 2
• Or some great Sub-Bulletpoints 3
•And some mind breaking Bulletpoints 4
•And some mind breaking Bulletpoints 5
Weitere Aspekte & Tools_
70
71. •Apache Beam
• High Level API für Streaming Runner
•Google Cloud Data Flow
• Googles Cloud Streaming Framework; Beam Implementierung
•Apex
• YARN basiert, statische Topologie, Änderungen zur Laufzeit
•Flume
• Logfile Streaming insb. in HDFS
•Heron
• Storm Nachfolger, API kompatibel, verbesserter Throughput &
Latency
Ein Satz zu_
71