SlideShare une entreprise Scribd logo
1  sur  46
Télécharger pour lire hors ligne
Introduction à Apache Pulsar
Bruno Bonnin
Meetup #ParisDataEng - 20 juin 2019
Directeur technique @ Zenika Nantes
Pulsar, un système de messagerie distribué
Né chez Yahoo ! pour compenser certaines
limites des solutions de l’époque
Pour des apps critiques comme Yahoo Mail,
Yahoo Finance, Yahoo Sports, etc
Open sourcé en 2016
Devenu Top Level Project de la
fondation Apache en sept 2018
Premier déploiement Q2 2015
Pulsar, un système de messagerie distribué
Données répliquées et
enregistrées sur disque
Garantie d’ordre des messages
Réplication géographique
des données
Multi-entité (tenant)
Fort débit / Faible latence
Garantie de livraison
Hautement scalable
Concepts & architecture
Des producteurs,
des consommateurs,
des topics, ...
Topic 1
Producteur Consommateur
Topic 2
Topic 3
Gestion des messages
Producteurs
Stockage des messages
Bookie 1
Bookie 2
Bookie 3
Bookie 4
Consommateurs
zkServer 1 zkServer 2 zkServer 3
Broker 1
Broker 2 Broker 3
lecture
stockage
meta-données
coordination clusters
stockage
meta-données
stockage des
données
Des brokers, des bookies, ...
écriture
Apache BookKeeper
Apache Zookeeper
Bookie 1
Une architecture scalable
Broker 1
Broker 2
Bookie 2 Bookie 3 Bookie 4
Gestion des
messages
Stockage des
messages
Producteurs Consommateurs
Broker 3
Bookie 5
Topic 1
Apache BookKeeper
Système de stockage scalable,
tolérant aux pannes et à faible latence
Conçu à l’origine comme une solution pour
la haute disponibilité du NameNode de
HDFS (WAL)
Avec Pulsar: stockage des données et des
offsets (cursors)
Broker
Topic 1
segment 2segment 1 segment x...
Bookie 1
segment 1
Une architecture hautement disponible
segment 1 segment 1
segment x
segment x
segment 2
segment 2
Bookie 2 Bookie 3
Un topic est constitué d’un
ensemble de segments (ledgers)
contenant les messages.
Les segments sont stockés et
répartis sur les bookies.segment x
segment 2
Bookie 4
Broker
Topic 1
segment 2segment 1 segment x...
Bookie 1
segment 1
Une architecture hautement disponible
segment 1 segment 1
segment x
segment x
segment 2
segment 2
Bookie 2 Bookie 3
Sur défection d’un bookie,
automatiquement, récupération des
segments manquants pour
respecter le facteur de réplication
segment x
segment 2
Bookie 4
segment x segment 1
Modes de
consommation
TopicProducteur Consommateur - A1
Exclusive subscription
Subscription A
Consommateur - A2Les tentatives de connexions de A2
échoueront
Topics et abonnements
TopicProducteur Consommateur - B1
Fail-over subscription
Subscription B
Consommateur - B2
Messages consommés par B2,
uniquement en cas d’échec de B1
Topics et abonnements
TopicProducteur Consommateur - C1Subscription C
Consommateur - C2
Les messages sont envoyés aux n consommateurs
(round robin) -> aucune garantie d’ordre !
Topics et abonnements
Shared subscription
TopicProducteur
Consommateur - B1
Consommateur - B2
Consommateur - A1
Consommateur - C1
Consommateur - C2
Exclusive
Subscription
Il peut y avoir plusieurs
abonnements sur un topic
Fail-over
Subscription
Shared
Subscription
Topics et abonnements
Les messages
Messages
Contenu d’un message:
- Tableau d’octets (peut être conforme à un schéma)
- Clé (optionnel)
- Ensemble de propriétés (optionnel)
- Nom du producteur
- Id de séquence (numéro d’ordre dans le topic, attribué
par le producteur)
- Timestamps
Cycle de vie des messages
Avec rétention message
acquitté
message
acquitté
Messages supprimés
(hors rétention)
Messages gardés car dans
la période de rétention
Non traités
message
acquitté
message
acquitté
message non
acquitté
message non
acquitté
Messages
supprimés
Messages supprimés
car au-delà du TTL
Non traités et
encore dans le TTL
message non
acquitté
message non
acquitté
message non
acquitté
message non
acquitté
message
acquitté
message
acquitté
Avec TTL
message
acquitté
message
acquitté
Messages supprimés Non traités
(sauvegardés dans BookKeeper)
message non
acquitté
message non
acquitté
message
acquitté
message
acquittéCas nominal
Développons avec
Pulsar
+ API WebSocket
// Création d’un client (idem producteur et conso)
PulsarClient client = PulsarClient.builder()
.serviceUrl("pulsar://myhostname:6650")
.build();
.authentication(...)
.connectionsPerBroker(5)
.ioThreads(10)
.keepAliveInterval(2, TimeUnit.MINUTES)
.maxNumberOfRejectedRequestPerConnection(5)
.operationTimeout(10, TimeUnit.SECONDS)
...
Producer<byte[]> producer = client.newProducer()
.topic("demo-topic")
.producerName("demo-producer")
.batchingMaxPublishDelay(10, TimeUnit.MILLISECONDS)
.sendTimeout(10, TimeUnit.SECONDS)
.blockIfQueueFull(true)
.create();
MessageId msgId =
producer.send("Hi Folks !".getBytes());
producer.sendAsync("Hi Folks !".getBytes())
.thenAccept(msgId -> {
System.out.printf("Msg %s successfully sent", msgId);
});
Consumer consumer = client.newConsumer()
.topic("demo-topic")
.subscriptionName("demo-exclusive-sub")
.subscriptionType(SubscriptionType.Exclusive)
.subscribe();
// Lecture à partir du premier message non acquitté
Message msg = consumer.receive(1000, TimeUnit.SECONDS);
System.out.printf("Message: %s, from %s with id=%sn",
new String(msg.getData()),
msg.getProducerName(),
msg.getMessageId());
consumer.acknowledge(msg);
Multi-tenancy
Multi-tenancy
Type de topic Nom de l’entité
(tenant)
Nom du
namespace
Nom du topic
persistent://public/default/demo-topic
Multi-tenancy
Pulsar Cluster
Products Ops Tenants
LogsOrders NamespacesStores
2To
Topics
Rétention: 10j
Topic-2 Topic-1Topic-1 Topic-1
persistent://Products/Stores/Topic-1
Geo-replication
Réplication géographique
Cluster A
Topic 1Producteur 1
Cluster B
Topic 1 Producteur 2
Cluster C
Topic 1Producteur 3
Les topics doivent appartenir à un
namespace global
Réplication asynchrone ou synchrone
(persistence local d’abord, puis envoi
aux autres clusters)
Possibilité pour un producteur de
restreindre la réplication à des
clusters donnés
Pulsar Functions
Pulsar Functions
Topic de sortieF
But: offrir un cadre d’exécution de traitements des
données sans utiliser d’environnement complémentaire
Topic d’entrée 1
Peut s’exécuter: dans les brokers, en local, et à terme,
dans des containers (déploiement dans Kubernetes)
Topic d’entrée 2
Topic des logs
import java.util.function.Function;
public class HiFunction
implements Function<String, String> {
@Override
public String apply(String input) {
return String.format("Hi %s!", input);
}
}
def process(input):
return "Hi %s!" % input
$ pulsar-admin functions create 
--jar hifct.jar --className HiFunction 
--fqfn talk/demo/hello 
--inputs persistent://talk/demo/input 
--output persistent://talk/demo/output
import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
import org.slf4j.Logger;
public class EnhancedHiFunction implements Function<String, String> {
@Override
public String process(String input, Context context) throws Exception {
Logger logger = context.getLogger();
String functionTenant = context.getTenant();
String functionNamespace = context.getNamespace();
String functionName = context.getFunctionName();
logger.info("Function {}/{}/{}: input={}",
functionTenant, functionNamespace, functionName, input);
return String.format("Hi %s!", input);
}
}
$ pulsar-admin functions create 
--jar enhancedhifct.jar 
--className EnhancedHiFunction 
--fqfn talk/demo/hello 
--inputs persistent://talk/demo/input 
--output persistent://talk/demo/output 
--log-topic persistent://talk/demo/logs
Démo
# Lancement de tous les composants
# broker, bookie, zookeeper (pour des tests/dev)
$ pulsar standalone
$ pulsar-admin clusters list
standalone
$ pulsar-admin clusters get standalone
{
"serviceUrl":"http://hostname:8080",
"brokerServiceUrl": "pulsar://hostname:6650"
}
# Producteur: 100 messages, 1msg/sec
$ pulsar-client produce 
-m "hello" 
-n 100 -r 1 
demo-topic
# Consommateur: 1msg/sec sans arrêt
$ pulsar-client consume 
-n 0 -r 1 
-s "demo-subs-exclusive" 
-t Exclusive 
demo-topic
# Multi-tenancy
# - création entité
$ pulsar-admin tenants create talk
# - création namespace
$ pulsar-admin namespaces create talk/demo
# - ajout de quotas
$ pulsar-admin namespaces set-retention 
--size 1T --time 2d talk/demo
Gestion des messages
Brokers
Stockage
Bookies
En résumé...
Traitements
Pulsar Functions
Connecteurs
Pulsar IO
Analytics
Pulsar SQL (Presto)
Stockage tiers
AWS Google Azure HDFS
Clients
Producteurs /
Consommateurs
Auto-promo 😛: https://github.com/bbonnin/pulsar-express
Conclusion
Il existe beaucoup de fonctions
intéressantes (plus ou moins matures):
- découplage broker et stockage
- gestion par segments
- tier-storage,
- geo-replication,
- Pulsar IO
- Pulsar Functions
- Schema registry,
- SQL,
- …
Environnement complet pour couvrir
vos besoins en termes de stream
processing
Aujourd’hui chez Yahoo !
- > 2 millions de topics
- > 100 milliards de messages / jour
- > 150 brokers
Plus d’infos: https://streaml.io/blog
Merci !
@_bruno_b_
Illustrations: https://undraw.co/illustrations

Contenu connexe

Tendances

Alphorm.com Formation Ansible : Le Guide Complet du Débutant
Alphorm.com Formation Ansible : Le Guide Complet du DébutantAlphorm.com Formation Ansible : Le Guide Complet du Débutant
Alphorm.com Formation Ansible : Le Guide Complet du DébutantAlphorm
 
L’ Administration des Réseaux en Pratique
L’ Administration des Réseaux en PratiqueL’ Administration des Réseaux en Pratique
L’ Administration des Réseaux en PratiqueAmadou Dia
 
Corrigé ccna1 chap10 couche application ccna cisco 5
Corrigé ccna1 chap10  couche application   ccna cisco 5Corrigé ccna1 chap10  couche application   ccna cisco 5
Corrigé ccna1 chap10 couche application ccna cisco 5abdoulaye camara
 
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)Support formation vidéo : Réussir la certification Linux LPIC-1 (2)
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)SmartnSkilled
 
58586406 ccna4-resume-19-pages
58586406 ccna4-resume-19-pages58586406 ccna4-resume-19-pages
58586406 ccna4-resume-19-pagesilbahi
 
COUPLAGE ENTRE Asterisk et OpenIMSCore
COUPLAGE ENTRE Asterisk et OpenIMSCoreCOUPLAGE ENTRE Asterisk et OpenIMSCore
COUPLAGE ENTRE Asterisk et OpenIMSCoreAbdou Lahad SYLLA
 
Programmation réseau en JAVA
Programmation réseau en JAVAProgrammation réseau en JAVA
Programmation réseau en JAVABachir Benyammi
 
07 02 création et maintenance de zones dns
07 02 création et maintenance de zones dns07 02 création et maintenance de zones dns
07 02 création et maintenance de zones dnsNoël
 

Tendances (13)

Alphorm.com Formation Ansible : Le Guide Complet du Débutant
Alphorm.com Formation Ansible : Le Guide Complet du DébutantAlphorm.com Formation Ansible : Le Guide Complet du Débutant
Alphorm.com Formation Ansible : Le Guide Complet du Débutant
 
Configuration dns
Configuration dnsConfiguration dns
Configuration dns
 
Sockets
SocketsSockets
Sockets
 
L’ Administration des Réseaux en Pratique
L’ Administration des Réseaux en PratiqueL’ Administration des Réseaux en Pratique
L’ Administration des Réseaux en Pratique
 
Corrigé ccna1 chap10 couche application ccna cisco 5
Corrigé ccna1 chap10  couche application   ccna cisco 5Corrigé ccna1 chap10  couche application   ccna cisco 5
Corrigé ccna1 chap10 couche application ccna cisco 5
 
Presentation
PresentationPresentation
Presentation
 
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)Support formation vidéo : Réussir la certification Linux LPIC-1 (2)
Support formation vidéo : Réussir la certification Linux LPIC-1 (2)
 
58586406 ccna4-resume-19-pages
58586406 ccna4-resume-19-pages58586406 ccna4-resume-19-pages
58586406 ccna4-resume-19-pages
 
COUPLAGE ENTRE Asterisk et OpenIMSCore
COUPLAGE ENTRE Asterisk et OpenIMSCoreCOUPLAGE ENTRE Asterisk et OpenIMSCore
COUPLAGE ENTRE Asterisk et OpenIMSCore
 
Rpc 4bypage
Rpc 4bypageRpc 4bypage
Rpc 4bypage
 
Programmation réseau en JAVA
Programmation réseau en JAVAProgrammation réseau en JAVA
Programmation réseau en JAVA
 
Guide complet linux
Guide complet linuxGuide complet linux
Guide complet linux
 
07 02 création et maintenance de zones dns
07 02 création et maintenance de zones dns07 02 création et maintenance de zones dns
07 02 création et maintenance de zones dns
 

Similaire à Introduction à Apache Pulsar

Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache PulsarBruno Bonnin
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureFlorian Hussonnois
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesXavier MARIN
 
TIBCO ESB BW5 - Integration With ActiveMQ 5
TIBCO ESB BW5 - Integration With ActiveMQ 5TIBCO ESB BW5 - Integration With ActiveMQ 5
TIBCO ESB BW5 - Integration With ActiveMQ 5Dieudonné MIAFFO ✅
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! frameworkBenoît Simard
 
Alfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendAlfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendMarc Dutoo
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantALTIC Altic
 
Quoi de neuf dans la version 11 Alexandria ?
Quoi de neuf dans la version 11 Alexandria ?Quoi de neuf dans la version 11 Alexandria ?
Quoi de neuf dans la version 11 Alexandria ?pprem
 
Comment travailler avec les logiciels Open Source
Comment travailler avec les logiciels Open SourceComment travailler avec les logiciels Open Source
Comment travailler avec les logiciels Open SourceChristian Charreyre
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Gregory Boissinot
 
Architecture de services web de type ressource
Architecture de services web de type ressourceArchitecture de services web de type ressource
Architecture de services web de type ressourceAntoine Pouch
 
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architecture
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architectureTartine - Pixelle, Refonte de l’ingestion et présentation de l’architecture
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architectureconfluent
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
Conference Informatique Embarquée Synergie-NTIC
Conference Informatique Embarquée Synergie-NTICConference Informatique Embarquée Synergie-NTIC
Conference Informatique Embarquée Synergie-NTICChristian Charreyre
 
découverte du langage python dans tous ses aspects
découverte du langage python dans tous ses aspectsdécouverte du langage python dans tous ses aspects
découverte du langage python dans tous ses aspectsThierry Gayet
 
LPIC1 10 01 logs
LPIC1 10 01 logsLPIC1 10 01 logs
LPIC1 10 01 logsNoël
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdfPatiento Del Mar
 
Symfony3 overview
Symfony3 overviewSymfony3 overview
Symfony3 overviewSymfonyMu
 

Similaire à Introduction à Apache Pulsar (20)

Stream processing avec Apache Pulsar
Stream processing avec Apache PulsarStream processing avec Apache Pulsar
Stream processing avec Apache Pulsar
 
Paris Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & ArchitectureParis Kafka Meetup - Concepts & Architecture
Paris Kafka Meetup - Concepts & Architecture
 
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseriesBreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
BreizhCamp 2019 - IoT et open source hardware pour la collecte de timeseries
 
TIBCO ESB BW5 - Integration With ActiveMQ 5
TIBCO ESB BW5 - Integration With ActiveMQ 5TIBCO ESB BW5 - Integration With ActiveMQ 5
TIBCO ESB BW5 - Integration With ActiveMQ 5
 
Formation Play! framework
Formation Play! frameworkFormation Play! framework
Formation Play! framework
 
Alfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & TalendAlfresco Meetup - ETL Connector & Talend
Alfresco Meetup - ETL Connector & Talend
 
Apache kafka big data track
Apache kafka   big data trackApache kafka   big data track
Apache kafka big data track
 
Apache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performantApache Kafka, Un système distribué de messagerie hautement performant
Apache Kafka, Un système distribué de messagerie hautement performant
 
Quoi de neuf dans la version 11 Alexandria ?
Quoi de neuf dans la version 11 Alexandria ?Quoi de neuf dans la version 11 Alexandria ?
Quoi de neuf dans la version 11 Alexandria ?
 
Comment travailler avec les logiciels Open Source
Comment travailler avec les logiciels Open SourceComment travailler avec les logiciels Open Source
Comment travailler avec les logiciels Open Source
 
Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013Spring Integration JUG SummerCamp 2013
Spring Integration JUG SummerCamp 2013
 
Architecture de services web de type ressource
Architecture de services web de type ressourceArchitecture de services web de type ressource
Architecture de services web de type ressource
 
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architecture
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architectureTartine - Pixelle, Refonte de l’ingestion et présentation de l’architecture
Tartine - Pixelle, Refonte de l’ingestion et présentation de l’architecture
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Conference Informatique Embarquée Synergie-NTIC
Conference Informatique Embarquée Synergie-NTICConference Informatique Embarquée Synergie-NTIC
Conference Informatique Embarquée Synergie-NTIC
 
découverte du langage python dans tous ses aspects
découverte du langage python dans tous ses aspectsdécouverte du langage python dans tous ses aspects
découverte du langage python dans tous ses aspects
 
LPIC1 10 01 logs
LPIC1 10 01 logsLPIC1 10 01 logs
LPIC1 10 01 logs
 
13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf13-Concurrence-Producteur-consommateur.pdf
13-Concurrence-Producteur-consommateur.pdf
 
8-socket.pdf
8-socket.pdf8-socket.pdf
8-socket.pdf
 
Symfony3 overview
Symfony3 overviewSymfony3 overview
Symfony3 overview
 

Plus de Paris Data Engineers !

Delta Lake OSS: Create reliable and performant Data Lake by Quentin Ambard
Delta Lake OSS: Create reliable and performant Data Lake by Quentin AmbardDelta Lake OSS: Create reliable and performant Data Lake by Quentin Ambard
Delta Lake OSS: Create reliable and performant Data Lake by Quentin AmbardParis Data Engineers !
 
REX : pourquoi et comment développer son propre scheduler
REX : pourquoi et comment développer son propre schedulerREX : pourquoi et comment développer son propre scheduler
REX : pourquoi et comment développer son propre schedulerParis Data Engineers !
 
Utilisation de MLflow pour le cycle de vie des projet Machine learning
Utilisation de MLflow pour le cycle de vie des projet Machine learningUtilisation de MLflow pour le cycle de vie des projet Machine learning
Utilisation de MLflow pour le cycle de vie des projet Machine learningParis Data Engineers !
 
10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in productionParis Data Engineers !
 
Change Data Capture with Data Collector @OVH
Change Data Capture with Data Collector @OVHChange Data Capture with Data Collector @OVH
Change Data Capture with Data Collector @OVHParis Data Engineers !
 
Building highly reliable data pipeline @datadog par Quentin François
Building highly reliable data pipeline @datadog par Quentin FrançoisBuilding highly reliable data pipeline @datadog par Quentin François
Building highly reliable data pipeline @datadog par Quentin FrançoisParis Data Engineers !
 
Scala pour le Data Engineering par Jonathan Winandy
Scala pour le Data Engineering par Jonathan WinandyScala pour le Data Engineering par Jonathan Winandy
Scala pour le Data Engineering par Jonathan WinandyParis Data Engineers !
 

Plus de Paris Data Engineers ! (11)

Spark tools by Jonathan Winandy
Spark tools by Jonathan WinandySpark tools by Jonathan Winandy
Spark tools by Jonathan Winandy
 
Delta Lake OSS: Create reliable and performant Data Lake by Quentin Ambard
Delta Lake OSS: Create reliable and performant Data Lake by Quentin AmbardDelta Lake OSS: Create reliable and performant Data Lake by Quentin Ambard
Delta Lake OSS: Create reliable and performant Data Lake by Quentin Ambard
 
SCIO : Apache Beam API
SCIO : Apache Beam APISCIO : Apache Beam API
SCIO : Apache Beam API
 
Apache Beam de A à Z
 Apache Beam de A à Z Apache Beam de A à Z
Apache Beam de A à Z
 
REX : pourquoi et comment développer son propre scheduler
REX : pourquoi et comment développer son propre schedulerREX : pourquoi et comment développer son propre scheduler
REX : pourquoi et comment développer son propre scheduler
 
Deeplearning in production
Deeplearning in productionDeeplearning in production
Deeplearning in production
 
Utilisation de MLflow pour le cycle de vie des projet Machine learning
Utilisation de MLflow pour le cycle de vie des projet Machine learningUtilisation de MLflow pour le cycle de vie des projet Machine learning
Utilisation de MLflow pour le cycle de vie des projet Machine learning
 
10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production10 things i wish i'd known before using spark in production
10 things i wish i'd known before using spark in production
 
Change Data Capture with Data Collector @OVH
Change Data Capture with Data Collector @OVHChange Data Capture with Data Collector @OVH
Change Data Capture with Data Collector @OVH
 
Building highly reliable data pipeline @datadog par Quentin François
Building highly reliable data pipeline @datadog par Quentin FrançoisBuilding highly reliable data pipeline @datadog par Quentin François
Building highly reliable data pipeline @datadog par Quentin François
 
Scala pour le Data Engineering par Jonathan Winandy
Scala pour le Data Engineering par Jonathan WinandyScala pour le Data Engineering par Jonathan Winandy
Scala pour le Data Engineering par Jonathan Winandy
 

Introduction à Apache Pulsar

  • 1. Introduction à Apache Pulsar Bruno Bonnin Meetup #ParisDataEng - 20 juin 2019
  • 2. Directeur technique @ Zenika Nantes
  • 3.
  • 4. Pulsar, un système de messagerie distribué Né chez Yahoo ! pour compenser certaines limites des solutions de l’époque Pour des apps critiques comme Yahoo Mail, Yahoo Finance, Yahoo Sports, etc Open sourcé en 2016 Devenu Top Level Project de la fondation Apache en sept 2018 Premier déploiement Q2 2015
  • 5. Pulsar, un système de messagerie distribué Données répliquées et enregistrées sur disque Garantie d’ordre des messages Réplication géographique des données Multi-entité (tenant) Fort débit / Faible latence Garantie de livraison Hautement scalable
  • 7. Des producteurs, des consommateurs, des topics, ... Topic 1 Producteur Consommateur Topic 2 Topic 3
  • 8. Gestion des messages Producteurs Stockage des messages Bookie 1 Bookie 2 Bookie 3 Bookie 4 Consommateurs zkServer 1 zkServer 2 zkServer 3 Broker 1 Broker 2 Broker 3 lecture stockage meta-données coordination clusters stockage meta-données stockage des données Des brokers, des bookies, ... écriture Apache BookKeeper Apache Zookeeper
  • 9. Bookie 1 Une architecture scalable Broker 1 Broker 2 Bookie 2 Bookie 3 Bookie 4 Gestion des messages Stockage des messages Producteurs Consommateurs Broker 3 Bookie 5 Topic 1
  • 10.
  • 11. Apache BookKeeper Système de stockage scalable, tolérant aux pannes et à faible latence Conçu à l’origine comme une solution pour la haute disponibilité du NameNode de HDFS (WAL) Avec Pulsar: stockage des données et des offsets (cursors)
  • 12. Broker Topic 1 segment 2segment 1 segment x... Bookie 1 segment 1 Une architecture hautement disponible segment 1 segment 1 segment x segment x segment 2 segment 2 Bookie 2 Bookie 3 Un topic est constitué d’un ensemble de segments (ledgers) contenant les messages. Les segments sont stockés et répartis sur les bookies.segment x segment 2 Bookie 4
  • 13. Broker Topic 1 segment 2segment 1 segment x... Bookie 1 segment 1 Une architecture hautement disponible segment 1 segment 1 segment x segment x segment 2 segment 2 Bookie 2 Bookie 3 Sur défection d’un bookie, automatiquement, récupération des segments manquants pour respecter le facteur de réplication segment x segment 2 Bookie 4 segment x segment 1
  • 15. TopicProducteur Consommateur - A1 Exclusive subscription Subscription A Consommateur - A2Les tentatives de connexions de A2 échoueront Topics et abonnements
  • 16. TopicProducteur Consommateur - B1 Fail-over subscription Subscription B Consommateur - B2 Messages consommés par B2, uniquement en cas d’échec de B1 Topics et abonnements
  • 17. TopicProducteur Consommateur - C1Subscription C Consommateur - C2 Les messages sont envoyés aux n consommateurs (round robin) -> aucune garantie d’ordre ! Topics et abonnements Shared subscription
  • 18. TopicProducteur Consommateur - B1 Consommateur - B2 Consommateur - A1 Consommateur - C1 Consommateur - C2 Exclusive Subscription Il peut y avoir plusieurs abonnements sur un topic Fail-over Subscription Shared Subscription Topics et abonnements
  • 20. Messages Contenu d’un message: - Tableau d’octets (peut être conforme à un schéma) - Clé (optionnel) - Ensemble de propriétés (optionnel) - Nom du producteur - Id de séquence (numéro d’ordre dans le topic, attribué par le producteur) - Timestamps
  • 21. Cycle de vie des messages Avec rétention message acquitté message acquitté Messages supprimés (hors rétention) Messages gardés car dans la période de rétention Non traités message acquitté message acquitté message non acquitté message non acquitté Messages supprimés Messages supprimés car au-delà du TTL Non traités et encore dans le TTL message non acquitté message non acquitté message non acquitté message non acquitté message acquitté message acquitté Avec TTL message acquitté message acquitté Messages supprimés Non traités (sauvegardés dans BookKeeper) message non acquitté message non acquitté message acquitté message acquittéCas nominal
  • 24. // Création d’un client (idem producteur et conso) PulsarClient client = PulsarClient.builder() .serviceUrl("pulsar://myhostname:6650") .build(); .authentication(...) .connectionsPerBroker(5) .ioThreads(10) .keepAliveInterval(2, TimeUnit.MINUTES) .maxNumberOfRejectedRequestPerConnection(5) .operationTimeout(10, TimeUnit.SECONDS) ...
  • 25. Producer<byte[]> producer = client.newProducer() .topic("demo-topic") .producerName("demo-producer") .batchingMaxPublishDelay(10, TimeUnit.MILLISECONDS) .sendTimeout(10, TimeUnit.SECONDS) .blockIfQueueFull(true) .create(); MessageId msgId = producer.send("Hi Folks !".getBytes()); producer.sendAsync("Hi Folks !".getBytes()) .thenAccept(msgId -> { System.out.printf("Msg %s successfully sent", msgId); });
  • 26. Consumer consumer = client.newConsumer() .topic("demo-topic") .subscriptionName("demo-exclusive-sub") .subscriptionType(SubscriptionType.Exclusive) .subscribe(); // Lecture à partir du premier message non acquitté Message msg = consumer.receive(1000, TimeUnit.SECONDS); System.out.printf("Message: %s, from %s with id=%sn", new String(msg.getData()), msg.getProducerName(), msg.getMessageId()); consumer.acknowledge(msg);
  • 28. Multi-tenancy Type de topic Nom de l’entité (tenant) Nom du namespace Nom du topic persistent://public/default/demo-topic
  • 29. Multi-tenancy Pulsar Cluster Products Ops Tenants LogsOrders NamespacesStores 2To Topics Rétention: 10j Topic-2 Topic-1Topic-1 Topic-1 persistent://Products/Stores/Topic-1
  • 31. Réplication géographique Cluster A Topic 1Producteur 1 Cluster B Topic 1 Producteur 2 Cluster C Topic 1Producteur 3 Les topics doivent appartenir à un namespace global Réplication asynchrone ou synchrone (persistence local d’abord, puis envoi aux autres clusters) Possibilité pour un producteur de restreindre la réplication à des clusters donnés
  • 33. Pulsar Functions Topic de sortieF But: offrir un cadre d’exécution de traitements des données sans utiliser d’environnement complémentaire Topic d’entrée 1 Peut s’exécuter: dans les brokers, en local, et à terme, dans des containers (déploiement dans Kubernetes) Topic d’entrée 2 Topic des logs
  • 34. import java.util.function.Function; public class HiFunction implements Function<String, String> { @Override public String apply(String input) { return String.format("Hi %s!", input); } }
  • 36. $ pulsar-admin functions create --jar hifct.jar --className HiFunction --fqfn talk/demo/hello --inputs persistent://talk/demo/input --output persistent://talk/demo/output
  • 37. import org.apache.pulsar.functions.api.Context; import org.apache.pulsar.functions.api.Function; import org.slf4j.Logger; public class EnhancedHiFunction implements Function<String, String> { @Override public String process(String input, Context context) throws Exception { Logger logger = context.getLogger(); String functionTenant = context.getTenant(); String functionNamespace = context.getNamespace(); String functionName = context.getFunctionName(); logger.info("Function {}/{}/{}: input={}", functionTenant, functionNamespace, functionName, input); return String.format("Hi %s!", input); } }
  • 38. $ pulsar-admin functions create --jar enhancedhifct.jar --className EnhancedHiFunction --fqfn talk/demo/hello --inputs persistent://talk/demo/input --output persistent://talk/demo/output --log-topic persistent://talk/demo/logs
  • 39. Démo
  • 40. # Lancement de tous les composants # broker, bookie, zookeeper (pour des tests/dev) $ pulsar standalone $ pulsar-admin clusters list standalone $ pulsar-admin clusters get standalone { "serviceUrl":"http://hostname:8080", "brokerServiceUrl": "pulsar://hostname:6650" }
  • 41. # Producteur: 100 messages, 1msg/sec $ pulsar-client produce -m "hello" -n 100 -r 1 demo-topic # Consommateur: 1msg/sec sans arrêt $ pulsar-client consume -n 0 -r 1 -s "demo-subs-exclusive" -t Exclusive demo-topic
  • 42. # Multi-tenancy # - création entité $ pulsar-admin tenants create talk # - création namespace $ pulsar-admin namespaces create talk/demo # - ajout de quotas $ pulsar-admin namespaces set-retention --size 1T --time 2d talk/demo
  • 43. Gestion des messages Brokers Stockage Bookies En résumé... Traitements Pulsar Functions Connecteurs Pulsar IO Analytics Pulsar SQL (Presto) Stockage tiers AWS Google Azure HDFS Clients Producteurs / Consommateurs
  • 45. Conclusion Il existe beaucoup de fonctions intéressantes (plus ou moins matures): - découplage broker et stockage - gestion par segments - tier-storage, - geo-replication, - Pulsar IO - Pulsar Functions - Schema registry, - SQL, - … Environnement complet pour couvrir vos besoins en termes de stream processing Aujourd’hui chez Yahoo ! - > 2 millions de topics - > 100 milliards de messages / jour - > 150 brokers Plus d’infos: https://streaml.io/blog