V dveh prejšnjih člankih sem predstavil občinstvo Apache Spark in Docker . Prišel je čas, da sem vam pokazal popolnoma funkcionalno aplikacijo, ki vključuje obe prej omenjeni tehnologiji.
Motivacija je 'deževala z neba v obliki podatkov', sprožil pa jo je hackathon, ki ga je organiziral IBM. Sparkatonov Cilj je bil uporabiti vremenske podatke in Analytics za Apache Spark za IBM Bluemix za izdelavo mobilnih aplikacij, povezanih z vremenom.
IBM je močno vlaganje v Spark , nedavno pa je kupila digitalni del Vremenski kanal . Posledično se zdi ta dogodek kot nalašč za njihovo oglaševanje.
Ste se kdaj pritoževali nad vremenom na vaši lokaciji, imeli nekaj načrtovanega prostega časa in denarja, ki bi ga lahko porabili, pa niste vedeli kje iti? Če je odgovor pritrdilen, bi vam res bil všeč Moje popolno vreme app.
Za ponazoritev, kako lahko aplikacijo uporabljamo, je nekaj primerov uporabe:
Ideja storitve je zelo preprosta. Najprej določite, kaj za vas v danem trenutku pomeni popolno vreme. Trenutno lahko filtrirate po temperaturi, hitrosti vetra, vrsti padavin in verjetnosti padavin, kot je prikazano na spodnjem posnetku zaslona. Nato storitev opravi vse ostalo in predstavljeni vam bodo najustreznejši cilji. Rezultati so razvrščeni po številu popolnih dni, tistih, ki ustrezajo prvotni poizvedbi, najdeni za vsako mesto in omejeni na prvih pet. Popolni dnevi so zaznamovani tudi z drugačnim ozadjem.
Poglejmo, kako bi lahko storitev uporabili za primere uporabe, opredeljene v prejšnjem razdelku.
Če želite, lahko enostavno preverite, kako priti do izbranega cilja, saj je aplikacija vgrajena s storitvijo za iskanje potovanj Momondo.
V bistvu vse, razen zunanje storitve iskanja potovanj, deluje znotraj platforme IBM Bluemix.
IBM je vsem udeležencem hackathona ponudil brezplačno preskusno različico, zato mi ni bilo treba skrbeti, kje naj zaženem aplikacijo.
Poglejmo, kako se podatki pretakajo v aplikaciji in kako se sestavljajo komponente, predstavljene v diagramu arhitekture.
Aplikacija Play gostuje v vsebniku Dockerja. Ena od njegovih storitev lahko vzpostavi stik z vremensko službo in prenese 10-dnevno napoved v Cloudant. V koraku po prenosu Spark prebere neobdelane vremenske podatke iz Cloudanta, jih obdela in shrani nazaj v Cloudant za hiter in enostaven dostop aplikacije Play.
Ko se uporabniki pomaknejo na glavno stran aplikacije, se jim prikaže obrazec, ki vsebuje različne kontrole za določitev njihovega popolnega vremena. Njihov vložek se pošlje v ozadje, ki poišče Cloudant za mesta, ki vsebujejo popolne dni. Nato se izvede še ena poizvedba za vseh deset dni napovedi za mesta, vrnjena v prejšnji poizvedbi. Pridobljeni rezultati so predstavljeni uporabnikom, celice pa predstavljajo vremenske razmere na mesto na dan. Zadnja celica vsakega mesta vsebuje povezavo do potovalne storitve. S klikom nanj bodo uporabniki preusmerjeni na spletno mesto Momondo, obrazec za iskanje leta pa bo vnaprej izpolnjen z datumom cilja in potovanja. Če je uporabnik storitev uporabljal že prej (in je v svojem brskalniku shranil piškotek), bosta morda tudi predhodno izpolnjena izvor in količina potnikov. Seveda lahko polja na tem obrazcu spremenite. Na primer, lahko poskusite z različnimi datumi potovanja v iskanju boljše vozovnice.
Tako je zgrajena aplikacija. V naslednjih razdelkih so podrobneje opisane nekatere komponente.
Prva faza projekta je bila namenjena ugotavljanju delovanja API-ja za vreme in drugih storitev Bluemix, sledilo pa je začetno raziskovanje vremenskih podatkov s pomočjo Sparka. Sporočil mi je, kako deluje podatkovni model in kako ga lahko uporabim v aplikaciji.
Za namen te aplikacije se uporablja samo prva izmed naslednjih končnih točk API-ja Weather REST:
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
Končna točka se vpraša za vremensko napoved za vsako mesto, ki nas zanima, z navedbo a geokoda parameter, ki zajema zemljepisno širino in dolžino zadevnega kraja.
Zaradi narave storitve je število zahtevkov za API za vreme povezano s številom podprtih mest. Upošteval sem brezplačno omejitev Insights for Weather Service, ki je znašala 500 klicev na dan, in se odločil, da bom za demo namen šel z varnimi petdesetimi mesti turističnega tipa v Evropi. Tako lahko dnevno opravim več klicev za vsako mesto in obravnavam neuspele zahteve, ne da bi izgubil pravico do uporabe API-ja. Moral bi začeti plačevati, da bi imel dovolj prošenj za pokrivanje večine mest na svetu.
Končni cilj projekta bi bil, da bi vremenske podatke Spark za vsa mesta na svetu (~ 50.000) pomnožili z desetdnevnimi napovednimi podatki in jih izvedli večkrat na dan, da bi bile napovedi čim bolj natančne.
Vsa koda Spark je v a Jupyter zvezek. Za zdaj ni drugega načina za izvajanje del Spark. Neobdelani vremenski podatki se berejo iz Cloudant DB, obdelujejo in zapisujejo nazaj.
Skratka, zelo prijetno se mi je delalo z Cloudant NoSQL DB. Je enostaven za uporabo in ima dober uporabniški vmesnik, ki temelji na brskalniku. Gonilnika kot takega ni, ima pa preprost REST API in interakcija prek HTTP je bila preprosta.
Vendar Bluemix Spark vključuje API za podatkovne vire Cloudant, ki ga lahko uporabljamo za branje in pisanje v Cloudant brez potrebe po nizkih klicih. Omeniti velja, da v programu Cloudant iz Sparka ni mogoče ustvariti nove baze podatkov, zato jo je treba ustvariti vnaprej, na primer s spletnim uporabniškim vmesnikom.
Spletna aplikacija je napisana v Scali. Zelo preprosto je. Krmilnik ponuja enostransko aplikacijo z AngularJS in Bootstrap, storitev pa je v interakciji z Weather API in Cloudant.
Zanimiv izziv, s katerim sem se soočil, je neposredno povezan s storitvijo IBM Container Service. Moj namen je bil zagnati aplikacijo na vratih 80, tako da je uporabniku prijazna. Vendar v Bluemixu nisem mogel najti nobene možnosti za posredovanje vrat Docker in preslikati zunanja vrata 80 na notranja vrata Docker 9000 aplikacije Play. Moja rešitev je bila, da tečem kot koren znotraj vsebnika (ni priporočljivo) in za urejanje aplikacije Play.conf:
# Production port play.server.http.port = '80'
Docker je bil zelo priročen, še posebej v času uvajanja v Bluemix. Ni mi bilo treba vedeti o aplikacijah Cloud Foundry Apps, skrbeti za Scala buildpacks ali kaj drugega. Lahko bi samo potisnil svojo sliko Dockerja in videl, kako se izvaja.
Za ustvarjanje slike Dockerja sem uporabil Typesafe Docker vtičnik , zato nisem potreboval niti ustrezne datoteke Docker.
Za ogled aplikacije, ki se izvaja v oblaku, po kratki začetni konfiguraciji potrebujete le nekaj ukazov:
# 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
Omeniti velja, da storitev za zabojnike Bluemix izvede oceno ranljivosti slik, preden jih je mogoče zagnati. Čeprav za mojo aplikacijo v resnici ni bilo smiselno, sem vseeno moral popraviti /etc/login.defs
nadrejene slike, tako da jo je mogoče zagnati. Tukaj je Dockerfile če vas zanima.
Ker je Spark še vedno svež dodatek k IBM Bluemixu, ima nekatere omejitve. Trenutno je kodo mogoče izvršiti samo kot del zvezka, zato ni mogoče razporediti zagonov. To je bilo ob koncu mojega hackathona precej odkritje. Kaj pomeni Moje popolno vreme je, da bodo predstavljeni vremenski dnevi počasi zastareli, če se prenosni računalnik Spark ne zažene znova ročno . Upam, da bo IBM to pomanjkljivost odpravil takoj.
Prav tako sem naletel na majhno netočnost v dokumentaciji API-ja Insights for Weather, ki se je pojavila, ko je opazila nekatere težave s prikazanimi rezultati. Za vrsta padavin , edine pričakovane vrednosti so bile dež in sneg , vendar sem našel tudi tretjo vrednost precip . Iz vremenskega konteksta kaže, da kaže na dež s snegom, zato ga zaradi enostavnosti aplikacije obravnavamo kot sneg.
mislim Moje popolno vreme je zelo dobra ideja in ponosen sem, da bi jo lahko zelo hitro uvedel, tako da bi združil vse te različne tehnologije. Kljub temu je kramp, z veliko ohlapnimi konci, a najpomembneje je, da deluje!
V tem kratkem projektu sem se veliko naučil. V IBM Bluemixu sem bil nov, zato je bila to samostojna pustolovščina.
Še nikoli nisem slišal za Cloudant DB, toda z nekaj izkušnjami z MongoDB je bil prehod precej enostaven.
Naučil sem se tudi, da ne bi smel delati na fronti. Sem srčni razvijalec po srcu, brez talent, da stvari izgledajo lepo , zato je bilo delo z Bootstrapom in CSS vaja iskanje-kopiranje-lepljenje-spreminjanje. Najlepša hvala moji ženi za pomoč pri oblikovanju, vizualnih predstavitvah, predstavitvah in splošnih nasvetih.
Rad bi dodal več vremenskih kontrol in jih v bližnji prihodnosti razširil tako, da bo zajel večino sveta ali vsaj vso Evropo. Z več mesti / vremenskimi dnevi, ki ustrezajo merilom, bo zahtevnejše predstaviti najbolj popolne dni, zato obstaja možnost uporabe Spark MLlib s Spark Streaming za podatke, ki prihajajo iz sej uporabnikov.
Upam, da bo IBM kmalu dodal možnost razporejanja delovnih mest Spark, tako da bo storitev lahko popolnoma avtomatizirana.
Aplikacijo si lahko sami ogledate v računalniku, pametnem telefonu ali tabličnem računalniku, tako da se pomaknete do myperfectweather.eu .
Če želite doseči vrhunec pri kodi, jo gosti Github .
My Perfect Weather je nastal kot konkurenčni projekt za IBM Sparkathon s skoraj 600 udeleženci. Dobil je veliko nagrado in priljubljene navijače. Oglejte si stran projekta če bi radi vedeli več.