Little hardware, Big data 1/5

little_hardware

Cet article est le premier d'une collection de 5 dont le titre est Little Hardware, Big Data.

Il s'agit de la présentation d'un projet de A à Z, depuis les premières idées jusqu'à la mise en ligne. Les points-clés de chaque étape/module seront présentés.Chaque article est composé de trois parties: Intro; Les "10 astuces"; et Les "5 aléas". Les astuces vont à l'essentiel du contenu actuel du projet et les "5 aléas" parle de tout ce qui a été essayé puis abandonné.

Puisqu'il s'agit du premier article on commence par une présentation de l'ensemble "Little Hardware, Big data".

Little Hardware, Big Data

Objectif

Cette application a pour but de construire une encyclopédie dont les phrases sont triées chronologiquement. Le but étant de rapprocher des informations habituellement disponibles dans des catégories différentes.

Exemple concret:

  • [...] il y a 1,1 million d'années, le Cône Cinder produit une coulée de lave de neuf kilomètres de longueur. [Wikipédia en géologie]
  • Il est le premier homme à avoir domestiqué le feu, il y a environ 1 million d'années. [Wikipedia en science humaines]

L'objectif du projet est de présenter les événements sur l'axe du temps sans le 'cloisonnement' dû au domaine d'étude (Mathématiques, Histoire, Sociologie, Philosophie, actu people...)

Composants

Il faut noter que cette application est 'maison', réalisée par un unique développeur avec peu de temps à y consacrer. Les choix de technos ou d'outillage sont aussi influencés par ce contexte: simple, court, peu d'industrialisation, tests unitaires uniquement pour les codes complexes ou là où une couverture s'avère utile. Toutes les astuces de cet article sont le fruit de plusieurs itérations sur les modules suivants :

  1. Le Downloader : Récupérer des données qui feront le contenu de l'encyclopédie. (Article 1, celui-ci)
  2. Le Transformer : Exploiter les données fournies par le Downloader pour construire un index Lucene constitué de phrases datées. (Article 2 à venir)
  3. Le Back : Mettre en place un service REST avec les fonctions de recherche, de statistiques, de synonymie, etc... (Article 3 à venir)
  4. Le Front : Construire une Single Page Application accessible au référencement naturel, qui présente les données issues du Back. (Article 4 à venir)
  5. La Prod : Déployer l'application sur internet d'une manière 'maison' (30€ pour un raspberry connecté à une box, 1,40€ pour un nom de domaine). (Article 5 à venir)

1- le Downloader

Présentation générale

Le downloader récupère des données de source HTTP pour les stocker sur le disque. On le lance unitairement pour créer les données/ajouter des données. La formule technique suivante est celle qui offre le plus de simplicité d'usage et de performances:

  • La classe principale est une Spring Boot Application pour une configuration rapide, avec uniquement des annotations.
  • Utilisation de la librairie Java crawler4j pour récupérer en masse des pages web sous forme de texte lisible (conversion du code HTML vers du texte lisible).
  • Utilisation de Log4j2 pour écrire les données en texte brut sur le disque à partir d'une cinquantaine de Threads en parallèle.

Les 10 Astuces

  • Astuce 1 : Pour gérer les paramètres en ligne de commande, l'utilisation de Spring ApplicationArguments est très pratique. (Config. des adresses à visiter, nombre de crawlers, délai de politesse, dossier de sortie, etc.)
  • Astuce 2 : Forker la librairie crawler4j pour modifier le rendu des listes et des tableaux (sinon les éléments sont collés bout à bout) via la classe HTMLContentHandler.endElement().
  • Astuce 3 : Le nombre de crawlers plutôt optimal est de 50 pour un poste 'à la maison' avec une connexion fibre.
  • Astuce 4 : Utiliser une expression régulière d'exclusion pour ne retenir que les pages de texte: les extensions à exclure sont nombreuses.
  • Astuce 5 : Il y a un risque d'erreur HTTP 509 - Dépassement de quota si l'accès aux pages que vous faites est jugé abusif par le serveur.
  • Astuce 6 : Il faut respecter les sources de données en appliquant un délai de politesse entre page visitée. Exemple pour Wikipedia : le passage de 1ms à 25ms ne multiplie que par trois le temps total de chargement (36h).
  • Astuce 7 : Pour la sortie, il vaut mieux configurer des petits fichiers de 100Mo pour une manipulation plus simple dans les étapes ultérieures.
  • Astuce 8 : L'utilisation de Java VisualVM (intégré au JDK) permet d'optimiser ce genre d'application où les performances sont cruciales.
  • Astuce 9 : Note sur la propriété intellectuelle : il faut citer ses sources correctement, donc intégrer dès cette étape les métadonnées.
  • Astuce 10 : Pour exploiter les données contenues dans un livre PDF et ePub avec le Downloader, il suffit de copier son texte grâce à une visionneuse et de le coller dans une page HTML qui est déjà compatible.
  • Astuce 11 : Dans sa version et sa configuration actuelle, le Downloader gère environ 100 pages à la seconde.

Les 5 Abandons

Voici la liste des composants complexes, inutiles et/ou chronophages qui ont été abandonnés dans Downloader:

  • Abandon 1 : La conception complexe pour gérer des destinations multiples pour les données. (1 seule destination suffit : la bonne!)
  • Abandon 2 : La conception complexe pour gérer la concurrence en écriture des crawlers. (Les frameworks de logs sont très efficaces pour cela.)
  • Abandon 3 : Le composant d'écriture dans une base Mongo. Pas besoin de Mongo à ce stade, décision de séparer la récupération des données (Downloader) de son exploitation (Transformer, prochain article)
  • Abandon 4 : Le composant d'écriture dans une base MySQL. Idem ci-dessus.
  • Abandon 5 : La modélisation d'une structure de données relationnelle (Phrase, Page, Catégorie) au profit d'un vrai no-data : des Phrases, avec le minimum de métadonnées.

Conclusion

Même seul, on se rend compte que faire de l'Agile (ou de l'"itératif et incrémental") permet énormément de relativiser les besoins et force à se concentrer sur l'objectif final. Pas besoin de construire le composant parfait, s'il n'est pas encore "mise en prodable". Des complexités peuvent être résolues en ne mettant pas en place le besoin. En effet ce dernier peut s'avérer inutile après avoir fait l'expérience d'une première version.

Autres infos

En dev., le plugin SonarLint pour IntelliJ/Eclipse est une excellente aide pour coder du Java et du Javascript et faire du code propre dès le début; Bien que la version 2 de ce plugin qui permettra d'appliquer les paramétrages d'un vrai serveur Sonar n'est pas encore sortie.

La version 0.0 de l'application 'Little hardware, Big data' est accessible sur http://histoires.xyz

Après le Downloader, à venir dans les articles suivants : le Transformer, le Back, le Front, la Prod.

3 commentaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *