SlideShare une entreprise Scribd logo
Stream processing
et SQL
Bruno Bonnin
@_bruno_b_
#DevoxxMA
#DevoxxMA @_bruno_b_
About me
https://github.com/bbonnin
#DevoxxMA @_bruno_b_
Saagie
#DevoxxMA @_bruno_b_
Streams
Sources:
● IoT
● Monitoring
● Click streams
● Finance
● Jeux en ligne
● ...
Flot continue et sans fin de
données
#DevoxxMA @_bruno_b_
Pourquoi SQL in 2017 ?
C’est un standard !
Largement adopté par tous (même si on peut/veut l’éviter…)
○ Développeur
○ Architecte data
○ Data scientist
○ …
Les streams sont des données comme les autres !
Alors pourquoi ne pas utiliser SQL pour les requêter ?
#DevoxxMA @_bruno_b_
SQL vs. Stream processing
Relational Algebra / SQL Stream Processing
Relations (or tables) are bounded (multi-)sets of
tuples.
A stream is an infinite sequences of tuples.
A query that is executed on batch data (e.g., a
table in a relational database) has access to the
complete input data.
A streaming query cannot access all data
when is started and has to "wait" for data
to be streamed in.
A batch query terminates after it produced a
fixed sized result.
A streaming query continuously updates
its result based on the received records
and never completes.
Source: https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/table/streaming.html
#DevoxxMA @_bruno_b_
SQL et Stream processing
Apache Calcite
#DevoxxMA @_bruno_b_
Apache Calcite
● Catalogue des metadatas
● Parsing SQL
● Validation des requêtes SQL
● Optimisation des requêtes SQL
○ Plan d’exécution
● Adaptateurs pour différentes sources de données (MongoDB, Elastic, …)
Pour les streams: définition d’un minimum de mots-clés et de
fonctions pour les requêter
L’exécution des requêtes est à la charge du système utilisant Calcite
#DevoxxMA @_bruno_b_
THE keyword !
SELECT STREAM * FROM weblogs;
weblogs est un stream
Requêtes ne se terminant pas
Sur quelles données ? de maintenant à ...
SELECT STREAM url, status_code, nb_bytes FROM weblogs;
SELECT STREAM url, nb_bytes FROM weblogs WHERE status = 500;
#DevoxxMA @_bruno_b_
Jointure avec une table
Et si la table bouge ?
Une solution: stocker
l’historique dans la table
pour l’utiliser dans la
requête
SELECT STREAM c.id_pizza, p.prix
FROM commandes_pizza AS c
JOIN pizzas AS p
ON c.id_pizza = p.id_pizza;
Simple pour une table
qui ne change pas
SELECT STREAM c.id_pizza, p.prix
FROM commandes_pizza AS c
JOIN pizzas AS p
ON c.id_pizza = p.id_pizza
AND c.rowtime
BETWEEN p.dateDebut AND p.dateFin;
#DevoxxMA @_bruno_b_
Windowing
sum() 3 12 13 8
Tumbling window
SELECT STREAM
TUMBLE_END(rowtime, INTERVAL '10' SECOND),
url,
SUM(nb_bytes) AS total_bytes
FROM weblogs
GROUP BY TUMBLE(rowtime, INTERVAL '10' SECOND), url;
1
2 3
5
4 6
7
8
t
0 10 20 30 40
#DevoxxMA @_bruno_b_
Windowing
Hopping window
SELECT STREAM
HOP_END(rowtime, INTERVAL '10' SECOND , INTERVAL '15' SECOND ) AS rowtime,
SUM(nb_bytes) AS total_bytes
FROM weblogs
GROUP BY HOP(rowtime, INTERVAL '5' SECOND , INTERVAL '10' SECOND );
sum() 6 18 21 17
1
2 3
5
4
6
7
8
t
0 10 20 30 40
9
#DevoxxMA @_bruno_b_
Démo
https://github.com/bbonnin/devoxxma2017-streaming-sql
#DevoxxMA @_bruno_b_
Que préférez-vous ?
final Table table = tableEnv
.fromDataStream( dataset,
"ts, ip_address, url, status, nb_bytes, rowtime.rowtime" )
.window(
Tumble
.over("10.second").on("rowtime").as("tenSecWindow" ))
.groupBy("tenSecWindow, url" )
.select(
"url, tenSecWindow.end as time, url.count as nb_requests" );
tableEnv.toAppendStream(table , Row.class).print();
execEnv.execute();
#DevoxxMA @_bruno_b_
Que préférez-vous ?
tableEnv.registerDataStream( "weblogs", dataset,
"ts, ip_address, url, status, nb_bytes, rowtime.rowtime" );
final String query =
"SELECT url, " +
" TUMBLE_END(rowtime, INTERVAL '10' SECOND), " +
" COUNT(*) AS nb_requests " +
"FROM weblogs " +
"GROUP BY TUMBLE(rowtime, INTERVAL '10' SECOND), url" ;
final Table table = tableEnv.sql(query);
tableEnv.toAppendStream(table , Row.class).print();
execEnv.execute();
#DevoxxMA @_bruno_b_
Conclusion
La partie stream de Calcite offre beaucoup d’autres possibilités
comme les jointures entre streams, update/delete/insert, ...
● Détails: https://calcite.apache.org/docs/stream.html
Tout n’est pas implémenté !
Mais le but est de faire avancer le standard SQL.
Le SQL permet de réunir tous les acteurs autour d’un outil
commun pour traiter les données, streams ou pas !
Merci !https://github.com/bbonnin/devoxxma2017-streaming-sql
#DevoxxMA

Contenu connexe

PDF
Stream processing et SQL
PDF
Stream processing et SQL
PDF
Stream processing et SQL
PDF
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
PPTX
Mode offline et Synchronisation avec Windows Phone et Windows 8.1
PPTX
Techdays2014 mode offline et synchronisation avec windows phone et windows 8....
DOCX
PDF
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...
Stream processing et SQL
Stream processing et SQL
Stream processing et SQL
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Mode offline et Synchronisation avec Windows Phone et Windows 8.1
Techdays2014 mode offline et synchronisation avec windows phone et windows 8....
#OSSPARIS19 - Stream processing : de la base de données classique au streamin...

Similaire à Stream processing et SQL (20)

PDF
Cassandra techniques de modelisation avancee
PDF
FIP_pl-sql.pdf
PDF
cm-bd.pdf
PDF
Datastudio : du basique au connecteur TEKNSEO 2018
PDF
PPTX
Les nouveautés SQL Server 2016
PDF
cours sur les bases de données distribuées
PPT
Projet BI - 2 - Conception base de données
PDF
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
PDF
Importer 500 millions de données de MySQL vers Neo4j
PDF
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
PDF
Core web vitals pour unifier UX et SEO - Stephane Rios - SEO Camp'us paris 2020
PDF
Chapitre 3 - Généralités sur le langage C.pdf
PDF
Core Web Vitals, les indicateurs de vitesse qui réconcilient UX et SEO
PDF
INFORMATIQUE DÉCISIONNELLE OPÉRATIONNELLE
PDF
AD Cours 2- JDBC .pdf comment connecter java au base de donnee
PPTX
Monitoring applicatif : Pourquoi et comment ?
PDF
Tout ce que le getting started mongodb ne vous dira pas
PDF
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
PPTX
Jss 2015 - Microsoft Stream analytics
Cassandra techniques de modelisation avancee
FIP_pl-sql.pdf
cm-bd.pdf
Datastudio : du basique au connecteur TEKNSEO 2018
Les nouveautés SQL Server 2016
cours sur les bases de données distribuées
Projet BI - 2 - Conception base de données
[JDLL 2018] Templer, Git, Bootstrap, PHP : des outils libres pour concevoir l...
Importer 500 millions de données de MySQL vers Neo4j
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Core web vitals pour unifier UX et SEO - Stephane Rios - SEO Camp'us paris 2020
Chapitre 3 - Généralités sur le langage C.pdf
Core Web Vitals, les indicateurs de vitesse qui réconcilient UX et SEO
INFORMATIQUE DÉCISIONNELLE OPÉRATIONNELLE
AD Cours 2- JDBC .pdf comment connecter java au base de donnee
Monitoring applicatif : Pourquoi et comment ?
Tout ce que le getting started mongodb ne vous dira pas
PostgreSQL, plus qu'une base de données, une plateforme aux multiples usages
Jss 2015 - Microsoft Stream analytics
Publicité

Plus de Bruno Bonnin (13)

PDF
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
PDF
Stream processing avec Apache Pulsar
PDF
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
PDF
A la découverte de vue.js
PDF
Vue.js, même un dev java peut en faire !
PDF
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
PDF
Vue, j’avais pas vu !
PDF
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
PDF
Big Data Viz (and much more!) with Apache Zeppelin
PDF
Explorez vos données avec apache zeppelin
PDF
Tout ce que le getting started MongoDB ne vous dira pas
PPTX
MUG Nantes - MongoDB et son connecteur pour hadoop
PDF
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
[Devoxx MA 2023] R2DBC = R2D2 + JDBC (enfin presque...)
Stream processing avec Apache Pulsar
Jug summer camp 2017 - Vue.js, même un dev java peut en faire !
A la découverte de vue.js
Vue.js, même un dev java peut en faire !
Explorez vos données présentes dans MongoDB avec Apache Zeppelin
Vue, j’avais pas vu !
Apache Spark avec NodeJS ? Oui, c'est possible avec EclairJS !
Big Data Viz (and much more!) with Apache Zeppelin
Explorez vos données avec apache zeppelin
Tout ce que le getting started MongoDB ne vous dira pas
MUG Nantes - MongoDB et son connecteur pour hadoop
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Publicité

Stream processing et SQL

  • 1. Stream processing et SQL Bruno Bonnin @_bruno_b_ #DevoxxMA
  • 4. #DevoxxMA @_bruno_b_ Streams Sources: ● IoT ● Monitoring ● Click streams ● Finance ● Jeux en ligne ● ... Flot continue et sans fin de données
  • 5. #DevoxxMA @_bruno_b_ Pourquoi SQL in 2017 ? C’est un standard ! Largement adopté par tous (même si on peut/veut l’éviter…) ○ Développeur ○ Architecte data ○ Data scientist ○ … Les streams sont des données comme les autres ! Alors pourquoi ne pas utiliser SQL pour les requêter ?
  • 6. #DevoxxMA @_bruno_b_ SQL vs. Stream processing Relational Algebra / SQL Stream Processing Relations (or tables) are bounded (multi-)sets of tuples. A stream is an infinite sequences of tuples. A query that is executed on batch data (e.g., a table in a relational database) has access to the complete input data. A streaming query cannot access all data when is started and has to "wait" for data to be streamed in. A batch query terminates after it produced a fixed sized result. A streaming query continuously updates its result based on the received records and never completes. Source: https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/table/streaming.html
  • 7. #DevoxxMA @_bruno_b_ SQL et Stream processing Apache Calcite
  • 8. #DevoxxMA @_bruno_b_ Apache Calcite ● Catalogue des metadatas ● Parsing SQL ● Validation des requêtes SQL ● Optimisation des requêtes SQL ○ Plan d’exécution ● Adaptateurs pour différentes sources de données (MongoDB, Elastic, …) Pour les streams: définition d’un minimum de mots-clés et de fonctions pour les requêter L’exécution des requêtes est à la charge du système utilisant Calcite
  • 9. #DevoxxMA @_bruno_b_ THE keyword ! SELECT STREAM * FROM weblogs; weblogs est un stream Requêtes ne se terminant pas Sur quelles données ? de maintenant à ... SELECT STREAM url, status_code, nb_bytes FROM weblogs; SELECT STREAM url, nb_bytes FROM weblogs WHERE status = 500;
  • 10. #DevoxxMA @_bruno_b_ Jointure avec une table Et si la table bouge ? Une solution: stocker l’historique dans la table pour l’utiliser dans la requête SELECT STREAM c.id_pizza, p.prix FROM commandes_pizza AS c JOIN pizzas AS p ON c.id_pizza = p.id_pizza; Simple pour une table qui ne change pas SELECT STREAM c.id_pizza, p.prix FROM commandes_pizza AS c JOIN pizzas AS p ON c.id_pizza = p.id_pizza AND c.rowtime BETWEEN p.dateDebut AND p.dateFin;
  • 11. #DevoxxMA @_bruno_b_ Windowing sum() 3 12 13 8 Tumbling window SELECT STREAM TUMBLE_END(rowtime, INTERVAL '10' SECOND), url, SUM(nb_bytes) AS total_bytes FROM weblogs GROUP BY TUMBLE(rowtime, INTERVAL '10' SECOND), url; 1 2 3 5 4 6 7 8 t 0 10 20 30 40
  • 12. #DevoxxMA @_bruno_b_ Windowing Hopping window SELECT STREAM HOP_END(rowtime, INTERVAL '10' SECOND , INTERVAL '15' SECOND ) AS rowtime, SUM(nb_bytes) AS total_bytes FROM weblogs GROUP BY HOP(rowtime, INTERVAL '5' SECOND , INTERVAL '10' SECOND ); sum() 6 18 21 17 1 2 3 5 4 6 7 8 t 0 10 20 30 40 9
  • 14. #DevoxxMA @_bruno_b_ Que préférez-vous ? final Table table = tableEnv .fromDataStream( dataset, "ts, ip_address, url, status, nb_bytes, rowtime.rowtime" ) .window( Tumble .over("10.second").on("rowtime").as("tenSecWindow" )) .groupBy("tenSecWindow, url" ) .select( "url, tenSecWindow.end as time, url.count as nb_requests" ); tableEnv.toAppendStream(table , Row.class).print(); execEnv.execute();
  • 15. #DevoxxMA @_bruno_b_ Que préférez-vous ? tableEnv.registerDataStream( "weblogs", dataset, "ts, ip_address, url, status, nb_bytes, rowtime.rowtime" ); final String query = "SELECT url, " + " TUMBLE_END(rowtime, INTERVAL '10' SECOND), " + " COUNT(*) AS nb_requests " + "FROM weblogs " + "GROUP BY TUMBLE(rowtime, INTERVAL '10' SECOND), url" ; final Table table = tableEnv.sql(query); tableEnv.toAppendStream(table , Row.class).print(); execEnv.execute();
  • 16. #DevoxxMA @_bruno_b_ Conclusion La partie stream de Calcite offre beaucoup d’autres possibilités comme les jointures entre streams, update/delete/insert, ... ● Détails: https://calcite.apache.org/docs/stream.html Tout n’est pas implémenté ! Mais le but est de faire avancer le standard SQL. Le SQL permet de réunir tous les acteurs autour d’un outil commun pour traiter les données, streams ou pas !