Come ho usato Apache Spark e Docker in un Hackathon per creare un'app meteo

Pubblicato: 2022-03-11

In due dei miei precedenti articoli, ho presentato al pubblico Apache Spark e Docker. È giunto il momento in cui ti ho mostrato un'applicazione completamente funzionale che include entrambe le tecnologie sopra menzionate.

La motivazione “è piovuta dal cielo sotto forma di dati” ed è stata innescata da un hackathon organizzato da IBM. L'obiettivo di Sparkathon era utilizzare i dati meteorologici e Analytics per Apache Spark per IBM Bluemix per creare applicazioni mobili relative al meteo.

IBM sta investendo molto in Spark e ha recentemente acquistato la parte digitale di The Weather Channel. Di conseguenza, questo evento sembra perfetto per la loro pubblicità.

Ispirazione

Ti sei mai lamentato del tempo nella tua località, hai programmato del tempo libero e del denaro da spendere, ma non sapevi dove andare? Se la risposta è sì, allora ti piacerebbe davvero l'app My Perfect Weather .

Immagine: casi d'uso per l'app.

Solo per illustrare come utilizzare l'app, ecco alcuni casi d'uso:

  1. Hai un bambino con cui hai promesso di far volare un aquilone questa settimana, ma è assolutamente senza vento dove vivi e non vuoi infrangere la tua parola.
  2. Vivi in ​​un luogo ventoso e piovoso come me (Edimburgo, Scozia) e vuoi sentire il calore sulla tua pelle e sicuramente niente pioggia.
  3. Hai voglia di costruire un pupazzo di neve e non ti riposerai finché non lo avrai soddisfatto.
  4. Vuoi andare a pescare e questa volta vuoi davvero prendere qualcosa.

Cosa fa

L'idea alla base del servizio è molto semplice. Innanzitutto, definisci cosa significa per te il tempo perfetto in un dato momento. Attualmente, puoi filtrare per temperatura, velocità del vento, tipo di precipitazioni e probabilità di precipitazioni come mostrato nello screenshot qui sotto. Quindi il servizio fa il resto e ti vengono presentate le migliori destinazioni corrispondenti. I risultati sono ordinati in base al numero di giorni perfetti, quelli corrispondenti alla query originale, trovati per ciascuna città e limitati ai primi cinque. I giorni perfetti sono anche contrassegnati da uno sfondo diverso.

Vediamo come potremmo utilizzare il servizio per i casi d'uso definiti nella sezione precedente.

  1. Imposta il vento tra 16 e 32 km/h, ideale per far volare un aquilone, con poche possibilità di pioggia e temperatura confortevole.
  2. Imposta la temperatura minima in modo che sia abbastanza calda per te, imposta la possibilità di pioggia su 0%.
  3. Imposta la temperatura in modo che sia intorno e inferiore a 0 C, scegli la neve come tipo di precipitazione e la possibilità che le precipitazioni siano elevate.
  4. Imposta la velocità del vento su un valore inferiore a 16 km/h, poca pioggia e nuvole come vuoi per evitare che sia troppo soleggiato e che i pesci vadano più in profondità nell'acqua, temperatura confortevole.

Se lo desideri, puoi facilmente verificare come raggiungere la destinazione prescelta, poiché l'applicazione è integrata con un servizio di ricerca viaggi Momondo.

Come l'ho costruito

Fondamentalmente, tutto tranne il servizio di ricerca viaggi esterno viene eseguito all'interno della piattaforma IBM Bluemix.

IBM ha offerto una prova gratuita a tutti i partecipanti all'hackathon, quindi non dovevo preoccuparmi di dove eseguire l'app.

Vediamo come i dati fluiscono nell'applicazione e come si uniscono i componenti presentati nel diagramma dell'architettura.

L'app Play è ospitata all'interno di un contenitore Docker. Uno dei suoi servizi è in grado di contattare il Servizio Meteo e scaricare le previsioni a 10 giorni in Cloudant. In un passaggio successivo al download, Spark legge i dati meteorologici grezzi da Cloudant, li elabora e li archivia di nuovo in Cloudant per un accesso rapido e semplice da parte dell'applicazione Play.

Quando gli utenti navigano nella pagina principale dell'app, viene loro presentato un modulo contenente vari controlli per definire il loro tempo perfetto. Il loro input viene inviato al back-end che interroga Cloudant per le città che contengono i giorni perfetti. Quindi, viene eseguita un'altra query per tutti i dieci giorni della previsione per le città restituite nella query precedente. I risultati ottenuti vengono presentati agli utenti e le celle rappresentano le condizioni meteorologiche per città al giorno. L'ultima cella per ogni città contiene un collegamento a un servizio di viaggio. Cliccandoci sopra, gli utenti verranno indirizzati al sito web di Momondo e il modulo di ricerca del volo verrà precompilato con la destinazione e le date del viaggio. Se l'utente ha già utilizzato il servizio (e ha memorizzato un cookie nel proprio browser), è possibile che anche l'origine e il numero di viaggiatori siano precompilati. Naturalmente, i campi di questo modulo possono essere modificati. Ad esempio, si possono provare diverse date di viaggio alla ricerca di una tariffa migliore.

Questo è più o meno come viene costruita l'applicazione. Le sezioni seguenti approfondiscono i dettagli di alcuni componenti.

Immagine: componenti dell'app meteo.

Spark e approfondimenti per il tempo

La prima fase del progetto è stata dedicata alla comprensione del funzionamento dell'API Weather e degli altri servizi Bluemix, seguita dall'esplorazione iniziale dei dati meteorologici tramite Spark. Mi ha permesso di capire come funzionava il modello di dati e come potrebbe essere impiegato nell'applicazione.

Ai fini di questa app, vengono utilizzati solo i primi dei seguenti endpoint API REST meteo:

 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

L'endpoint viene interrogato per le previsioni meteo di ogni città di interesse fornendo un parametro di geocodice che prende la latitudine e la longitudine del luogo in questione.

A causa della natura del servizio, il numero di richieste effettuate all'API Weather è correlato al numero di città supportate. Ho preso in considerazione il limite del livello gratuito di Insights for Weather Service che era di 500 chiamate al giorno e ho deciso che, a scopo dimostrativo, avrei scelto un numero sicuro di cinquanta città di tipo turistico in Europa. Questo mi consente di effettuare più chiamate al giorno per ogni città e di gestire le richieste non riuscite senza il rischio di perdere il diritto di utilizzare l'API. Dovrei iniziare a pagare per avere abbastanza richieste per coprire la maggior parte delle città del mondo.

L'obiettivo finale del progetto sarebbe avere i dati meteorologici Spark crunch per tutte le città del mondo (~50.000) moltiplicati per dieci giorni di dati di previsione ed eseguirli più volte al giorno per avere le previsioni il più accurate possibile.

Tutto il codice Spark risiede in un notebook Jupyter. Finora non c'è altro modo per eseguire i lavori Spark. I dati meteorologici grezzi vengono letti da Cloudant DB, elaborati e riscritti.

Cloudant NoSQL DB

In breve, ho trovato molto piacevole lavorare con Cloudant NoSQL DB. È facile da usare e ha una buona interfaccia utente basata su browser. Non esiste un driver in quanto tale, ma ha una semplice API REST ed è stato semplice interagire con HTTP.

Tuttavia, Bluemix Spark include un'API Cloudant Data Sources, che può essere utilizzata per leggere e scrivere su Cloudant senza la necessità di chiamate di basso livello. Vale la pena notare che non è possibile creare un nuovo database in Cloudant da Spark quindi deve essere creato in anticipo, ad esempio con l'interfaccia utente web.

Struttura del gioco

L'applicazione web è scritta in Scala. È molto semplice. Il controller offre un'app di una pagina con AngularJS e Bootstrap e il servizio interagisce con l'API Weather e Cloudant.

Una sfida interessante che ho dovuto affrontare è direttamente correlata all'IBM Container Service. La mia intenzione era quella di eseguire l'app sulla porta 80, quindi è facile da usare. Tuttavia, non sono riuscito a trovare alcun modo in Bluemix per utilizzare il port forwarding Docker e mappare la porta esterna 80 sulla porta interna Docker 9000 dell'app Play. La mia soluzione era eseguire come root all'interno del contenitore (pratica non consigliata) e modificare application.conf di Play:

 # Production port play.server.http.port = "80"

Docker

Docker è stato davvero utile, soprattutto al momento della distribuzione su Bluemix. Non avevo bisogno di avere alcuna conoscenza delle app Cloud Foundry, di preoccuparmi dei buildpack di Scala o di qualsiasi altra cosa. Potrei semplicemente spingere la mia immagine Docker e vederla in esecuzione.

Per creare l'immagine Docker, ho usato un plug-in Docker Typesafe, quindi non avevo nemmeno bisogno di un Dockerfile adeguato.

Bastano pochi comandi per vedere l'app in esecuzione nel cloud dopo una breve configurazione iniziale:

 # 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

Vale la pena notare che il Bluemix Container Service esegue una valutazione della vulnerabilità sulle immagini prima che possano essere eseguite. Anche se non aveva davvero senso per la mia app, dovevo comunque patchare /etc/login.defs dell'immagine genitore, in modo che possa essere eseguito. Ecco il Dockerfile se sei interessato.

Sfide in cui mi sono imbattuto

Poiché Spark è ancora una nuova aggiunta a IBM Bluemix, presenta alcune limitazioni. Attualmente, il codice può essere eseguito solo come parte di un notebook, quindi non c'è modo di programmare le esecuzioni. Questa è stata una bella scoperta alla fine del tempo che ho avuto per l'hackathon. Ciò che significa per My Perfect Weather è che i giorni meteorologici presentati diventeranno lentamente obsoleti se il notebook Spark non viene eseguito nuovamente manualmente . Spero che IBM affronterà prontamente questa lacuna.

Mi sono anche imbattuto in una piccola imprecisione nella documentazione dell'API Insights for Weather che è emersa dopo aver notato alcuni problemi con i risultati visualizzati. Per il tipo di precipitazione , gli unici valori previsti erano pioggia e neve , ma ho trovato anche un terzo valore precip . Dal contesto meteo, sembra indicare pioggia con neve, quindi per semplicità dell'app viene trattata come neve.

Realizzazioni di cui sono orgoglioso

Immagine: utilizzo di Docker e Spark nell'app meteo.

Penso che My Perfect Weather sia un'idea piuttosto interessante e sono orgoglioso di averlo potuto implementare molto rapidamente unendo insieme tutte queste varie tecnologie. È comunque un trucco, con molte questioni in sospeso, ma la cosa più importante è che funzioni!

Quello che ho imparato

Ho imparato molto durante questo breve progetto. Ero nuovo di IBM Bluemix, quindi è stata un'avventura a sé stante.

Non ho mai sentito parlare di Cloudant DB prima, ma con una certa esperienza di MongoDB la transizione è stata piuttosto semplice.

Ho anche imparato che non dovrei lavorare su un frontend. Sono uno sviluppatore back-end nel cuore, senza il talento per rendere le cose belle, quindi lavorare con Bootstrap e CSS è stato un esercizio di ricerca-copia-incolla-modifica. Molte grazie a mia moglie per aver aiutato con il design, la grafica, la demo e i consigli generali.

Quali sono le prospettive di My Perfect Weather

Vorrei aggiungere più controlli meteorologici ed estenderlo a coprire la maggior parte del mondo, o almeno tutta l'Europa nel prossimo futuro. Con più città/giorni meteorologici che corrispondono ai criteri, sarà più difficile presentare i giorni più perfetti, quindi è possibile utilizzare Spark MLlib con Spark Streaming per i dati provenienti dalle sessioni degli utenti.

Spero che IBM aggiunga presto una funzionalità di pianificazione dei lavori Spark, in modo che il servizio possa diventare completamente automatizzato.

Conclusione

Puoi controllare tu stesso l'applicazione sul tuo computer, smartphone o tablet navigando su myperfectweather.eu.

Se vuoi avere un'idea del codice, è ospitato su Github.

My Perfect Weather è stato creato come progetto in competizione per IBM Sparkathon con quasi 600 partecipanti. Ha vinto il Grand Prize e il Fan Favorite. Controlla la pagina del progetto se vuoi saperne di più.