{"id":1400,"date":"2022-01-20T12:01:53","date_gmt":"2022-01-20T11:01:53","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1400"},"modified":"2023-04-05T17:02:55","modified_gmt":"2023-04-05T15:02:55","slug":"jai-enfin-pris-le-temps-de-tester-apache-pinot","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/jai-enfin-pris-le-temps-de-tester-apache-pinot\/","title":{"rendered":"J&rsquo;ai enfin pris le temps de tester Apache Pinot"},"content":{"rendered":"<p>Cela faisait tr\u00e8s longtemps que j&rsquo;avais envie de tester Apache Pinot et j&rsquo;ai enfin pris le temps de le faire !<\/p>\n<h2>Tout d&rsquo;abord, une rapide description de Pinot<\/h2>\n<p>Pinot est un datastore OLAP (OnLine Analytical Processing) distribu\u00e9e et temps r\u00e9el, sp\u00e9cialement con\u00e7u pour fournir des analyses \u00e0 tr\u00e8s faible latence, m\u00eame \u00e0 un d\u00e9bit extr\u00eamement \u00e9lev\u00e9. Il peut ing\u00e9rer des donn\u00e9es directement \u00e0 partir de sources de donn\u00e9es en continu (stream) ou de sources de donn\u00e9es par lots (batch).\nAu c\u0153ur du syst\u00e8me se trouve un stockage en colonne, avec plusieurs techniques d&rsquo;indexation et de pr\u00e9-agr\u00e9gation intelligentes pour une faible latence.\nPinot a \u00e9t\u00e9 construit par des ing\u00e9nieurs de LinkedIn et Uber et est con\u00e7u pour scaler up ou out sans limites. Les performances restent toujours constantes en fonction de la taille de votre cluster et d&rsquo;un seuil de requ\u00eates par seconde (RPS) attendu.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Pinot-architecture.jpg?resize=606%2C475&#038;ssl=1\" alt=\"\" width=\"606\" height=\"475\" class=\"alignnone size-full wp-image-1407\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Pinot-architecture.jpg?w=606&amp;ssl=1 606w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Pinot-architecture.jpg?resize=300%2C235&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/Pinot-architecture.jpg?resize=344%2C270&amp;ssl=1 344w\" sizes=\"auto, (max-width: 606px) 100vw, 606px\" \/>\n<p>Un cluster Pinot est constitu\u00e9 des \u00e9l\u00e9ments suivants :<\/p>\n<ul><li><strong>Pinot Controller<\/strong> : constitu\u00e9 de Apache Helix (cluster management) et Apache Zookeeper (coordination), c&rsquo;est le composant central de Pinot qui va prendre en charge l&rsquo;orchestration du cluster, la r\u00e9plication, et la gestion de l&rsquo;\u00e9tat des diff\u00e9rents composants du cluster.<\/li>\n\n<li><strong>Pinot Broker<\/strong> : re\u00e7oit les requ\u00eates des clients et achemine leurs ex\u00e9cutions vers un ou plusieurs serveurs Pinot avant de renvoyer une r\u00e9ponse consolid\u00e9e.<\/li>\n\n<li><strong>Pinot Server<\/strong> : stocke les segments (une partie d&rsquo;une table) et ex\u00e9cute les requ\u00eates. Un serveur peut \u00eatre soit <strong>real-time<\/strong> (en cas de donn\u00e9es stream\u00e9e) soit <strong>offline<\/strong> (en cas de donn\u00e9es envoy\u00e9es par batch et immuable).<\/li>\n\n<li><strong>Pinot Minion<\/strong> : composant optionnel permettant d&rsquo;ex\u00e9cuter des t\u00e2ches en t\u00e2che de fond au sein du cluster, par exemple pour de la purge de donn\u00e9es.<\/li>\n<\/ul>\n<h2>Premier lancement<\/h2>\n<p>Commen\u00e7ons donc pas le commencement : lancer Pinot localement ! Apache Pinot \u00e9tant un syst\u00e8me distribu\u00e9 \u00e0 plusieurs composants (Zookeeper, Pinot Controller, Pinot Broker, Pinot Server), je d\u00e9cide donc de passer par une image Docker tout en un pour le tester localement, \u00e7a me semble le plus simple.<\/p>\n<p>En me basant sur le guide <a href=\"https:\/\/docs.pinot.apache.org\/basics\/getting-started\/running-pinot-in-docker\" rel=\"noopener\" target=\"_blank\">Getting Started<\/a>, je lance Pinot avec cette commande Docker qui permet de le d\u00e9marrer avec un jeu de donn\u00e9es de statistique de Baseball pr\u00e9-import\u00e9. Le conteneur, apr\u00e8s avoir instanci\u00e9 les composants et importer les donn\u00e9es, va ensuite ex\u00e9cuter un ensemble de requ\u00eates et afficher leurs r\u00e9sultats dans les logs.<\/p>\n<pre>\ndocker run \\\n    -p 9000:9000 \\\n    apachepinot\/pinot:0.9.3 QuickStart \\\n    -type batch\n<\/pre>\n<p>Apr\u00e8s d\u00e9marrage de Pinot et import du jeu de donn\u00e9es, je peux utiliser la console Pinot (disponible sur le port 9000 par d\u00e9faut) pour acc\u00e9der au cluster.<\/p>\n<p>Celle-ci permet de visualiser l&rsquo;\u00e9tat du cluster via l&rsquo;onglet <strong>Cluster Management<\/strong>.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=640%2C339&#038;ssl=1\" alt=\"\" width=\"640\" height=\"339\" class=\"alignnone size-large wp-image-1408\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=1024%2C542&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=300%2C159&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=768%2C406&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=1536%2C813&amp;ssl=1 1536w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?resize=510%2C270&amp;ssl=1 510w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?w=1852&amp;ssl=1 1852w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-cluster-view.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Et de lancer des requ\u00eates via l&rsquo;onglet <strong>Query Console<\/strong>. J&rsquo;y fais un petit <code>count(*)<\/code> de la table <strong>baseballStats<\/strong> cr\u00e9\u00e9, la requ\u00eate s&rsquo;effectue quasiment imm\u00e9diatement (quelques millisecondes) mais en m\u00eame temps il n&rsquo;y a que 97889 lignes donc c&rsquo;est normal.<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=640%2C274&#038;ssl=1\" alt=\"\" width=\"640\" height=\"274\" class=\"alignnone size-large wp-image-1409\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=1024%2C438&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=300%2C128&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=768%2C329&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=1536%2C657&amp;ssl=1 1536w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?resize=604%2C258&amp;ssl=1 604w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?w=1828&amp;ssl=1 1828w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-first-query.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<h2>Analyse des \u00e9missions de carbone europ\u00e9enne<\/h2>\n<p>Bon, tout \u00e7a c&rsquo;est joli, mais pour d\u00e9passer le Hello World et vraiment tester Pinot, il va me falloir un jeu de donn\u00e9es un peu plus volumineux avec lequel faire joujou.<\/p>\n<p>La commission europ\u00e9enne mets \u00e0 disposition un ensemble de donn\u00e9e en Open Data, c&rsquo;est le moment d&rsquo;en profiter.<\/p>\n<p>Je jette mon d\u00e9volu sur un jeu de donn\u00e9es sur les \u00e9missions de gaz \u00e0 effets de serre dans la zone euro (vous pouvez le trouver sur <a href=\"https:\/\/ec.europa.eu\/eurostat\/web\/climate-change\/data\/database\" rel=\"noopener\" target=\"_blank\">cette page<\/a>) : <a href=\"https:\/\/ec.europa.eu\/eurostat\/estat-navtree-portlet-prod\/BulkDownloadListing?file=data\/env_ac_ainah_r2.tsv.gz\" rel=\"noopener\" target=\"_blank\">Air emissions accounts by NACE Rev. 2 activity<\/a> de 4 millions de points de donn\u00e9es.<\/p>\n<p>Voici la description du jeu de donn\u00e9es : <em>This data set reports the emissions of greenhouse gases and air pollutants broken down by 64 industries (classified by NACE Rev. 2) plus households. Concepts and principles are the same as in national accounts. Complete data starts from reference year 2008<\/em>.<\/p>\n<p>Il va maintenant falloir charger les donn\u00e9es, chaque colonne est s\u00e9par\u00e9e par une tabulation, l&rsquo;absence de donn\u00e9e est d\u00e9finie par <code>:<\/code>, la premi\u00e8re colonne contenant la cat\u00e9gorie NACE il serait judicieux de la s\u00e9parer en quatre colonnes : les intitul\u00e9s sont <strong>airpol,nace_r2,unit,geo\\time<\/strong>.<\/p>\n<p>Pour envoyer cette donn\u00e9e \u00e0 Pinot, je me suis bas\u00e9 sur le guide <a href=\"https:\/\/docs.pinot.apache.org\/basics\/getting-started\/pushing-your-data-to-pinot\" rel=\"noopener\" target=\"_blank\">Pushing your data to Pinot<\/a>.<\/p>\n<p>Pour commencer, il faut d\u00e9finir un sch\u00e9ma \u00e0 la donn\u00e9e, voici celui que j&rsquo;ai utilis\u00e9 :<\/p>\n<pre>\n{\n  \"schemaName\": \"greenhouseGazEmission\",\n  \"dimensionFieldSpecs\": [\n    {\n      \"name\": \"airpol\",\n      \"dataType\": \"STRING\"\n    },\n    {\n      \"name\": \"nace_r2\",\n      \"dataType\": \"STRING\"\n    },\n    {\n      \"name\": \"unit\",\n      \"dataType\": \"STRING\"\n    },\n    {\n      \"name\": \"geo\",\n      \"dataType\": \"STRING\"\n    }\n  ],\n  \"metricFieldSpecs\": [\n    {\n      \"name\": \"2020\",\n      \"dataType\": \"FLOAT\"\n    },\n    {\n      \"name\": \"2019\",\n      \"dataType\": \"FLOAT\"\n    },\n    [...] \/\/ repeate the same for all fields down to 1995\n  ]\n}\n<\/pre>\n<p>Dans ce sch\u00e9ma, on d\u00e9finit deux types de champs, les champs de type dimensions : ce sont des cha\u00eenes de caract\u00e8res sur lesquels nous allons pouvoir filtrer ou grouper les donn\u00e9es, et les champs de type m\u00e9trique qui sont ici tous des floats (un champ par ann\u00e9e de donn\u00e9e disponible) sur lesquels nous allons pouvoir faire des calculs (agr\u00e9gations).<\/p>\n<p>Il faut ensuite d\u00e9finir la table o\u00f9 stocker les donn\u00e9es, voici la d\u00e9finition de la table, elle est pour l&rsquo;instant tr\u00e8s simple :<\/p>\n<pre>\n{\n  \"tableName\": \"greenhouseGazEmission\",\n  \"segmentsConfig\" : {\n    \"replication\" : \"1\",\n    \"schemaName\" : \"greenhouseGazEmission\"\n  },\n  \"tableIndexConfig\" : {\n    \"invertedIndexColumns\" : [],\n    \"loadMode\"  : \"MMAP\"\n  },\n  \"tenants\" : {\n    \"broker\":\"DefaultTenant\",\n    \"server\":\"DefaultTenant\"\n  },\n  \"tableType\":\"OFFLINE\",\n  \"metadata\": {}\n}\n<\/pre>\n<p>Pour pouvoir cr\u00e9er cette table, j&rsquo;ai red\u00e9marr\u00e9 un cluster Pinot depuis le <a href=\"https:\/\/docs.pinot.apache.org\/basics\/getting-started\/running-pinot-in-docker#docker-compose\" rel=\"noopener\" target=\"_blank\">Docker Compose propos\u00e9 dans la documentation<\/a>, puis utilis\u00e9 la commande Docker suivante qui va lancer une commande de cr\u00e9ation de la table depuis les d\u00e9finitions de sch\u00e9ma et de table pr\u00e9c\u00e9demment cr\u00e9\u00e9s :<\/p>\n<pre>\ndocker run --rm -ti \\\n    --network=pinot_default \\\n    -v ~\/dev\/pinot\/data:\/tmp\/pinot-quick-start \\\n    --name pinot-batch-table-creation \\\n    apachepinot\/pinot:0.9.3 AddTable \\\n    -schemaFile \/tmp\/pinot-quick-start\/greenhousGazEmission-schema.json \\\n    -tableConfigFile \/tmp\/pinot-quick-start\/greenhousGazEmission-table.json \\\n    -controllerHost manual-pinot-controller \\\n    -controllerPort 9000 -exec\n<\/pre>\n<p>Nous pouvons ensuite aller v\u00e9rifier via la console Pinot (<a href=\"http:\/\/localhost:9000\">http:\/\/localhost:9000<\/a>) que la table a bien \u00e9t\u00e9 cr\u00e9\u00e9e.<\/p>\n<p>Maintenant, place \u00e0 l&rsquo;insertion des donn\u00e9es !<\/p>\n<p>Le fichier est de type TSV et contient <code>:<\/code> quand il n&rsquo;y a pas de donn\u00e9es, pour le pr\u00e9parer \u00e0 l\u2019ingestion dans Pinot nous allons ex\u00e9cuter une commande sed pour le transformer en CSV (donc remplacer les tabulations par des virgules) et supprimer certains caract\u00e8res incorrects, cette commande sed va aussi modifier la ligne des noms des champs qu&rsquo;il faudra ensuite remettre \u00e0 ceux attendu par le sch\u00e9ma.<\/p>\n<pre>\nsed 's\/\\t\/,\/g;s\/:\/\/g;s\/[pseb]\/\/g;s\/[[:blank:]]\/\/g' env_ac_ainah_r2.tsv &gt; data\/env_ac_ainah_r2.csv\n<\/pre>\n<p>L\u2019ingestion dans Pinot se fait via un job d&rsquo;insertion d\u00e9fini au format yaml.<\/p>\n<pre>\nexecutionFrameworkSpec:\n  name: 'standalone'\n  segmentGenerationJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentGenerationJobRunner'\n  segmentTarPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentTarPushJobRunner'\n  segmentUriPushJobRunnerClassName: 'org.apache.pinot.plugin.ingestion.batch.standalone.SegmentUriPushJobRunner'\njobType: SegmentCreationAndTarPush\ninputDirURI: '\/tmp\/pinot-quick-start'\nincludeFileNamePattern: 'glob:**\/*.csv'\noutputDirURI: '\/tmp\/pinot-quick-start\/segments\/'\noverwriteOutput: true\npinotFSSpecs:\n  - scheme: file\n    className: org.apache.pinot.spi.filesystem.LocalPinotFS\nrecordReaderSpec:\n  dataFormat: 'csv'\n  className: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReader'\n  configClassName: 'org.apache.pinot.plugin.inputformat.csv.CSVRecordReaderConfig'\ntableSpec:\n  tableName: 'greenhouseGazEmission'\n  schemaURI: 'http:\/\/pinot-controller:9000\/tables\/greenhouseGazEmission\/schema'\n  tableConfigURI: 'http:\/\/pinot-controller:9000\/tables\/greenhouseGazEmission'\npinotClusterSpecs:\n  - controllerURI: 'http:\/\/pinot-controller:9000'\n<\/pre>\n<p>Ce job d\u00e9finit entre autre :<\/p>\n<ul><li><code>jobType: SegmentCreationAndTarPush<\/code> : le job va cr\u00e9er un segment de table. Un segment est une partition des donn\u00e9es de la table. Si votre jeu de donn\u00e9es est important il faudra d\u00e9couper le fichier CSV pour pouvoir lancer plusieurs jobs et obtenir plusieurs segments.<\/li>\n\n<li><code>inputDirURI<\/code> et <code>includeFileNamePattern<\/code> pour d\u00e9finir l&rsquo;endroit o\u00f9 chercher le ou les CSV des donn\u00e9es \u00e0 charger.<\/li>\n\n<li><code>recordReaderSpec<\/code> qui d\u00e9finit le format des donn\u00e9es CSV.<\/li>\n\n<li><code>tableSpec<\/code> qui d\u00e9finit la sp\u00e9cification de la table cible, celle que nous avons d\u00e9finie pr\u00e9c\u00e9demment.<\/li>\n<\/ul>\n<p>Pour lancer le job, vous pouvez utiliser la commande Docker suivante :<\/p>\n<pre>\ndocker run --rm -ti \\\n    --network=pinot_default \\\n    -v ~\/dev\/pinot\/data:\/tmp\/pinot-quick-start \\\n    --name pinot-data-ingestion-job \\\n    apachepinot\/pinot:0.9.3 LaunchDataIngestionJob \\\n    -jobSpecFile \/tmp\/pinot-quick-start\/job-ingest.yml\n<\/pre>\n<p>Apr\u00e8s ingestion, nous avons maintenant 266456 lignes dans notre table que nous pouvons ensuite requ\u00eater depuis la console Pinot.<\/p>\n<p>Par exemple via la requ\u00eate suivante : <code>select geo, sum(2019), sum(2020), sum(2021) from greenhouseGazEmission group by geo<\/code><\/p>\n<p>Pinot utilise Apache Calcite pour le requ\u00eatage, nous pouvons donc utiliser du SQL ANSI ce qui simplifie grandement le requ\u00eatage. La requ\u00eate ci-dessus va donner les r\u00e9sultats suivants :<\/p>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?resize=640%2C447&#038;ssl=1\" alt=\"\" width=\"640\" height=\"447\" class=\"alignnone size-large wp-image-1410\" srcset=\"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?resize=1024%2C715&amp;ssl=1 1024w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?resize=300%2C209&amp;ssl=1 300w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?resize=768%2C536&amp;ssl=1 768w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?resize=387%2C270&amp;ssl=1 387w, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/pinot-carbonn-footprint-query.png?w=1249&amp;ssl=1 1249w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/>\n<p>Le jeu de donn\u00e9e \u00e9tant assez petit, les requ\u00eates s\u2019ex\u00e9cutent en quelques millisecondes malgr\u00e9 qu&rsquo;aucun indexe n&rsquo;ait \u00e9t\u00e9 cr\u00e9\u00e9.<\/p>\n<p>Essayons maintenant la requ\u00eate suivante : <code>select sum(2019), sum(2020), sum(2021) from greenhouseGazEmission where unit = 'G_HAB'<\/code>, elle s\u2019ex\u00e9cute en 24ms, et on peut voir les informations de requ\u00eatage suivant :<\/p>\n<ul><li>numDocsScanned: 66614<\/li>\n\n<li>totalDocs: 266456<\/li>\n\n<li>numEntriesScannedInFilter: 266456<\/li>\n<\/ul>\n<p>Pinot a donc scann\u00e9 66614 documents sur 266456, les documents qui correspondent \u00e0 l&rsquo;unit G_HAB. Lors de la phase de filter, il a scann\u00e9 266456 entr\u00e9es, il a donc fait un full scan sur la table.<\/p>\n<h2>Optimisation du requ\u00eatage gr\u00e2ce aux indexes<\/h2>\n<p>Pinot permet l&rsquo;ajout d&rsquo;indexe pour optimiser le requ\u00eatage, dans la requ\u00eate pr\u00e9c\u00e9demment utilis\u00e9e, la colonne unit \u00e9tait utilis\u00e9 pour filtrer les donn\u00e9es.<\/p>\n<p>Je vais donc modifier la structure de table pour ajouter un index invers\u00e9 sur la colonne unit.<\/p>\n<p>Pour faire cela nous pouvons modifier la description de la table pour ajouter cet indexe :<\/p>\n<pre>\n{\n  \"tableName\": \"greenhouseGazEmission\",\n  \"tableIndexConfig\" : {\n    \"invertedIndexColumns\" : [\"unit\"],\n    \"loadMode\"  : \"MMAP\"\n  },\n  [...]\n}\n<\/pre>\n<p>Pour plus de simplicit\u00e9, j&rsquo;ai utilis\u00e9 l&rsquo;interface graphique de Pinot pour ajouter l&rsquo;index (en \u00e9ditant la table) puis recharger les segments. Recharger les segments apr\u00e8s une modification de table est n\u00e9cessaire pour que l&rsquo;index soit cr\u00e9\u00e9 et mis \u00e0 jour.<\/p>\n<p>Apr\u00e8s relance de la requ\u00eate, on voit que le <strong>numEntriesScannedInFilter<\/strong> passe \u00e0 0, Pinot utilisant l&rsquo;indexe pr\u00e9c\u00e9demment cr\u00e9\u00e9.<\/p>\n<p>Une des forces de Pinot est qu&rsquo;il supporte beaucoup de type d&rsquo;indexes diff\u00e9rent, ce qui permet d&rsquo;impl\u00e9menter des cas d&rsquo;utilisation diff\u00e9rents, et d&rsquo;optimiser pour le requ\u00eatage ou le stockage, chaque indexe utilisant de l&rsquo;espace disque.<\/p>\n<p>Pour aller plus loin sur les capacit\u00e9s d&rsquo;indexation de Pinot vous pouvez lire mon article : <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/apache-pinot-et-de-ses-differents-types-dindexes\/\" title=\"Apache Pinot et de ses diff\u00e9rents types d\u2019indexes\">Apache Pinot et de ses diff\u00e9rents types d\u2019indexes<\/a>.<\/p>\n<p><\/p>","protected":false},"excerpt":{"rendered":"<p>Cela faisait tr\u00e8s longtemps que j&rsquo;avais envie de tester Apache Pinot et j&rsquo;ai enfin pris le temps de le faire ! Tout d&rsquo;abord, une rapide description de Pinot Pinot est un datastore OLAP (OnLine Analytical Processing) distribu\u00e9e et temps r\u00e9el, sp\u00e9cialement con\u00e7u pour fournir des analyses \u00e0 tr\u00e8s faible latence, m\u00eame \u00e0 un d\u00e9bit extr\u00eamement \u00e9lev\u00e9. Il peut ing\u00e9rer des donn\u00e9es directement \u00e0 partir de sources de donn\u00e9es en continu (stream) ou de sources de donn\u00e9es par lots (batch). Au&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/jai-enfin-pris-le-temps-de-tester-apache-pinot\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[203,204,202],"class_list":["post-1400","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-database","tag-olap","tag-pinot"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1497,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/apache-pinot-et-de-ses-differents-types-dindexes\/","url_meta":{"origin":1400,"position":0},"title":"Apache Pinot et de ses diff\u00e9rents types d&rsquo;indexes","author":"admin","date":"jeudi 15 septembre 2022","format":false,"excerpt":"Il y a quelques temps, j'avais enfin pris le temps de tester Apache Pinot, vous pouvez trouver le r\u00e9cit de mes premi\u00e8res exp\u00e9rimentations ici. Apache Pinot est un datastore OLAP (OnLine Analytical Processing) distribu\u00e9 et temps r\u00e9el, sp\u00e9cialement con\u00e7u pour fournir des analyses \u00e0 tr\u00e8s faible latence, m\u00eame \u00e0 un\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/star-tree.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/star-tree.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/star-tree.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/loicmathieu.fr\/wordpress\/wp-content\/uploads\/star-tree.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1508,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/4-ans-chez-zenika\/","url_meta":{"origin":1400,"position":1},"title":"4 ans chez Zenika","author":"admin","date":"mardi  6 septembre 2022","format":false,"excerpt":"Avec quelques jours de retard, la date anniversaire \u00e9tant le 3 septembre, voici le bilan de ma quatri\u00e8me ann\u00e9e chez Zenika. Pour ceux qui seraient int\u00e9ress\u00e9 par ce que j\u2019avais fait l\u2019ann\u00e9e pr\u00e9c\u00e9dente, c\u2019est ici : Ma troisi\u00e8me ann\u00e9e chez Zenika. Quelques chiffres : 11 articles sur mon blog perso,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1674,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/devoxx-fr-2023-foundation-db-le-secret-le-mieux-garde-des-nouvelles-architectures-distribuees-par-pierre-zemb-et-steven-le-roux\/","url_meta":{"origin":1400,"position":2},"title":"Devoxx FR 2023 &#8211; FoundationDB : le secret le mieux gard\u00e9 des nouvelles architectures distribu\u00e9es ! par Pierre Zemb et Steven Le Roux","author":"admin","date":"lundi 17 avril 2023","format":false,"excerpt":"Il existe pr\u00e8s de 900 BDD (cf https:\/\/dbdb.io\/) et chacune a ses particularit\u00e9s : mod\u00e8le de requ\u00eatage, mod\u00e9lisation de la donn\u00e9e, moteur de stockage, .... Existe-t-il une de ces trois caract\u00e9ristiques que l'on peut mutualiser ? Oui, toutes les bases de donn\u00e9es stockent de la donn\u00e9e, on doit donc pouvoir\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":19,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/ruby-on-rails\/","url_meta":{"origin":1400,"position":3},"title":"Ruby on Rails","author":"admin","date":"jeudi 15 f\u00e9vrier 2007","format":false,"excerpt":"Bonjour, d'habitude au ton bucolique des vacances ou revendicatif des coups de gueules, aujourd'hui le ton de ce post va \u00eatre technophile. En effet, je bosse dans l'informatique qui est donc un de mes centre d'int\u00e9r\u00eat, et je vous livre ici mon premier message sur les nouvelles technologies. J'ai tester\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":419,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/chti-jug-nosql\/","url_meta":{"origin":1400,"position":4},"title":"Ch&rsquo;ti JUG : NoSQL","author":"admin","date":"lundi 20 d\u00e9cembre 2010","format":false,"excerpt":"Le 2 d\u00e9cembre s'est tenu dans les locaux de l'IUT A de Lille une session du Ch'ti JUG sur les technologie NoSQL anim\u00e9 par Olivier Mallassi. L'intervenant a commenc\u00e9 la conf\u00e9rence par un bref historique de la mani\u00e8re dont les donn\u00e9es on \u00e9t\u00e9 stock\u00e9es dans le monde de l'informatique: Au\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":966,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/1-an-chez-zenika\/","url_meta":{"origin":1400,"position":5},"title":"1 an chez Zenika","author":"admin","date":"mardi  3 septembre 2019","format":false,"excerpt":"Aujourd'hui est un jour sp\u00e9cial, cela fait un an que je suis arriv\u00e9 chez Zenika, apr\u00e8s 9 ans en tant qu'architecte logiciel dans la DSI d'un grand groupe de retail. Et apr\u00e8s un an, quel est donc le bilan ? Tout d'abord, Zenika m'a surpris. Lors des \u00e9changes que j'ai\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1400","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1400"}],"version-history":[{"count":2,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1400\/revisions"}],"predecessor-version":[{"id":1666,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1400\/revisions\/1666"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1400"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1400"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1400"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}