Projet BDBenchmark Auteurs : Bastien Doreau (LIMOS/CNRS), Emmanuel Delage (LIMOS/CNRS) Date : 24 aout 2015 Remerciements : Merci à M. Farouk Toumani, directeur du LIMOS, de nous avoir permis de réaliser ce projet dans les meilleurs conditions. Lors de nos échanges, il a présenté différentes orientations possibles de manière pertinente. Merci à M. Zhang Chao pour nous avoir transmis des données LSST, pour avoir présenté l’intérêt de ses travaux et pour l’inspiration qu’il nous a donné pour la construction de notre infrastructure des bases de données distribuées. Merci à M. Abdelslem Belghoul pour son aisance à présenter ses travaux de recherche d’une façon simple et ses besoins en visualisation pour l’analyse. Cela nous a également permis de préparer l’adaptation de notre interface à d’autres cas de bases de données distribuées. Merci à M. Benoît Eymard, Ingénieur Limagrain, de nous avoir présenté la problématique du Bigdata à Limagrain R&D et de nous avoir conseillé sur les technologies émergentes et dans les spécifications. Merci à Mme Marie Pailloux d’avoir échanger sur le projet BreedWheat, ce qui est de bon augure pour initier de nouvelles collaborations. Introduction : L’objectif du projet est la conception d’une interface de tests de la performance de bases de données distribuées de type « Bigdata ». Cette interface, appelée « BigDataBenchmark » (BDBenchmark) doit être accessible par tous les utilisateurs enregistrés et leur permettre de tester leurs bases de données distribuées. L’interface sera mise en œuvre dans un serveur Web pour être accessible avec le navigateur Web de l’utilisateur. Il s’agit donc d’un portail Web d’accès à des bases de données distribuées. De plus, le portail Web sera adaptatif aux tablettes et smartphones. BDBenchmark permet de s’identifier, de connecter un ensemble de bases de données, d’effectuer des requêtes multithread sur ces bases, d’enregistrer le résultat de ces requêtes sous la forme de scénario, d’analyser plusieurs scénarii par croisement et de visualiser le résultat dans un graphique. Au LIMOS, le serveur de machines virtuelles « avatar » permet à un utilisateur de se construire une infrastructure de bases de données distribuées. Après une étude des technologies existantes, notre choix s’est arrêté sur JAVA (cf : Doc technique) et les outils qui gravitent autour. BDBenchmark accède à « avatar » en SSH (le port 22 est ouvert sur cette machine) à l’aide de JSCH. Pour le moment, il n’est possible que de gérer que des bases de données PostgreSQL car seul le driver JDBC PostgreSQL a été mis en œuvre. L’infrastructure de bases de données de tests est constituée de 3 machines virtuelles (VM ) toutes accessibles indépendamment. Une de ces VM, appelée « VM-Mediateur », peut être utilisée comme médiateur car une de ses bases, appelée « lsst_med », contient des liaisons DBLINK et SQL/MED. Il est possible de reconstruire son propre environnement de tests à l’aide de documentations d’installation systèmes (cf : docsys), d’installation de bases de données PostgreSQL (cf : docbases), d’un algorithme de conversion (cf : algo) et du remplissage de ces bases de données (cf : remplissage). Cette dernière documentation contient également un récapitulatif des différentes bases de données (SQL, JSON, JSONB) ainsi que l’utilisation d’indexes, de table lointaines SQL/MED et de vues DBLINK. Les données correspondent à 4012341 enregistrements d’objets (célestes ?) observables par le futur télescope LSST. Chaque objet peut être constitué d’environ 250 informations toutes numériques. Les tests d’analyse reposent sur l’étude de la performance des accès à ces données, dans l’architecture de bases de données décrite précédemment. Un ensemble de tests d’analyse a été réalisé au moyen des graphiques générés par BDBenchmark. Dans cette synthèse de projet, nous présentons un ensemble de tests d’analyse de la performance basé sur l’infrastructure choisie, et les résultats associés. Finalement, nous décrirons les perspectives d’évolution de l’interface BDBenchmark. Résultats : Test 1 : Description : Le « test1 » est composé d’une sélection de 6 scénarii. Les 3 1er scenarii interrogent les tables t_obj_half1 et t_obj_half2 de la base lsst (data json), les 3 scenarii suivant interrogent les tables t_obj_half1 et t_obj_half2 de la base lsst_b (data jsonb). Chaque scénario est composé de 2 requêtes, formulées au moyen de BDB : Thread 1 sur “DonneesA”: SELECT max(cast(data->>'3' as float)) FROM t_obj_half1 Thread 2 sur “DonneesB”: SELECT max(cast(data->>'3' as float)) FROM t_obj_half2 Analyse : Les requêtes de calcul d’un maximum sont plus rapides en JSONB qu’en JSON (speedup : 7.5). En JSONB, nous constatons un « effet de cache » après la première exécution de la requête (speedup : 2) Test 2 : Description : Le « test2 » est composé d’une sélection de 16 scénarii. - 4 scenarii sur la table t_obj_half1 de la base lsst_b (JSONB) Un index « GIN » (global) a été créé sur cette table. Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1 where data->>'1' ='430222579090485' - 4 scenarii sur la table t_obj_half1_id de la base lsst_b (JSONBid) Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1_id where id=433314955551226 - 4 scenarii sur la table t_obj_half1 de la base lsst (JSON) Un index a été crée sur cette table pour l’élément data->>'1'. Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1 where data->>'1' ='430222579090485' - 4 scenarii sur la table t_obj_half1_id de la base lsst (JSONid) Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1_id where id=433314955551226 Analyse : Nous constatons un « effet de cache » systématique après la première exécution de la requête. Passée la période de « cache », nous pouvons constater que le temps le plus intéressant se retrouve pour le cas JSON avec un index. (temps ~600 ms) Ensuite, viennent les cas JSONBid et JSONid pour des temps respectifs de ~2550 ms et ~3000 ms. Puis vient le cas JSONB avec un temps de ~4700 ms. Test3: Description : Le « test3 » est composé d’une sélection de 12 scénarii. - 4 scenarii sur la table t_obj_half1 de la base lsst (JSON) Un index a été créé sur cette table pour l’élément data->>'1'. Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1 where data->>'1' ='430222579090485' - 4 scenarii sur la table t_obj_half1_id de la base lsst (JSONid) Thread 1 sur “VM-Mediateur”: SELECT cast(data->>'3' as real) FROM t_obj_half1_id where id=433314955551226 - 4 scenarii sur la table t_obj_half1 de la base lsst (JSONBl) T_link_lsstb_h1 est une vue d’une requête DBLINK sur la machine « DonneesA » qui calcule le maximum pour data->>'3'. Idem avec T_link_lsstb_h2 sur la machine « DonneesB ». Thread 1 sur “VM-Mediateur”: SELECT * FROM t_link_lsstb_h1 Thread 2 sur “VM-Mediateur”: SELECT * FROM t_link_lsstb_h2 Analyse: L’utilisation d’un médiateur n’est pas pertinente pour ces requêtes sachant qu’il n’y a pas d’index sur les données A et B. Analyse des tests : Les résultats dépendent de l’architecture matérielle et logicielle. Plusieurs critères sont à prendre en considération lors de l’analyse : - L’état et la configuration de la machine « avatar » : Le temps des requêtes dépend du nombre d’utilisateurs étant donné les ressources de mémoire RAM, de processeurs et d’entrées/sorties (réseau, disques durs, RAM) utilisées au niveau système. - L’état et la configuration de la machine serveur sur lequel est exécuté BDBenchmark pour les mêmes raisons. De plus, l’interface nécessite un certain temps de traitement pour la gestion de requêtes en fonction des performances de la machine. - L’état du réseau entre « avatar » et le serveur BDBenchmark. Un test a été effectué avec une connexion VPN à environ 15 km du LIMOS. Nous avons constaté une variabilité des résultats difficile à anticiper. Par exemple une requête exécutée en environ 600 millisecondes (temps JAVA) à travers le VPN a été exécutée au LIMOS : QUERY PLAN Index Scan using index_for_id_in_json on t_obj_half1 (cost=0.43..8.46 rows=1 width=32) (actual time=0.189..0.198 rows=1 loops=1) Index Cond: ((data ->> '1'::text) = '430222579090485'::text) Planning time: 0.846 ms Execution time: 0.318 ms time : 6 ms nb col : 1.0 nb rows : 4 Nous constatons que le temps d’exécution est divisé par 100 (temps JAVA) dans ce cas. En réalité, le SGBD PostgreSQL exécute la requête en 0.318 millisecondes. L’exécution du traitement de l’interface est donc d’environ 5 millisecondes. Des limitations, propres à une interface web, sont à considérer : - Les requêtes longues ne peuvent excéder 30 minutes à priori en raison du timeout du serveur web. Les requêtes qui induisent une réponse longue sur un grand nombre de données (ex : select *) génèrent une exception java (java.lang.OutOfMemoryError) qui fait tomber le serveur. Perspectives: Améliorations techniques : -Affichage des messages (Informations sur la persistance des données/ Messages d’erreur SSH, SQL, …) -Tri des scénarios avec la librairie Primefaces -Rajouter des champs sur les tables de la base bdbench (Scenario -> ajouter le champ date) -Ajax : bouton d’arrêt de la requête en cours et message « en cours de traitement… » -Répétition d’un scénario ‘N’ fois avec calcul d’un temps moyen -Création d’une page d’administration des utilisateurs de BDBenchmark -Récupérer le temps du SGBD (par Explain Analyse pour PostgreSQL) pour remplacer le temps de la requête en JAVA -Organisation d’un import et export de scénarios en vue d’échanges de résultats entre utilisateurs -Amélioration de la fonction Debug (pouvoir enchainer les commandes shell dans un prompt) -Amélioration de l’ergonomie (taille des colonnes, …) -Intégration du format de fichier SVG pour l’affichage de résultats en 3D vectoriel -Amélioration de la fonction d’import de fichier SQL Adaptation multi-projets : -Intégrer une connexion JDBC Oracle pour le cas d’utilisation d’Abdelslem Belghoul -Tester le cas d’utilisation de Zhang Chao -Etude comparative avec MongoDB, intégrer une connexion JDBC MongoDB pour le cas d’utilisation de Benoît Eymard -Appréhender le cas d’utilisation de Marie Pailloux -Intégrer des données PostGIS pour le cas d’étude d’Emmanuel Delage.