Vous êtes sur la page 1sur 26

Kafka

1
Concept 1 : Message Queue

§ Utilisation d’une file d’attente de messages dans votre architecture.


§ Elle permet une communication de service à service de manière asynchrone, c’est-à-dire que le
message n’attend pas de réponse immédiate.
§ Les messages sont stockés dans la file d’attente jusqu’à ce qu’ils soient traités ce qui entraine leur
suppression.
§ Chaque message n’est traité qu’une fois pour un seul utilisateur à priori.
2
Concept 2: Broker Publish/Subsribe

3
Présentation générale
§ Kafka est un système de messagerie distribué open source
§ Propriétés
• Tolérant aux pannes,
• performant, hautement distribuable
• adapté aux traitements batchs comme streams,
§ Standard dans les pipelines de traitements de données
§ Reference
• Ref : https://kafka-python.readthedocs.io/en/master/

4
Historique
§ En 2009, les équipes d'ingénieurs de LinkedIn unifient les different pipeline
en un seul (Kafka)
§ En 2011, les sources du projet sont ouvertes, ce qui fait de la version 0.6 la
première version publique du projet.
§ L'incubateur Apache s'intéresse au projet et le fait entrer dans la fondation en
2012.
§ En 2014, une partie de l'équipe à l'origine de Kafka quitte LinkedIn pour créer
Confluent, une entreprise qui va travailler activement au développement de
Kafka et d'une plateforme autour : la « Confluent Platform ».

5
Définitions
§ Producer : tout système qui envoit des données dans un ou plusieurs topics Kafka.
• Publisher dans pub-sub.

§ Consumer : tout système qui lit des données dans un ou plusieurs topics Kafka.
• Subscriber dans pub-sub.

§ Broker : serveur Kafka

§ Cluster : ensemble de brokers

6
Logs
§ Comme une file d'attente, le log est un tableau de messages ordonnés par rapport à leur ordre de
reception
• log ne veut pas dire journal d’évènements

7
Topics
• Un topic permet de représenter une catégorie, un type de données
• Les producers envoient donc des messages dans des topics
• Les consumers cherchent des messages dans ces mêmes topics

8
Les connecteurs de Kafka
Consumer
Group 1
Producer
Consumer

Producer Kafka Server


Consumer
Topic 1

Producer Topic 2

Consumer
Connector Connector Group 2

Consumer

Consumer

9
Partitions

§ Un topic divisé en partitions.


§ Exemple : topic à 3 partitions
• Le serveur crée 3 logs, un par partition.
• Lorsqu'un producer envoie un nouveau
message dans un topic, il sera assigné
à une partition et ajouté uniquement à
cette partition.
• En fonction de la clé du message (qui
est optionnelle), le producer pousse le
message dans une partition ou dans
l'autre.
• Chaque consumer lit que dans la
partition qui lui aura été assignée.
• Les messages avec la même clé iront
donc tous dans la même partition/le
même consumer.

10
Load balancing et tolérance aux pannes
§ Cas d’un cluster Kafka avec 2 brokers hébergés sur deux machines distinctes.
• Si topic a 2 partitions et 2 réplicas,
• Chaque broker est « maitre » d'une partition.
§ Le producer envoit un message au maitre de la partition.
• Le maitre va enregistrer le message dans son log en local.
• Le second broker réplique le contenu du maitre dans son propre log.
§ Cas de panne du maître
• le deuxième prendra le relais et deviendra alors le nouveau maitre.

11
Comparison avec RabbitMQ

§ Meilleures performance
• Comparé à d’autres plateformes
publish/subscribe : RabbitMQ ou encore
ActiveMQ.
• Ref: https://softwaremill.com/mqperf/)

12
Stockage les données sur le disque
§ Les données enregistrées de manière séquentielle, les unes à la suite des autres,
• Plus rapidement accessibles sur un support mécanique.
• Le fait d'aller chercher des morceaux et de les rassembler a un coût, et même s'il paraît
négligeable à petite echelle
• Ref: ( http://queue.acm.org/detail.cfm?id=1563874

13
Mécanisme zero copy

§ Java supporte nativement ce mécanisme avec la fonction transferTo() du package


java.nio.channels.FileChannel.

14
Apache zookeeper
§ Boîte à outils pour systèmes distribués.

§ Distribué et permet la configuration de clusters pour la tolerance aux pannes.

§ Pour en savoir plus sur ZooKeeper, cf vidéo des éditions O'Reilly :


https://www.youtube.com/watch?v=40aoPoSP2H8

15
Utilisation de Kafka dans les grandes entreprises
§ Architecture évènementielle chez Meetic (https://fr.slideshare.net/VincentLepot/archictecture-
evenementiellemeetic?qid=acd402b4-bf21-4162-927c-aaece11ff590&v=&b=&from_search=6)

§ Gestion des logs chez Netflix (http://techblog.netflix.com/2016/02/evolution-of-netflix-data-pipeline.html)

§ AntiDDoS chez OVH (https://www.slideshare.net/LostInBrittany/steven-le-roux-kafka-et-storm-au-


service-de-la-lutte-antiddos-ovh-soire-big-data-du-finistjug)

§ Pipeline temps réel central chez Uber (https://fr.slideshare.net/ConfluentInc/kafka-uber-the-worlds-


realtime-transit-infrastructure-aaron-schildkrout)

§ Gestion des logs chez Dropbox (https://fr.slideshare.net/ConfluentInc/deploying-kafka-at-dropbox-


mark-smith-sean-fellows)

16
Architetcure de référence Big Data

Governance & security

17

17
Exemple: Système IoT

18
Exercice
§ Dans un système e-health, il ya plusieurs acteurs
• Le patient, les infirmières, le médecin, la BD
§ Quels sont les topics à mettre dans Kafka ?
§ Quel est le rôle de chaque élément de l’architetcure de référence ?

19
Installation
§ Environnement Docker
• Vérifier les images dans docker-compose.yml
• docker-compose up -d --build

§ Librairie python de Kafka


• !pip install kafka-python

§ Port par défaut


• localhost:9092

20
Structure d’un message Kafka
§ Key : (hashed)
§ Value Message content (in Bytes)
§ Timestamp in milliseconds
§ Metadata headers : key-value metadata
§ Offset : pointer to the last message comited by the consumer
§ …
§ Default data size 1 MB

21
Commandes Kafka
§ Connecting to Kafka shell
• docker exec -it kafka bash
§ ‘topic1’ creation
• ./bin/kafka-topics.sh --create --topic topic1 --bootstrap-server localhost:9092 --partitions 2
§ ‘topic 1’ description
• ./bin/kafka-topics.sh --describe --topic topic1 --bootstrap-server localhost:9092
§ Listing of all topics
• ./bin/kafka-topics.sh ---bootstrap-server localhost:9092 --list
§ Publish a message
• $ ./bin/kafka-console-producer.sh --topic quickstart-events --broker-list localhost:9092
• > ‘A Message example’
§ Consume a message
• $ ./bin/kafka-console-consumer.sh --topic quickstart-events --bootstrap-server localhost:9092
• > ‘A Message example’
22
Producer en Python
Prérequis : installer la librairie
! pip install kafka-python

import json
from kafka import KafkaProducer
from Time import sleep

producer = KafkaProducer(bootstrap_servers='localhost:9092',value_serializer=lambda v: json.dumps(v).encode('utf-


8'))
topic_name = 'topic1'
message = {'name':'toto'}
producer.send(topic_name, message)
producer.flush()
# Generate a sequence of messages now
for e in range(10):
data = {'number' : e}
producer.send(topic_name, value=data)
sleep(5)
23
Consumer en Python
from kafka import KafkaConsumer
topic_name = ‘topic1’
consumer = KafkaConsumer(topic_name, group_id='new-consumer-group-topic1', auto_offset_reset=
"earliest",bootstrap_servers= 'localhost:9092')
for msg in consumer:
print(msg)

Exercice:
Créer ’topic2’ et tester les producers et les consumers pour les 2 différents topics.

24
Producer en Python : String message
from kafka import KafkaProducer
producer = KafkaProducer(bootstrap_servers= 'localhost:9092', value_serializer=str.encode,
key_serializer=str.encode)
event_stream_key = 'product_list'
event_stream_value = 'product1 product2 product3 product1'
producer.send('topic1', key = event_stream_key, value = event_stream_value)
producer.flush()

25
Producer lisant des données à partir URL
import requests
from kafka import KafkaProducer
TOPIC_NAME = 'topic1'
producer = KafkaProducer(bootstrap_servers='localhost:9092', value_serializer=str.encode)
# Suppose you have a dataset called dataset.txt
response=requests.get(‘http:// …//dataset.txt',verify=False)
response.raise_for_status()

lines = response.text.split('\n')
for line in lines:
print(line)
producer.send(TOPIC_NAME, line)
producer.flush()

26

Vous aimerez peut-être aussi