Comment j'ai utilisé Apache Spark et Docker dans un hackathon pour créer une application météo
Publié: 2022-03-11Dans deux de mes articles précédents, j'ai présenté au public Apache Spark et Docker. Le moment est venu de vous montrer une application entièrement fonctionnelle comprenant les deux technologies susmentionnées.
La motivation « est tombée du ciel sous forme de données » et a été déclenchée par un hackathon organisé par IBM. L'objectif de Sparkathon était d'utiliser les données météorologiques et Analytics pour Apache Spark pour IBM Bluemix afin de créer des applications mobiles liées à la météo.
IBM investit massivement dans Spark et a récemment acheté la partie numérique de The Weather Channel. En conséquence, cet événement semble parfait pour leur publicité.
Inspiration
Vous êtes-vous déjà plaint de la météo dans votre région, aviez-vous prévu du temps libre et de l'argent à dépenser, mais ne saviez pas où aller ? Si la réponse est oui, alors vous aimeriez vraiment l'application My Perfect Weather .
Juste pour illustrer comment l'application pourrait être utilisée, voici quelques cas d'utilisation :
- Vous avez un enfant avec qui vous avez promis de faire voler un cerf-volant cette semaine, mais il n'y a absolument pas de vent là où vous vivez et vous ne voulez pas manquer à votre parole.
- Vous vivez dans un endroit venteux et pluvieux comme moi (Édimbourg, Écosse) et vous voulez sentir la chaleur sur votre peau et certainement pas de pluie.
- Vous avez envie de construire un bonhomme de neige et vous ne vous reposerez pas tant que vous ne l'aurez pas accompli.
- Vous voulez aller pêcher, et cette fois, vous voulez vraiment attraper quelque chose.
Ce qu'il fait
L'idée derrière le service est très simple. Tout d'abord, vous définissez ce que le temps parfait signifie pour vous à un moment donné. Actuellement, vous pouvez filtrer par température, vitesse du vent, type de précipitation et probabilité de précipitation, comme indiqué dans la capture d'écran ci-dessous. Ensuite, le service fait le reste et vous est présenté les meilleures destinations correspondantes. Les résultats sont triés par nombre de jours parfaits, ceux correspondant à la requête d'origine, trouvés pour chaque ville et limités aux cinq premiers. Les jours parfaits sont également marqués d'un arrière-plan différent.
Voyons comment nous pourrions utiliser le service pour les cas d'utilisation définis dans la section précédente.
- Réglez le vent entre 16 et 32 km/h, idéal pour faire voler un cerf-volant, avec un petit risque de pluie et une température confortable.
- Réglez la température minimale pour qu'elle soit suffisamment chaude pour vous, réglez le risque de pluie sur 0 %.
- Réglez la température autour et en dessous de 0 C, choisissez la neige comme type de précipitation et la probabilité de précipitations est élevée.
- Réglez la vitesse du vent à moins de 16 km/h, peu de pluie et de nuages car vous voulez éviter qu'il y ait trop de soleil et que les poissons aillent plus profondément dans l'eau, température confortable.
Si vous le souhaitez, vous pouvez facilement vérifier comment vous rendre à la destination de votre choix, car l'application est intégrée au service de recherche de voyages Momondo.
Comment je l'ai construit
Fondamentalement, tout sauf le service de recherche de voyages externe s'exécute à l'intérieur de la plate-forme IBM Bluemix.
IBM a offert un essai gratuit à tous les participants du hackathon, donc je n'ai pas eu à me soucier de l'endroit où exécuter l'application.
Voyons comment les données circulent dans l'application et comment les composants présentés dans le diagramme d'architecture s'assemblent.
L'application Play est hébergée dans un conteneur Docker. L'un de ses services est capable de contacter le service météo et de télécharger les prévisions à 10 jours dans Cloudant. Dans une étape suivant le téléchargement, Spark lit les données météorologiques brutes de Cloudant, les traite et les stocke dans Cloudant pour un accès rapide et facile par l'application Play.
Lorsque les utilisateurs accèdent à la page principale de l'application, un formulaire contenant divers contrôles leur est présenté pour définir leur météo idéale. Leur entrée est soumise au backend qui interroge Cloudant pour les villes contenant les jours parfaits. Ensuite, une autre requête est effectuée pour l'ensemble des dix jours de la prévision pour les villes renvoyées dans la requête précédente. Les résultats obtenus sont présentés aux utilisateurs et les cellules représentent les conditions météorologiques par ville et par jour. La dernière cellule de chaque ville contient un lien vers un service de voyage. En cliquant dessus, les utilisateurs seront redirigés vers le site Web de Momondo et le formulaire de recherche de vol sera pré-rempli avec la destination et les dates de voyage. Si l'utilisateur a déjà utilisé le service (et qu'il a enregistré un cookie dans son navigateur), l'origine et le nombre de voyageurs peuvent également être pré-remplis. Bien entendu, les champs de ce formulaire peuvent être modifiés. Par exemple, on peut essayer différentes dates de voyage à la recherche d'un meilleur tarif.
C'est à peu près ainsi que l'application est construite. Les sections suivantes donnent plus de détails sur certains des composants.
Spark et Insights pour la météo
La première phase du projet a été consacrée à comprendre comment l'API météo et les autres services Bluemix fonctionnent, et a été suivie par l'exploration initiale des données météorologiques à l'aide de Spark. Cela m'a permis de comprendre comment le modèle de données fonctionnait et comment il pouvait être utilisé dans l'application.
Pour les besoins de cette application, seuls les premiers points de terminaison de l'API Weather REST suivants sont utilisés :
GET /v2/forecast/daily/10day - Weather Standard 10-day Daily Forecast GET /v2/forecast/hourly/24hour - Weather Standard Hourly Forecast GET /v2/observations/current - Current Weather Observation GET /v2/observations/timeseries/24hour - Time-Series Observation
Le point de terminaison est interrogé sur les prévisions météorologiques pour chaque ville d'intérêt en fournissant un paramètre de géocode qui prend la latitude et la longitude du lieu en question.
En raison de la nature du service, le nombre de requêtes adressées à l'API Météo est en corrélation avec le nombre de villes prises en charge. J'ai considéré la limite de niveau gratuit d'Insights for Weather Service qui était de 500 appels par jour et j'ai décidé qu'à des fins de démonstration, j'irais avec un nombre sûr de cinquante villes de type touristique en Europe. Cela me permet de faire plusieurs appels par jour pour chaque ville et de gérer les demandes échouées sans risquer de perdre le droit d'utiliser l'API. Je devrais commencer à payer pour avoir suffisamment de demandes pour couvrir la plupart des villes du monde.

L'objectif final du projet serait d'avoir des données météorologiques Spark Crunch pour toutes les villes du monde (~ 50 000) multipliées par dix jours de données de prévision et de les exécuter plusieurs fois par jour pour que les prévisions soient aussi précises que possible.
Tout le code Spark réside dans un cahier Jupyter. Jusqu'à présent, il n'y a pas d'autre moyen d'exécuter des tâches Spark. Les données météorologiques brutes sont lues à partir de la base de données Cloudant, traitées et réécrites.
Base de données NoSQL Cloudant
Bref, j'ai trouvé très agréable de travailler avec Cloudant NoSQL DB. Il est facile à utiliser et possède une bonne interface utilisateur basée sur un navigateur. Il n'y a pas de pilote en tant que tel, mais il a une API REST simple et il était simple d'interagir avec via HTTP.
Cependant, Bluemix Spark inclut une API Cloudant Data Sources, qui peut être utilisée pour lire et écrire dans Cloudant sans avoir besoin d'appels de bas niveau. Il est à noter qu'il n'est pas possible de créer une nouvelle base de données dans Cloudant à partir de Spark, elle doit donc être créée au préalable, par exemple avec l'interface utilisateur Web.
Cadre de jeu
L'application web est écrite en Scala. C'est très simple. Le contrôleur sert une application d'une page avec AngularJS et Bootstrap, et le service interagit avec l'API Weather et Cloudant.
Un défi intéressant auquel j'ai été confronté est directement lié à IBM Container Service. Mon intention était d'exécuter l'application sur le port 80 afin qu'elle soit conviviale. Cependant, je n'ai trouvé aucun moyen dans Bluemix d'utiliser le transfert de port Docker et de mapper le port externe 80 sur le port interne Docker 9000 de l'application Play. Ma solution de contournement consistait à exécuter en tant que root à l'intérieur du conteneur (pratique non recommandée) et à modifier le fichier application.conf de Play :
# Production port play.server.http.port = "80"
Docker
Docker s'est avéré très utile, en particulier au moment du déploiement sur Bluemix. Je n'avais pas besoin de connaître les applications Cloud Foundry, de m'inquiéter des buildpacks Scala ou de quoi que ce soit d'autre. Je pourrais simplement pousser mon image Docker et la voir fonctionner.
Pour créer l'image Docker, j'ai utilisé un plugin Typesafe Docker, donc je n'avais même pas besoin d'un fichier Dockerfile approprié.
Il suffit de quelques commandes pour voir l'application s'exécuter dans le cloud après une courte configuration initiale :
# log in to IBM Bluemix cf login cf ic login # create the image locally sbt docker:publishLocal # rename it docker tag -f my-perfect-weather:1.0-SNAPSHOT registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0 # push it docker push registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0 # and run it cf ic run --name my-perfect-weather -p 80 -m 2048 registry.ng.bluemix.net/radek1st/my-perfect-weather:1.0
Il convient de noter que le service de conteneur Bluemix effectue une évaluation de la vulnérabilité sur les images avant qu'elles ne puissent être exécutées. Même si cela n'avait pas vraiment de sens pour mon application, je devais quand même corriger /etc/login.defs
de l'image parente, afin qu'elle puisse être exécutée. Voici le Dockerfile si vous êtes intéressé.
Défis que j'ai rencontrés
Comme Spark est encore un ajout assez récent à IBM Bluemix, il a certaines limites. Actuellement, le code ne peut être exécuté que dans le cadre d'un bloc-notes, il n'y a donc aucun moyen de planifier les exécutions. Ce fut toute une découverte à la fin du temps que j'avais pour le hackathon. Ce que cela signifie pour My Perfect Weather , c'est que les jours météorologiques présentés seront lentement obsolètes si le bloc-notes Spark n'est pas réexécuté manuellement . J'espère qu'IBM remédiera rapidement à cette lacune.
J'ai également rencontré une petite inexactitude dans la documentation de l'API Insights for Weather qui est apparue après avoir remarqué quelques problèmes avec les résultats affichés. Pour le type de précipitation , les seules valeurs attendues étaient la pluie et la neige , mais j'ai également trouvé une troisième valeur précip . D'après le contexte météorologique, il semble indiquer de la pluie avec de la neige, donc pour la simplicité de l'application, il est traité comme de la neige.
Réalisations dont je suis fier
Je pense que My Perfect Weather est une idée plutôt cool, et je suis fier d'avoir pu la mettre en œuvre très rapidement en mélangeant toutes ces technologies. C'est néanmoins un hack, avec de nombreux détails, mais le plus important, c'est que ça marche !
Ce que j'ai appris
J'ai beaucoup appris au cours de ce court projet. J'étais nouveau sur IBM Bluemix, donc c'était une aventure en soi.
Je n'ai jamais entendu parler de Cloudant DB auparavant, mais avec une certaine expérience de MongoDB, la transition a été plutôt facile.
J'ai aussi appris que je ne devrais pas travailler sur une interface. Je suis un développeur backend dans l'âme, sans le talent pour rendre les choses belles, donc travailler avec Bootstrap et CSS était un exercice de recherche-copier-coller-modifier. Un grand merci à ma femme pour son aide dans la conception, les visuels, la démonstration et les conseils généraux.
Quelle est la prochaine étape pour My Perfect Weather
J'aimerais ajouter plus de contrôles météorologiques et les étendre pour couvrir la majeure partie du monde, ou du moins toute l'Europe dans un proche avenir. Avec plus de villes/jours météorologiques correspondant aux critères, il sera plus difficile de présenter les jours les plus parfaits, il est donc possible d'utiliser Spark MLlib avec Spark Streaming pour les données provenant des sessions des utilisateurs.
J'espère qu'IBM ajoutera bientôt une capacité de planification des travaux Spark, afin que le service puisse devenir entièrement automatisé.
Conclusion
Vous pouvez consulter l'application par vous-même sur votre ordinateur, votre smartphone ou votre tablette en naviguant sur myperfectweather.eu.
Si vous voulez avoir un aperçu du code, il est hébergé sur Github.
My Perfect Weather a été créé en tant que projet concurrent pour IBM Sparkathon avec près de 600 participants. Il a remporté le Grand Prix et le Fan Favorite. Consultez la page du projet si vous souhaitez en savoir plus.