Cum am folosit Apache Spark și Docker într-un Hackathon pentru a crea o aplicație meteo
Publicat: 2022-03-11În două dintre articolele mele anterioare, am prezentat publicului Apache Spark și Docker. A sosit momentul în care v-am arătat o aplicație complet funcțională care include ambele tehnologii menționate mai sus.
Motivația „a plouat din cer sub formă de date” și a fost declanșată de un hackathon organizat de IBM. Obiectivul Sparkathon a fost să utilizeze datele meteo și Analytics pentru Apache Spark pentru IBM Bluemix pentru a construi aplicații mobile legate de vreme.
IBM investește masiv în Spark și a cumpărat recent o parte digitală a The Weather Channel. În consecință, acest eveniment pare perfect pentru publicitatea lor.
Inspirație
V-ați plâns vreodată de vremea din locația dvs., ați avut timp liber planificat și bani de cheltuit, dar nu ați știut unde să mergeți? Dacă răspunsul este da, atunci ți-ar plăcea foarte mult aplicația My Perfect Weather .
Doar pentru a ilustra cum ar putea fi utilizată aplicația, iată câteva cazuri de utilizare:
- Ai un copil cu care ai promis că vei zbura cu un zmeu săptămâna aceasta , dar acolo unde locuiești e absolut fără vânt și nu vrei să-ți încalci cuvântul.
- Locuiești într-un loc vânt și ploios ca mine (Edinburgh, Scoția) și vrei să simți căldură pe piele și cu siguranță fără ploaie.
- Ai dorința de a construi un om de zăpadă și nu te vei odihni până nu-l vei îndeplini.
- Vrei să mergi la pescuit și de data asta chiar vrei să prinzi ceva.
Ce face
Ideea din spatele serviciului este foarte simplă. În primul rând, definiți ce înseamnă vremea perfectă pentru dvs. la un moment dat. În prezent, puteți filtra după temperatură, viteza vântului, tipul de precipitații și probabilitatea de precipitații, așa cum se arată în captura de ecran de mai jos. Apoi serviciul se ocupă de restul și vi se prezintă cele mai potrivite destinații. Rezultatele sunt sortate după numărul de zile perfecte, cele care se potrivesc cu interogarea inițială, găsite pentru fiecare oraș și limitate la primele cinci. Zilele perfecte sunt, de asemenea, marcate cu un fundal diferit.
Să vedem cum am putea folosi serviciul pentru cazurile de utilizare definite în secțiunea anterioară.
- Setați vântul să fie între 16 și 32 km/h, ideal pentru zmeu, cu șanse mici de ploaie și temperatură confortabilă.
- Setați temperatura minimă să fie suficient de caldă pentru dvs., setați șansa de ploaie la 0%.
- Setați temperatura în jurul și sub 0 C, alegeți zăpada ca tip de precipitații și șansa de precipitații să fie mare.
- Setați viteza vântului la mai puțin de 16 km/h, ploaie puțină și nori, deoarece doriți să evitați să fie prea însorit și să lăsați peștii să intre mai adânc în apă, temperatură confortabilă.
Dacă doriți, puteți verifica cu ușurință cum să ajungeți la destinația aleasă, deoarece aplicația este integrată cu un serviciu de căutare de călătorii Momondo.
Cum am construit-o
Practic, totul, cu excepția serviciului extern de căutare a călătoriilor, rulează în interiorul platformei IBM Bluemix.
IBM a oferit o probă gratuită tuturor participanților la hackathon, așa că nu a trebuit să-mi fac griji unde să rulez aplicația.
Să vedem cum circulă datele în aplicație și cum se reunesc componentele prezentate în diagrama arhitecturii.
Aplicația Play este găzduită într-un container Docker. Unul dintre serviciile sale este capabil să contacteze Serviciul Meteorologic și să descarce prognoza pe 10 zile în Cloudant. Într-un pas după descărcare, Spark citește datele meteorologice brute de la Cloudant, le procesează și le stochează înapoi în Cloudant pentru acces rapid și ușor de către aplicația Play.
Când utilizatorii navighează la pagina principală a aplicației, li se prezintă un formular care conține diverse comenzi pentru a-și defini vremea perfectă. Intrarea lor este trimisă backend-ului care interogă Cloudant pentru orașele care conțin zilele perfecte. Apoi, se face o altă interogare pentru toate cele zece zile ale prognozei pentru orașele returnate în interogarea anterioară. Rezultatele obținute sunt prezentate utilizatorilor, iar celulele reprezintă condițiile meteo pe oraș pe zi. Ultima celulă pentru fiecare oraș conține o legătură către un serviciu de călătorie. Făcând clic pe acesta, utilizatorii vor ajunge pe site-ul web Momondo și formularul de căutare a zborului va fi pre-populat cu destinația și datele călătoriei. Dacă utilizatorul a folosit serviciul înainte (și a stocat un cookie în browserul său), originea și numărul de călători ar putea fi, de asemenea, completate în prealabil. Desigur, câmpurile din acest formular pot fi modificate. De exemplu, se poate încerca diferite date de călătorie în căutarea unui tarif mai bun.
Cam așa este construită aplicația. Următoarele secțiuni intră în mai multe detalii ale unora dintre componente.
Spark și perspective pentru vreme
Prima fază a proiectului a fost cheltuită pentru a afla cum funcționează API-ul Weather și celelalte servicii Bluemix și a fost urmată de explorarea inițială a datelor meteo folosind Spark. Mi-a permis să înțeleg cum a funcționat modelul de date și cum ar putea fi folosit în aplicație.
În scopul acestei aplicații, se utilizează numai primul dintre următoarele puncte finale Weather REST API:
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 ObservationPunctul final este interogat pentru prognoza meteo pentru fiecare oraș de interes, furnizând un parametru de geocod care ia latitudinea și longitudinea locului în cauză.
Din cauza naturii serviciului, numărul de solicitări făcute către API-ul Meteo este corelat cu numărul de orașe acceptate. Am luat în considerare limita nivelului gratuit Insights for Weather Service, care era de 500 de apeluri pe zi și am decis că, în scopul demonstrației, voi merge cu un număr sigur de cincizeci de orașe de tip turistic din Europa. Acest lucru mi-a permis să fac mai multe apeluri pe zi pentru fiecare oraș și să gestionez cererile eșuate fără riscul de a pierde dreptul de a utiliza API-ul. Ar trebui să încep să plătesc pentru a avea suficiente cereri pentru a acoperi majoritatea orașelor lumii.

Scopul final al proiectului ar fi ca datele meteorologice Spark crunch pentru toate orașele din lume (~50.000) să fie înmulțite cu zece zile de date de prognoză și să le efectueze de mai multe ori pe zi pentru a avea predicțiile cât mai precise posibil.
Tot codul Spark se află într-un notebook Jupyter. Până acum nu există altă modalitate de a executa joburi Spark. Datele meteorologice brute sunt citite din Cloudant DB, procesate și scrise înapoi.
Cloudant NoSQL DB
Pe scurt, mi s-a părut foarte plăcut să lucrez cu Cloudant NoSQL DB. Este ușor de utilizat și are o interfață de utilizare bună bazată pe browser. Nu există nici un driver ca atare, dar are un API REST simplu și a fost simplu de interacționat prin HTTP.
Cu toate acestea, Bluemix Spark include un API Cloudant Data Sources, care ar putea fi folosit pentru a citi și scrie în Cloudant fără a fi nevoie de apeluri de nivel scăzut. Este de remarcat faptul că nu este posibilă crearea unei noi baze de date în Cloudant din Spark, așa că trebuie creată în prealabil, de exemplu cu interfața web.
Play Framework
Aplicația web este scrisă în Scala. Este foarte simplu. Controlerul servește o aplicație de o pagină cu AngularJS și Bootstrap, iar serviciul interacționează cu Weather API și Cloudant.
O provocare interesantă cu care m-am confruntat este direct legată de IBM Container Service. Intenția mea a fost să rulez aplicația pe portul 80, astfel încât să fie ușor de utilizat. Cu toate acestea, nu am putut găsi nicio modalitate în Bluemix de a utiliza redirecționarea portului Docker și de a mapa portul extern 80 la portul intern Docker 9000 al aplicației Play. Soluția mea a fost să rulez ca root în interiorul containerului (nu o practică recomandată) și să editez aplicația Play.conf:
# Production port play.server.http.port = "80"Docher
Docker a fost foarte util, mai ales la momentul implementării pe Bluemix. Nu trebuia să am cunoștințe despre Cloud Foundry Apps, să-mi fac griji pentru pachetele de compilare Scala sau orice altceva. Aș putea doar să-mi împing imaginea Docker și să o văd rulând.
Pentru a crea imaginea Docker, am folosit un plugin Docker Typesafe, așa că nici măcar nu aveam nevoie de un fișier Dockerfile corespunzător.
Este nevoie de doar câteva comenzi pentru a vedea aplicația rulând în cloud după o scurtă configurație inițială:
# 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 Este de remarcat faptul că Serviciul de containere Bluemix efectuează o evaluare a vulnerabilității imaginilor înainte ca acestea să poată fi rulate. Chiar dacă nu prea avea sens pentru aplicația mea, a trebuit totuși să /etc/login.defs al imaginii părinte, astfel încât să poată fi rulat. Aici este Dockerfile dacă sunteți interesat.
Provocări cu care am întâlnit
Deoarece Spark este încă o nouă adăugare la IBM Bluemix, are anumite limitări. În prezent, codul poate fi executat doar ca parte a unui notebook, astfel încât nu există nicio modalitate de a programa rulările. Aceasta a fost o descoperire destul de mare la sfârșitul timpului pe care l-am avut pentru hackathon. Ceea ce înseamnă pentru vremea mea perfectă este că zilele meteo prezentate vor deveni încetul cu încetul dacă notebook-ul Spark nu este reluat manual . Sper ca IBM să remedieze prompt acest neajuns.
De asemenea, am dat peste o mică inexactitate în documentația API-ului Insights for Weather, care a apărut după ce am observat unele probleme cu rezultatele afișate. Pentru tipul de precipitatii singurele valori asteptate au fost ploaia si zapada , dar am gasit si o a treia valoare a precip . Din contextul meteo, pare să indice ploaie cu zăpadă, așa că pentru simplitatea aplicației este tratată ca zăpadă.
Realizări de care sunt mândru
Cred că vremea mea perfectă este o idee destul de grozavă și sunt mândru că am putut-o implementa foarte repede, combinând toate acele tehnologii diferite. Este totuși un hack, cu multe capete libere, dar cel mai important este că funcționează!
Ce am învățat
Am învățat destul de multe în timpul acestui scurt proiect. Eram nou la IBM Bluemix, așa că a fost o aventură în sine.
Nu am auzit niciodată de Cloudant DB până acum, dar cu ceva experiență cu MongoDB, tranziția a fost destul de ușoară.
De asemenea, am învățat că nu ar trebui să lucrez la un frontend. Sunt un dezvoltator backend la inimă, fără talent de a face lucrurile să arate frumos, așa că lucrul cu Bootstrap și CSS a fost un exercițiu de căutare-copiere-lipire-modificare. Mulțumesc mult soției mele pentru ajutor cu designul, imaginile, demonstrația și sfaturile generale.
Ce urmează pentru vremea mea perfectă
Aș dori să adaug mai multe controale meteo și să le extind pentru a acoperi cea mai mare parte a lumii sau cel puțin toată Europa în viitorul apropiat. Cu mai multe orașe/zile meteo care se potrivesc criteriilor, va fi mai dificil să prezentați cele mai perfecte zile, așa că există o posibilitate de a utiliza Spark MLlib cu Spark Streaming pentru datele care provin din sesiunile utilizatorilor.
Sper că IBM va adăuga în curând capacitatea de programare a joburilor Spark, astfel încât serviciul să poată deveni complet automatizat.
Concluzie
Puteți verifica aplicația pentru dvs. pe computer, smartphone sau tabletă navigând la myperfectweather.eu.
Dacă doriți să aveți un vârf la cod, acesta este găzduit pe Github.
My Perfect Weather a fost creat ca un proiect concurent pentru IBM Sparkathon, cu aproape 600 de participanți. A câștigat Marele Premiu și Favoritul Fanilor. Consultați pagina proiectului dacă doriți să aflați mai multe.
