Wie ich Apache Spark und Docker in einem Hackathon verwendet habe, um eine Wetter-App zu erstellen

Veröffentlicht: 2022-03-11

In zwei meiner vorherigen Artikel habe ich dem Publikum Apache Spark und Docker vorgestellt. Es ist an der Zeit, Ihnen eine voll funktionsfähige Anwendung zu zeigen, die beide oben genannten Technologien enthält.

Die Motivation „regnete in Form von Daten vom Himmel“ und wurde durch einen von IBM organisierten Hackathon entfacht. Das Ziel von Sparkathon bestand darin, Wetterdaten und Analysen für Apache Spark für IBM Bluemix zu nutzen, um wetterbezogene mobile Anwendungen zu erstellen.

IBM investiert stark in Spark und hat kürzlich einen digitalen Teil von The Weather Channel gekauft. Infolgedessen scheint diese Veranstaltung perfekt für ihre Werbung zu sein.

Inspiration

Haben Sie sich schon einmal über das Wetter an Ihrem Standort beschwert, hatten eine geplante Auszeit und Geld zum Ausgeben, wussten aber nicht, wohin Sie gehen sollten? Wenn die Antwort ja ist, dann würde Ihnen die My Perfect Weather App wirklich gefallen.

Bild: Anwendungsfälle für die App.

Nur um zu veranschaulichen, wie die App verwendet werden könnte, hier sind einige Anwendungsfälle:

  1. Sie haben ein Kind, dem Sie versprochen haben, diese Woche einen Drachen steigen zu lassen, aber es ist absolut windstill, wo Sie leben, und Sie wollen Ihr Wort nicht brechen.
  2. Sie leben an einem windigen und regnerischen Ort wie ich (Edinburgh, Schottland) und möchten Wärme auf Ihrer Haut spüren und auf keinen Fall regnen.
  3. Sie haben den Drang, einen Schneemann zu bauen, und Sie werden nicht ruhen, bis Sie ihn erfüllt haben.
  4. Du willst angeln gehen, und dieses Mal willst du wirklich etwas fangen.

Was es macht

Die Idee hinter dem Service ist ganz einfach. Zunächst definieren Sie, was perfektes Wetter zu einem bestimmten Zeitpunkt für Sie bedeutet. Derzeit können Sie nach Temperatur, Windgeschwindigkeit, Niederschlagsart und Niederschlagswahrscheinlichkeit filtern, wie im folgenden Screenshot gezeigt. Dann erledigt der Service den Rest und Ihnen werden die am besten passenden Reiseziele präsentiert. Die Ergebnisse werden nach der Anzahl der perfekten Tage sortiert, die mit der ursprünglichen Suchanfrage übereinstimmen, für jede Stadt gefunden und auf die Top 5 beschränkt. Perfekte Tage werden auch mit einem anderen Hintergrund markiert.

Sehen wir uns an, wie wir den Dienst für die im vorherigen Abschnitt definierten Anwendungsfälle verwenden könnten.

  1. Stellen Sie den Wind zwischen 16 und 32 km/h ein, ideal zum Fliegen eines Drachens, mit einer geringen Regenwahrscheinlichkeit und einer angenehmen Temperatur.
  2. Stellen Sie die minimale Temperatur so ein, dass sie warm genug für Sie ist, stellen Sie die Regenwahrscheinlichkeit auf 0 % ein.
  3. Stellen Sie die Temperatur auf etwa und unter 0 C ein, wählen Sie Schnee als Niederschlagsart und die Niederschlagswahrscheinlichkeit auf hoch.
  4. Stellen Sie die Windgeschwindigkeit auf weniger als 16 km/h, wenig Regen und Wolken ein, da Sie vermeiden möchten, dass es zu sonnig ist, und lassen Sie die Fische tiefer ins Wasser gehen, angenehme Temperatur.

Wenn Sie möchten, können Sie ganz einfach nachsehen, wie Sie zu Ihrem ausgewählten Ziel gelangen, da die Anwendung in den Reisesuchdienst Momondo integriert ist.

Wie ich es gebaut habe

Im Grunde läuft alles außer dem externen Reisesuchdienst innerhalb der IBM Bluemix-Plattform.

IBM bot allen Teilnehmern des Hackathons eine kostenlose Testversion an, sodass ich mir keine Gedanken darüber machen musste, wo ich die App ausführen sollte.

Sehen wir uns an, wie die Daten in der Anwendung fließen und wie die im Architekturdiagramm dargestellten Komponenten zusammenkommen.

Die Play-App wird in einem Docker-Container gehostet. Einer seiner Dienste ist in der Lage, den Wetterdienst zu kontaktieren und die 10-Tage-Vorhersage in Cloudant herunterzuladen. In einem Schritt nach dem Download liest Spark die rohen Wetterdaten von Cloudant, verarbeitet sie und speichert sie für den schnellen und einfachen Zugriff durch die Play-Anwendung zurück in Cloudant.

Wenn Benutzer zur Hauptseite der App navigieren, wird ihnen ein Formular angezeigt, das verschiedene Steuerelemente enthält, um ihr perfektes Wetter zu definieren. Ihre Eingabe wird an das Backend übermittelt, das Cloudant nach Städten mit den perfekten Tagen abfragt. Dann wird eine weitere Abfrage für alle zehn Tage der Vorhersage für die Städte durchgeführt, die in der vorherigen Abfrage zurückgegeben wurden. Die erhaltenen Ergebnisse werden den Benutzern präsentiert und die Zellen stellen die Wetterbedingungen pro Stadt und Tag dar. Die letzte Zelle für jede Stadt enthält einen Link zu einem Reisedienst. Wenn Sie darauf klicken, werden die Benutzer zur Momondo-Website weitergeleitet und das Flugsuchformular wird mit dem Reiseziel und den Reisedaten vorbelegt. Wenn der Benutzer den Dienst bereits verwendet hat (und ein Cookie in seinem Browser gespeichert hat), können auch die Herkunft und die Anzahl der Reisenden vorausgefüllt werden. Natürlich können die Felder auf diesem Formular geändert werden. Beispielsweise kann man verschiedene Reisedaten auf der Suche nach einem besseren Tarif ausprobieren.

So ungefähr ist die Anwendung aufgebaut. Die folgenden Abschnitte gehen detaillierter auf einige der Komponenten ein.

Bild: Komponenten der Wetter-App.

Spark und Insights für das Wetter

In der ersten Phase des Projekts wurde herausgefunden, wie die Wetter-API und die anderen Bluemix-Dienste funktionieren, gefolgt von der anfänglichen Wetterdatenexploration mit Spark. Dadurch konnte ich verstehen, wie das Datenmodell funktionierte und wie es in der Anwendung eingesetzt werden konnte.

Für die Zwecke dieser App wird nur der erste der folgenden Wetter-REST-API-Endpunkte verwendet:

 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

Der Endpunkt wird für die Wettervorhersage für jede interessierende Stadt abgefragt, indem ein Geocode- Parameter bereitgestellt wird, der den Breiten- und Längengrad des betreffenden Ortes übernimmt.

Aufgrund der Art des Dienstes korreliert die Anzahl der an die Wetter-API gestellten Anfragen mit der Anzahl der unterstützten Städte. Ich überlegte mir das kostenlose Kontingent von Insights for Weather Service, das 500 Anrufe pro Tag betrug, und entschied, dass ich zu Demozwecken eine sichere Anzahl von fünfzig touristischen Städten in Europa wählen würde. Dadurch konnte ich für jede Stadt mehrere Anrufe pro Tag tätigen und fehlgeschlagene Anfragen bearbeiten, ohne Gefahr zu laufen, das Recht zur Nutzung der API zu verlieren. Ich müsste anfangen zu bezahlen, um genügend Anfragen zu haben, um die meisten Städte der Welt abzudecken.

Das endgültige Ziel des Projekts wäre es, Spark-Crunch-Wetterdaten für alle Städte der Welt (~50.000) mit Vorhersagedaten von zehn Tagen zu multiplizieren und mehrmals täglich durchzuführen, um die Vorhersagen so genau wie möglich zu machen.

Der gesamte Spark-Code befindet sich in einem Jupyter-Notebook. Bisher gibt es keine andere Möglichkeit, Spark-Jobs auszuführen. Die Rohwetterdaten werden aus Cloudant DB gelesen, verarbeitet und zurückgeschrieben.

Cloudant NoSQL-DB

Kurz gesagt, ich fand es sehr angenehm, mit Cloudant NoSQL DB zu arbeiten. Es ist einfach zu bedienen und hat eine gute browserbasierte Benutzeroberfläche. Es gibt keinen Treiber als solchen, aber er hat eine einfache REST-API und es war einfach, mit ihm über HTTP zu interagieren.

Bluemix Spark enthält jedoch eine Cloudant-Datenquellen-API, die zum Lesen und Schreiben in Cloudant verwendet werden kann, ohne dass Low-Level-Aufrufe erforderlich sind. Es ist erwähnenswert, dass es nicht möglich ist, eine neue Datenbank in Cloudant von Spark aus zu erstellen, also muss sie vorher erstellt werden, zum Beispiel mit der Web-Benutzeroberfläche.

Rahmen spielen

Die Webanwendung ist in Scala geschrieben. Es ist sehr einfach. Der Controller bedient eine One-Page-App mit AngularJS und Bootstrap, und der Dienst interagiert mit der Wetter-API und Cloudant.

Eine interessante Herausforderung, der ich gegenüberstand, steht in direktem Zusammenhang mit dem IBM Container Service. Meine Absicht war es, die App auf Port 80 auszuführen, damit sie benutzerfreundlich ist. Ich konnte jedoch in Bluemix keine Möglichkeit finden, die Docker-Portweiterleitung zu verwenden und den externen Port 80 dem internen Docker-Port 9000 der Play-App zuzuordnen. Meine Problemumgehung bestand darin, als Root innerhalb des Containers ausgeführt zu werden (keine empfohlene Vorgehensweise) und die application.conf von Play zu bearbeiten:

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

Docker

Docker war wirklich praktisch, besonders zum Zeitpunkt der Bereitstellung auf Bluemix. Ich musste keine Kenntnisse über Cloud Foundry Apps haben, mir keine Gedanken über Scala-Buildpacks oder irgendetwas anderes machen. Ich könnte einfach mein Docker-Image pushen und sehen, wie es läuft.

Für die Erstellung des Docker-Images habe ich ein Typesafe-Docker-Plugin verwendet, sodass ich nicht einmal eine richtige Docker-Datei benötigte.

Es bedarf nur weniger Befehle, um nach einer kurzen Erstkonfiguration die App in der Cloud laufen zu sehen:

 # 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

Es ist erwähnenswert, dass der Bluemix Container Service eine Schwachstellenbewertung für die Images durchführt, bevor sie ausgeführt werden können. Auch wenn es für meine App nicht wirklich sinnvoll war, musste ich dennoch /etc/login.defs des übergeordneten Images patchen, damit es ausgeführt werden kann. Hier ist das Dockerfile, wenn Sie interessiert sind.

Herausforderungen, denen ich begegnet bin

Da Spark immer noch eine ziemlich frische Ergänzung zu IBM Bluemix ist, hat es gewisse Einschränkungen. Derzeit kann der Code nur als Teil eines Notebooks ausgeführt werden, daher gibt es keine Möglichkeit, die Läufe zu planen. Das war eine ziemliche Entdeckung am Ende der Zeit, die ich für den Hackathon hatte. Für My Perfect Weather bedeutet dies, dass die angezeigten Wettertage langsam veralten, wenn das Spark-Notizbuch nicht manuell erneut ausgeführt wird. Ich hoffe, dass IBM diesen Mangel zeitnah beheben wird.

Ich bin auch auf eine kleine Ungenauigkeit in der Dokumentation der Insights for Weather API gestoßen, die auftauchte, nachdem ich einige Probleme mit den angezeigten Ergebnissen bemerkt hatte. Für die Niederschlagsart waren die einzigen erwarteten Werte Regen und Schnee , aber ich habe auch einen dritten Wert Niederschlag gefunden . Aus dem Wetterkontext scheint es Regen mit Schnee anzuzeigen, daher wird es der Einfachheit halber in der App als Schnee behandelt.

Leistungen, auf die ich stolz bin

Bild: Verwendung von Docker und Spark in der Wetter-App.

Ich denke, My Perfect Weather ist eine ziemlich coole Idee, und ich bin stolz darauf, dass ich es sehr schnell umsetzen konnte, indem ich all diese verschiedenen Technologien miteinander kombiniert habe. Es ist trotzdem ein Hack mit vielen losen Enden, aber das Wichtigste ist, dass es funktioniert!

Was ich gelernt habe

Ich habe während dieses kurzen Projekts eine Menge gelernt. Ich war neu bei IBM Bluemix, also war es ein Abenteuer für sich.

Ich habe noch nie von Cloudant DB gehört, aber mit etwas Erfahrung mit MongoDB war der Übergang ziemlich einfach.

Ich habe auch gelernt, dass ich nicht an einem Frontend arbeiten sollte. Ich bin im Herzen ein Backend-Entwickler, ohne das Talent, Dinge schön aussehen zu lassen, also war die Arbeit mit Bootstrap und CSS eine Übung zum Suchen, Kopieren, Einfügen und Ändern. Vielen Dank an meine Frau für die Hilfe beim Design, der Grafik, der Demo und der allgemeinen Beratung.

Was kommt als nächstes für My Perfect Weather

Ich würde gerne mehr Wettersteuerungen hinzufügen und es in naher Zukunft auf den größten Teil der Welt oder zumindest ganz Europa ausdehnen. Wenn mehr Städte/Wettertage die Kriterien erfüllen, wird es schwieriger, die perfektesten Tage darzustellen, sodass es einen Spielraum für die Verwendung von Spark MLlib mit Spark Streaming für die Daten gibt, die aus Benutzersitzungen stammen.

Ich hoffe, dass IBM bald eine Funktion zum Planen von Spark-Jobs hinzufügen wird, damit der Dienst vollständig automatisiert werden kann.

Fazit

Sie können die Anwendung selbst auf Ihrem Computer, Smartphone oder Tablet testen, indem Sie zu myperfectweather.eu navigieren.

Wenn Sie einen Blick auf den Code werfen möchten, wird er auf Github gehostet.

My Perfect Weather entstand als Konkurrenzprojekt für IBM Sparkathon mit fast 600 Teilnehmern. Es gewann den Hauptpreis und den Fanfavoriten. Schauen Sie sich die Projektseite an, wenn Sie mehr wissen möchten.