Data Pipeline mit Apache KafkaoderWie könnten Narren müde werden?
Inhalt
Wer wir sind
Was Apache Kafka ist
Wie wir Kafka nutzen und was wir mit Kafka & AWS erlebt haben
Wie ein Cluster funktioniert und ausfällt
Was ihr noch wissen wollt (Fragen)
Wer wir sind
Software Engineers bei emetriq
Java, JavaScript, Ruby (Chef), Groovy…
Apache Kafka, Cassandra, ElasticSearch
„You build it, you run it“
Moritz Siuts @coderaid
Robert von Massow @skompele
Über emetriq
kollaborativer Datenpool mit intelligenten Datenprodukten
Viele Firmen bringen Daten in den Pool ein und wir veredeln diese
Produkte sind z.B. Targeting, Retargeting oder Recommendations
Wir suchen Leute mit Talent & Interesse an:Big Data, Cloud, Java, Ruby, Scala, Agile…
hiring (emetriq.com/jobs) and firing (jeder bekommt eine Nerf-Gun)
Was Apache Kafka ist
Was Kafka ist
Publish-Subscribe-Messaging System
„Kafka is a distributed, partitioned, replicated commit log service“
„Unified platform for handling all the real-time data feeds a large company might have“
Entwickelt bei LinkedIn, verwendet u.a. bei Netflix, Yahoo…
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐> Consumer | | Producer +-‐-‐-‐-‐-‐-‐-‐> | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | Kafka Cluster +-‐-‐-‐-‐-‐-‐-‐> Consumer | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | Producer +-‐-‐-‐-‐-‐-‐-‐> | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐> Consumer | +-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | +-‐-‐-‐-‐-‐-‐v-‐-‐-‐-‐-‐-‐+ | Zookeeper | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | Kafka Cluster | | | | | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Topic | | | | name, TTL, ... | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Topic | | | | name, TTL, ... | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Topic | | | | name, TTL, ... | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Partition | | | | id | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Partition | | | | id | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Partition | | | | id | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Logfile | | | | mtime,... | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Logfile | | | | mtime,... | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
Kafka Writes Partitions +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+ | | | | | | / | 0 | 1 | 2 | 3 | | <-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+ | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ + | | | | | Locally sorted ++ | 0 | 1 | | <-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ Writes | | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ + | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | | \ | 0 | 1 | 2 | | <-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐+
Kafka ProducerSynchron oder asynchron
Batching
Compression
public class KafkaProducer<K, V> implements Producer<K, V> {
public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback){ ... }
}
Was macht Kafka mit den Daten?Writes an Logfile anhängen
Beim fetch von file auf socket schreiben
Async/Background
Replication
Daten löschen wenn veraltet (Retention Time pro Topic)
Log compaction
Leader election
API High Level Consumer
Kann 1 bis n Topics konsumieren
Konsumiert ein oder mehr Partitionen
Können in einer ConsumerGroup zusammengefasst werden
Maximal ein Consumer pro Partition (in der gleichen Group)
Consumer Groups+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | Consumer | Offset v | Group | +-‐-‐-‐+-‐+-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | | | Consumer | | | 0 | 1 | 2 | 3 | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | Offset | | Consumer | +-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | v +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐+-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | 0 | 1 | | | | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | Offset +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ v +-‐-‐-‐+-‐-‐-‐+-‐+-‐+-‐-‐-‐-‐-‐-‐-‐+ | | | | | | 0 | 1 | 2 | | | | | | | +-‐-‐-‐+-‐-‐-‐+-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐+
Wie wir Kafka nutzen und was mit Kafka & AWS erlebt haben
emetriq Architektur* Browser ^ + | | | | | | | | +-‐-‐-‐+-‐-‐-‐-‐-‐-‐v-‐-‐-‐+ | Webserver | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐> | AWS | +-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐+ | | | | | | | | | | +-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐v-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | | Cassandra <-‐-‐-‐-‐-‐-‐-‐+ Kafka +-‐-‐-‐-‐-‐-‐-‐-‐-‐> ElasticSearch | | | | | | | +-‐-‐-‐-‐-‐-‐-‐^-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐v-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | Rechenzentrum Hamburg | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ Hadoop | | | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+
* extrem vereinfacht
Kafka @ emetriq6 Kafka-Broker mit je 4 TB
ca. 2600 Msg-In/s pro Broker (15.600 Msg-In/s im Cluster zur Mittagszeit)
Teilweise hohe Peaks (z.B. wenn jemand 5 Tore in einem Spiel schießt)
Deployed in AWS: eu-west-1, je 2 Broker pro AZ, c4.xlarge Instanzen
typisch: Replikationsfaktor 2; Retention Time 14 Tage
Async-Batch-Producer mit GZIP Compression (keine Log-Compaction)
TTL greift nicht bei Broker Recovery
Wenn ein Broker seine Daten verliert, werden sie neu gezogen
Die TTL eines Topics gilt für die Timestamps der Logfiles auf der Platte
Die Files werden beim Recovery neu angelegt
BAM: doppelter Diskspace benötigt bis zum Ende der TTL
https://issues.apache.org/jira/browse/KAFKA-1379
Skalierung / Performance
Zookeeper macht viele IOPS, deshalb Provisioned IOPS EBS nehmen
vor allem wenn die Consumer zu oft die Offsets commiten
Kafka braucht echt wenig CPU und auch RAM
wenn man sein Netzwerk auslastet bekommt man aber schnell Probleme
bei AWS braucht man also trotzdem große Instanzen
http://blog.parsely.com/post/1738/kafkapocalypse/
Langsame EBS
Langsame EBS können zu Problemen bei in-sync-replicas (ISR) führen
ISR = max. 4000 Msg hinter Leader
Producer Queues
„Kafka will remain available in the presence of node failures after a short fail-over period“
Die Queues müssen groß genug sein um die fail-over-period abzufangen
Vor allem in Autoscaling-Szenarien spannend (und wenn man Code optimiert und mit einem Mal n-fach mehr Req/Server abarbeitet)
Wie ein Cluster funktioniert und ausfällt
Unser Kafka Cluster
5 Kafka RaspberryPI
ARM Cortex-A7 Quad 900MHz
1GB RAM
1 Zookeeper RaspberryPI*
2 Switches
*SPOF, don’t do this in production
Fractals via Kafka +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | Producer +-‐-‐-‐-‐-‐-‐-‐-‐> | Coordinates +-‐-‐-‐-‐-‐-‐-‐-‐-‐> |Fractal Generator+-‐+ +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐+-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | +-‐-‐-‐-‐-‐-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | |Renderer| <-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ Fractals | <-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ +-‐-‐-‐-‐+-‐-‐-‐+ | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | | | | | | Kafka | | | | | +-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐-‐+ | v
Was Ihr noch wissen wollt
Fragen?
Kommentare!
.com/jobs
Quellen
https://kafka.apache.org/documentation.html
https://issues.apache.org/jira/browse/KAFKA-1379
http://blog.parsely.com/post/1738/kafkapocalypse/
http://de.slideshare.net/miguno/apache-kafka-08-basic-training-verisign
https://github.com/yahoo/kafka-manager