Implémentation de OGSA-DAI
Intervenants : Laurent Miguel, André Schaaff
Interlocutrice côté Edimbourg : Amy Krause
Le but de ce travail est d'implémenter la dernière version (Jersey) de OGSA-DAI pour :
- acquérir une connaissance de l'utilisation des côtés serveur et client
- réfléchir aux tests potentiels dans le cadre du CDS
- apporter par la suite un support à nos collègues d'Edimbourg s'ils souhaitent accéder les services du CDS (via TAP par exemple) dans leur propre implémentation de OGSA-DAI
Première étape
- lire les documents en ligne
- télécharger la dernière version proposée par Amy
- répondre à un certain nombre de questions : quel type de serveur ?, SOAP via axis ou la version REST est-elle opérationnelle, paramétrage de l'accès aux différentes sources de données (de différents types : XML, CSV, SGBD, etc.)
- comment se font les requêtes ? SQL ?
- utiliser les bonnes versions des outils (tomcat, axis, ant, etc.)
- familiarisation de Laurent avec la spécification TAP pour la 2ème étape
- etc.
"lire les documents en ligne"
N.B. entre la fin juin et le début du projet la documentation en ligne a été remaniée, des présentations et des explications simples qui paraissaient intéressantes ne sont plus présentes
la documentation est plutôt orientée vers des initiées et il y a beaucoup de partie qui ne sont pas très claires pour quelqu'un qui ne suit pas le projets de près ou qui débute
javadoc d'ogsadai :
http://ogsa-dai.sourceforge.net/documentation/ogsadai4.2/ogsadai4.2-jersey-javadoc/
c'est très utile car des exemples sont présents, à contrario de la doc (ex :
http://ogsa-dai.sourceforge.net/documentation/ogsadai4.2/ogsadai4.2-jersey-javadoc/uk/org/ogsadai/client/toolkit/example/XMLDBClient.html)
le fait que des exemples manquent dans la doc 4.2 nous oblige à consulter la javadoc ou alors une doc précédente
Quels types de "bases" de données ?
Ce sont principalement les SGBD qui sont concernés, la partie concernant des bases XML ne semblent pas vraiment maintenu (confirmé par Amy : There wasn't much demand for XML databases so this hasn't been updated in years as we focused on the relational databases and DQP).
Au niveau SGBD il y a des exemples avec
MySQL et pour XML il s'agit de eXist.
L'exemple concernant
MySQL est assez facile à mettre en oeuvre par contre la documentation n'est pas très claire pour la mise en œuvre de XML.
Comment se font les requêtes ?
On peut créer des requêtes sur un SGBD (ce qui semble un minimum...) mais également des requêtes concernants plusieurs SGBD (on peut faire ici un parallèle avec le logiciel Le Select que nous avions vu durant le projet PADOUE)
le chapitre
http://ogsa-dai.sourceforge.net/documentation/ogsadai4.2/ogsadai4.2-jersey/DQPOverview.html explique comment effectuer une requêtes sur 2 ressources différentes
exemple :
SELECT regionType, avg(age) as avgAge
FROM
((SELECT age, postcode FROM MySurvey_People) UNION ALL
(SELECT age, postcode FROM JoesSurvey_People)) as u
JOIN PostcodeStats_PostcodeRegionType r ON u.postcode = r.postcode
GROUP BY regionType
Pas d'exemple java DQP alors qu'il y'en a un pour le mysql.
Client java XML ne marche pas (Class org.exist.xmldb.DatabaseImpl does not implement interface org.xmldb.api.base.Database )
Il faut chercher les classes nécessaires dans des versions différentes (notamment ogsadai 3)
-> à mettre en rapport avec la réponse d'Amy précisant que la partie XML a en quelque sorte à l'abandon
Test de performance lors de requêtes SQL SIMPLES
Données de test : Employee Data
Jeu de données d'une taille totale de 160MO
Disponible à cette url : http://dev.mysql.com/doc/index-other.html
Tables utilisées : Employees ( 300 000 entrées ) et Salaries ( 2 844 000 entrées )
Nous allons mesurer le temps que met une requête SQL à s'effectuer via Ogsadai 4.2 Jersey et le comparer au temps d'execution de la même requête via Phpmyadmin.
La base SQL est située localement.
Activités utilisées sur Ogsadai pour ces requêtes :
pipeline.add(query);
pipeline.add(tupleToByteArrays);
pipeline.add(deliverToRequestStatus);
Requête 1 : SELECT * FROM employees WHERE emp_no BETWEEN 10000 AND 40000
Nombre de résultats : 30000
Temps d'éxecution mesuré sur Ogsadai : 5 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.0284 secondes
Requête 2 : SELECT * FROM employees WHERE emp_no BETWEEN 10000 AND 80000
Nombre de résultats : 70000
Temps d'éxecution mesuré sur Ogsadai : 9.8 secondes
Temps d'éxecution mesuré sur Phpmyadmin : en test
Requête 3 ( Average + Jointure ): SELECT avg(salary) FROM `employees`, salaries WHERE employees.emp_no = salaries.emp_no AND salaries.emp_no BETWEEN 10000 AND 40000
Nombre de résultats : 1 ( average sur 284 000 salaires )
Temps d'éxecution mesuré sur Ogsadai : 1.5 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.1 secondes
Requête 4 ( SUM + Jointure ): SELECT sum(salary) FROM `salaries` , employees WHERE salaries.emp_no BETWEEN 10000 AND 40000 AND employees.emp_no = salaries.emp_no AND employees.gender = 'M'
Nombre de résultats : 1 ( SUM sur 170 000 salaires )
Temps d'éxecution mesuré sur Ogsadai : 1.3 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.064 secondes
Requête 5 ( SUM + AVG + SQRT + COUNT + MIN/MAX Jointure ): SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary),SUM(salaries.emp_no),
AVG(salaries.emp_no),MIN(salaries.emp_no),MAX(salaries.emp_no),COUNT(salaries.emp_no), SQRT(salaries.emp_no), SQRT(salary) FROM `salaries` , employees WHERE employees.emp_no BETWEEN 10000 AND 300003 AND employees.emp_no = salaries.emp_no
Nombre de résultats : 1 ( Opérations sur 1 800 000 salaires et 290 000 employés )
Temps d'éxecution mesuré sur Ogsadai : 2.66 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 1.12 secondes
Requête 6 ( SUM + AVG + SQRT + COUNT + MIN/MAX Jointure ): SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary),SUM(salaries.emp_no),
AVG(salaries.emp_no),MIN(salaries.emp_no),MAX(salaries.emp_no),COUNT(salaries.emp_no), SQRT(salaries.emp_no), SQRT(salary) FROM `salaries` , employees WHERE employees.emp_no BETWEEN 10000 AND 170003 AND employees.emp_no = salaries.emp_no
Nombre de résultats : 1 ( Opérations sur 950 000 salaires et 290 000 employés )
Temps d'éxecution mesuré sur Ogsadai : 1.94 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.59 secondes
Requête 7 ( SUM + AVG + SQRT + COUNT + MIN/MAX Jointure): SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary),SUM(salaries.emp_no),
AVG(salaries.emp_no),MIN(salaries.emp_no),MAX(salaries.emp_no),COUNT(salaries.emp_no), SQRT(salaries.emp_no), SQRT(salary) FROM `salaries` , employees WHERE employees.emp_no BETWEEN 10000 AND 80003 AND employees.emp_no = salaries.emp_no
Nombre de résultats : 1 ( Opérations sur 660 000 salaires et 290 000 employés )
Temps d'éxecution mesuré sur Ogsadai : 1.7 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.41 secondes
Les résultats de ces requêtes montrent qu'il y'a un temps de "voyage" minimum sur Ogsadai, d'environ 1.3 secondes lors des requêtes à faible nombre de résultats ( fonction de calculs SQL ) mais qui augmente selon la quantité de résultats retournée.
On peut supposer que la transformation de ces résultats vers un tableau java peut prendre plus de temps, puisque le client java va interroger le service ogsadai qui lui va interroger la base SQL, il y'a donc des étapes en plus que via Phpmyadmin, ce qui peut expliquer un temps de requête plus long.
Test de performance lors de requêtes SQL DQP
Requête 1-b ( Equivalente à deux fois la requête 1 ) : SELECT * FROM ((select * from MySQLResource_employees c ) UNION ALL (select * from MySQLResource2_employees r ) ) sub WHERE emp_no >= 10000 and emp_no < 40001
Nombre de résultats : 60000
Temps d'éxecution mesuré sur Ogsadai en requête simple ( *2 ) : 10 secondes
Temps d'éxecution mesuré sur Ogsadai en requête DQP : 5.8 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.05 secondes
Requête 3-b ( Average + Jointure ): SELECT avg(salary) FROM ((select * from MySQLResource_employees c ) UNION ALL (select * from MySQLResource2_employees r ) ) as u JOIN MySQLResource2_salaries w ON u.emp_no = w.emp_no WHERE w.emp_no >= 10000 and w.emp_no < 40001
Nombre de résultats : 1 ( average sur 568 000 salaires )
Temps d'éxecution mesuré sur Ogsadai en requête simple ( *2 ) : 3 secondes
Temps d'éxecution mesuré sur Ogsadai en requête DQP : 3.6 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 0.2 secondes
Requête 5-b ( SUM + AVG + COUNT + MIN/MAX Jointure SANS SQRT (non supporté) ): SELECT SUM(salary),AVG(salary),MIN(salary),MAX(salary),COUNT(salary),SUM(u.emp_no), AVG(u.emp_no),MIN(u.emp_no),MAX(u.emp_no),COUNT(u.emp_no) FROM ((select * from MySQLResource_employees c ) UNION ALL (select * from MySQLResource2_employees r ) ) as u JOIN MySQLResource2_salaries w ON u.emp_no = w.emp_no WHERE w.emp_no >= 10000 and w.emp_no < 300005
Nombre de résultats : 1 ( Opérations sur 3 600 000 salaires et 580 000 employés )
Temps d'éxecution mesuré sur Ogsadai en requête simple ( *2 ) : 4.4 secondes
Temps d'éxecution mesuré sur Ogsadai en requête DQP : 16.5 secondes
Temps d'éxecution mesuré sur Phpmyadmin : 1.0 secondes
Requête lourde ( 4 Millions de résultats ): SELECT * FROM MySQLResource_employees, MySQLResource2_salaries
Temps d'éxecution mesuré sur Ogsadai en requête DQP : Infini ( plantage ), le server consomme plus de 1.8 go de mémoire et freeze, sans relâcher la mémoire.
Lors de l'éxecution des requêtes, des problèmes de mémoires sont apparus, la mémoire utilisée n'était pas totalement relâchée après l'éxecution de la requête, celà peut être un problème au niveau d'Ogsadai mais aussi du client java utilisé pour ces tests, ce dernier étant sommaire. Au final, les résultats sont variables, la requête DQP est plus rapide sur un Select * mais plus lente lors de requêtes qui utilisent des fonctions de calculs ( Min/max, average, count, ect ). Le test n'a pas pu être réalisé sur un grand nombre de résultats puisque le serveur plantait suite à un manque de mémoire vive.
Documents utilisés en plus de la doc
Documents DQP
http://www.cs.man.ac.uk/~norm/papers/fgcs09.pdf
-
http://www.dma.unina.it/~murli/ISSGC06/ogsadai/public_html/Slides/OGSA-DQP.pdf
Problèmes (de fond) au niveau de la documentation (extrait)
Chapter 54. How to add JARs to the server : after "The server's JAR files are located in:" then nothing
Chapter 55. How to configure the server URL : after "The server's context configuration file is located in:" then nothing
Chapter 56. How to add objects to the OGSA-DAI context : after "The server's context configuration file is located in:" then nothing
Chapter 58. How to use the OGSA-DAI request monitor : after "The server's context configuration file is located in:" then nothing and after " You can then use it as follows:" and "First visit the OGSA-DAI JSP index page in a browser (this was already deployed when you deploy OGSA-DAI) e.g:" and "Visit the OGSA-DAI request monitor JSP page in a browser (this was already deployed when you deploy OGSA-DAI) e.g:" screens missing ?
Chapter 59. How to use the OGSA-DAI activity progress monitor : after " The server's context configuration file is located in:" then nothing
60.3. How to change the data source servlet name : "You can change the name of the servlet by changing the value in the url-pattern field. For example, changing the url-pattern value to be to be servlets/DataSourceRetrievalServlet would mean that the connection URL would be:" then nothing
61.2. Default REST servlet URL : after "If using the WriteToWebServerFile activity then the REST servlet URLs will have form:" then nothing
Chapter 64. How to specify a login provider : after "The server's context configuration file is located in:" then nothing
Appendix A. Appendix - OGSA-DAI server configuration files (a lot of locations are missing)
from chapter 67 to chapter 75 + chapters 78 and 79( all the examples are missing)
Problèmes au niveau de l'installation d'ogsadai Jersey 4.2
Lors de la création du client Mysql Java, il faut importer une classe de la version Axis non présente dans la version Jersey ( java.lang.ClassNotFoundException: org.apache.axis.encoding.Base64 ).
Deuxième étape (non débutée)
- support pour utilisation de TAP par nos collègues d'Edimbourg
- ogsadai4_2.tar.gz: Save of the installation of ogsadai 4.2