Oma kahes oma eelmises artiklis tutvustasin publikule Apache Spark ja Docker . Kätte on jõudnud aeg, kus ma näitasin teile täiesti toimivat rakendust, mis sisaldab mõlemat ülalnimetatud tehnoloogiat.
Motivatsioon 'sadas taevast alla andmete kujul' ja selle põhjustas IBMi korraldatud häkaton. Sparkathon Eesmärk oli kasutada ilmastikutingimustega seotud mobiilirakenduste loomiseks IBM Bluemixi Apache Sparki ilmaandmeid ja Analyticsit.
IBM on tugevalt investeerides Sparki ja see ostis hiljuti digitaalse osa Ilmakanal . Seetõttu näib see sündmus nende reklaamimiseks ideaalne.
Kas olete kunagi oma asukohas ilmade üle kurtnud, kas teil oli plaanitud vaba aeg ja raha kulutada, kuid ei teadnud kus minema? Kui vastus on jaatav, siis teile tõesti meeldiks Minu täiuslik ilm rakendus.
Selleks, et illustreerida rakenduse kasutamist, on siin mõned kasutamisjuhud:
Teenuse idee on väga lihtne. Esiteks määrate kindlaks, mida tähendab teie jaoks ideaalne ilm antud ajahetkel. Praegu saate filtreerida temperatuuri, tuule kiiruse, sademete tüübi ja sademete tõenäosuse järgi, nagu on näidatud alloleval ekraanipildil. Siis teenus teeb ülejäänud ja teile kuvatakse kõige paremini sobivad sihtkohad. Tulemused on sorteeritud täiuslike päevade arvu järgi, vastates algsele päringule, leitud iga linna kohta ja piirdudes viie parima hulka. Täiuslikud päevad on tähistatud ka erineva taustaga.
Vaatame, kuidas saaksime teenust kasutada eelmises jaotises määratletud kasutusjuhtumite jaoks.
Soovi korral saate hõlpsalt uurida, kuidas oma valitud sihtkohta jõuda, kuna rakendus on integreeritud reisiotsingu teenusega Momondo.
Põhimõtteliselt töötab kõik peale välise reisiotsingu teenuse IBM Bluemix platvormil.
IBM pakkus kõigile häkatonil osalejatele tasuta prooviversiooni, nii et ma ei pidanud muretsema, kus rakendust käivitada.
Vaatame, kuidas rakenduses andmed liiguvad ja kuidas arhitektuuriskeemil toodud komponendid kokku saavad.
Play rakendus on hostitud Dockeri konteineris. Üks selle teenustest on võimeline ühendust võtma ilmateenistusega ja alla laadima 10-päevase prognoosi Cloudanti. Allalaadimisele järgnevas etapis loeb Spark Cloudanti toored ilmaandmed, töötleb neid ja salvestab need tagasi Cloudanti, et Play rakenduse abil saaksite seda kiiresti ja hõlpsalt juurde pääseda.
Kui kasutajad navigeerivad rakenduse põhilehele, kuvatakse neile ideaalse ilma määratlemiseks vorm, mis sisaldab erinevaid juhtnuppe. Nende sisend edastatakse taustaprogrammile, mis esitab päringu Cloudant linnadele, kus on ideaalsed päevad. Seejärel tehakse uus päring kõigi kümne prognoosipäeva kohta eelmises päringus tagastatud linnade kohta. Saadud tulemused esitatakse kasutajatele ja lahtrid tähistavad ilmastikutingimusi linna kohta päevas. Iga linna viimases lahtris on link reisiteenusega. Sellel klõpsates suunatakse kasutajad Momondo veebisaidile ning lennu otsinguvorm täidetakse eelnevalt koos sihtkoha ja reisikuupäevadega. Kui kasutaja on teenust varem kasutanud (ja see salvestas brauserisse küpsise), võidakse ka reisijate päritolu ja arv eelnevalt täita. Muidugi saab selle vormi välju muuta. Näiteks võib parema hinna otsimiseks proovida erinevaid reisikuupäevi.
See on peaaegu nii, kuidas rakendus on üles ehitatud. Järgmistes jaotistes käsitletakse mõningaid komponente üksikasjalikumalt.
Projekti esimene etapp kulus Weather API ja teiste Bluemixi teenuste toimimise väljaselgitamisele ning sellele järgnes esialgne ilmaandmete uurimine Sparki abil. See andis mulle mõista, kuidas andmemudel toimis ja kuidas seda rakenduses rakendada.
Selle rakenduse jaoks kasutatakse järgmistest Weather REST API lõpp-punktidest ainult esimest:
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õpp-punkti küsitakse iga huvipakkuva linna ilmaprognoosi jaoks, esitades a geokood parameeter, mis võtab arvesse kõnealuse koha laius- ja pikkuskraadi.
Teenuse olemuse tõttu on Weather API-le tehtud taotluste arv korrelatsioonis toetatud linnade arvuga. Kaalusin Insights for Weather Service'i tasuta taseme limiiti, mis oli 500 kõnet päevas, ja otsustasin, et tutvustan demo eesmärgil turvalist arvu viiskümmend turismitüüpi linna Euroopas. See võimaldas mul teha iga linna jaoks mitu kõnet päevas ja käsitleda ebaõnnestunud taotlusi, ilma et oleks oht kaotada API kasutamise õigust. Peaksin hakkama maksma, et mul oleks piisavalt taotlusi enamiku maailma linnade katmiseks.
Projekti lõppeesmärk oleks korrutada kümne päeva prognoosiandmetega Sparki kõigi maailma linnade (~ 50 000) ilmastikuolude ilmateate ja teostada neid mitu korda päevas, et ennustused oleksid võimalikult täpsed.
Kogu Sparki kood asub a Jupyter märkmik. Siiani pole muud võimalust Sparki tööde teostamiseks. Toored ilmaandmed loetakse Cloudant DB-st, töödeldakse ja kirjutatakse tagasi.
Ühesõnaga, minu arvates oli Cloudant NoSQL DB-ga töötamine väga meeldiv. Seda on lihtne kasutada ja sellel on hea brauseripõhine kasutajaliides. Draiverit kui sellist pole, kuid sellel on lihtne REST API ja HTTP kaudu oli suhtlemine lihtne.
Kuid Bluemix Spark sisaldab Cloudant Data Sources API-d, mida saaks kasutada Cloudanti lugemiseks ja kirjutamiseks ilma madalama kõne vajaduseta. Väärib märkimist, et Cloudist ei saa Sparkist uut andmebaasi luua, nii et see tuleb eelnevalt luua, näiteks veebi kasutajaliidese abil.
Veebirakendus on kirjutatud Scalas. See on väga lihtne. Kontroller teenindab ühelehelist rakendust koos AngularJSi ja Bootstrapiga ning teenus suhtleb Weather API ja Cloudantiga.
Üks huvitav väljakutse, millega kokku puutusin, on otseselt seotud IBM-i konteinerteenusega. Minu eesmärk oli käivitada rakendus pordis 80, nii et see oleks kasutajasõbralik. Kuid ma ei leidnud Bluemixist kuidagi võimalust kasutada Dockeri pordi edastamist ja välise pordi 80 kaardistamist Play rakenduse Dockeri sisemisse porti 9000. Minu lahendus pidi jooksma nagu juur konteineri sees (pole soovitatav tava) ja Play rakenduse redigeerimiseks.conf:
# Production port play.server.http.port = '80'
Docker tuli tõesti kasuks, eriti Bluemixi juurutamise ajal. Mul ei olnud vaja teadmisi Cloud Foundry Appsist, muretseda Scala ehituskomplektide ega muu pärast. Ma saaksin lihtsalt oma Dockeri pilti lükata ja seda näha.
Dockeri pildi loomiseks kasutasin Typesafe'i Dockeri pistikprogramm , nii et mul polnud vaja isegi korralikku Dockerfile'i.
Rakenduse pilves töötamise nägemiseks pärast lühikest algset konfigureerimist on vaja ainult mõnda käsku:
# 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
Väärib märkimist, et Bluemix Container Service teostab piltide haavatavuse hindamise enne nende käivitamist. Kuigi minu rakendusel polnud tegelikult mõtet, pidin ikkagi /etc/login.defs
lappima vanempildi osa, nii et seda saab käivitada. Siin on Dockerfile kui olete huvitatud.
Kuna Spark on IBM Bluemixile veel üsna värske lisand, on sellel teatud piirangud. Praegu saab koodi käivitada ainult sülearvuti osana, seega pole jooksu ajastamise võimalust. See oli hackathonile omase aja lõpus üsna avastus. Mida see tähendab Minu täiuslik ilm on see, et esitatud ilmapäevad aeguvad aeglaselt, kui Sparki märkmikku uuesti ei käivitata käsitsi . Loodan, et IBM lahendab selle puuduse kiiresti.
Samuti kohtasin Insights for Weather API dokumentatsioonis väikest ebatäpsust, mis ilmus pärast kuvatud tulemuste mõningate probleemide märkamist. Jaoks sademete tüüp , ainsad oodatavad väärtused olid vihma ja lumi , kuid leidsin ka kolmanda väärtuse sademed . Ilmakonteksti põhjal näib see vihma vihmaga viitavat, nii et rakenduse lihtsuse huvides käsitletakse seda lumena.
ma mõtlen Minu täiuslik ilm on üsna lahe idee ja olen uhke, et sain selle rakendada väga kiiresti, ühendades kõik need erinevad tehnoloogiad omavahel. Sellegipoolest on see häkkimine, millel on palju lõdvaid otsi, kuid mis kõige tähtsam on see, et see töötab!
Õppisin selle lühikese projekti käigus üsna palju. IBM Bluemix oli mulle uus, nii et see oli omaette seiklus.
Ma pole kunagi varem Cloudant DB-st kuulnud, kuid MongoDB mõningate kogemustega oli üleminek üsna lihtne.
Sain ka teada, et ma ei peaks töötama frontendiga. Olen hingelt taustarendaja, ilma anne teha asjad kenaks , nii et Bootstrapi ja CSS-iga töötamine oli otsingu-kopeerimise-kleepimise-muutmise harjutus. Suur tänu mu naisele, et ta aitas kujunduse, visuaalide, demo ja üldiste nõuannete osas.
Tahaksin lisada lähitulevikus rohkem ilmastikutingimusi ja laiendada seda suurema osa maailmast või vähemalt kogu Euroopast. Kui kriteeriumidele vastab rohkem linnu / ilmapäevi, on kõige täiuslikumate päevade esitamine keerukam, seega on kasutajate seanssidest pärinevate andmete jaoks võimalik kasutada Spark MLlibi koos Spark Streaminguga.
Loodan, et IBM lisab Sparki tööde ajastamise võimaluse peagi, nii et teenus võib muutuda täielikult automatiseeritud.
Rakenduse saate oma arvutis, nutitelefonis või tahvelarvutis vaadata navigeerides myperfectweather.eu .
Kui soovite koodi tippu saada, on see hostitud Github .
Minu täiuslik ilm loodi IBM Sparkathoni võistleva projektina, milles osales ligi 600 osalejat. See võitis peaauhinna ja fännide lemmiku. Vaadake projekti leht kui soovite rohkem teada saada.