Bir Hava Durumu Uygulaması Oluşturmak için Hackathon'da Apache Spark ve Docker'ı Nasıl Kullandım
Yayınlanan: 2022-03-11Önceki makalelerimden ikisinde izleyicileri Apache Spark ve Docker ile tanıştırdım. Size yukarıda bahsedilen teknolojilerin her ikisini de içeren tamamen işlevsel bir uygulama gösterme zamanı geldi.
“Gökten veri şeklinde yağan” motivasyon, IBM tarafından düzenlenen bir hackathon ile ateşlendi. Sparkathon'un amacı, hava durumuyla ilgili mobil uygulamalar oluşturmak için hava durumu verilerini ve IBM Bluemix için Apache Spark Analytics'i kullanmaktı.
IBM, Spark'a yoğun bir şekilde yatırım yapıyor ve yakın zamanda The Weather Channel'ın dijital bölümünü satın aldı. Sonuç olarak, bu olay onların tanıtımı için mükemmel görünüyor.
Esin
Bulunduğunuz yerdeki hava durumundan şikayet ettiğiniz, planlanmış bir tatiliniz ve harcayacak paranız olduğu halde nereye gideceğinizi bilemediğiniz oldu mu? Cevabınız evet ise, My Perfect Weather uygulamasını gerçekten seveceksiniz.
Uygulamanın nasıl kullanılabileceğini göstermek için işte bazı kullanım örnekleri:
- Bu hafta uçurtma uçurmaya söz verdiğiniz bir çocuğunuz var ama yaşadığınız yer kesinlikle rüzgarsız ve sözünüzü kırmak istemiyorsunuz.
- Sen de benim gibi rüzgarlı ve yağmurlu bir yerde yaşıyorsun (Edinburgh, İskoçya) ve teninde sıcaklık hissetmek ve kesinlikle yağmur yağmamak istiyorsun.
- Bir kardan adam yapma dürtüsünüz var ve bunu gerçekleştirene kadar dinlenmeyeceksiniz.
- Balığa gitmek istiyorsun ve bu sefer gerçekten bir şeyler yakalamak istiyorsun.
Bu ne yapar
Hizmetin arkasındaki fikir çok basittir. İlk olarak, belirli bir zamanda mükemmel havanın sizin için ne anlama geldiğini tanımlarsınız. Şu anda, aşağıdaki ekran görüntüsünde gösterildiği gibi sıcaklığa, rüzgar hızına, yağış türüne ve yağış olasılığına göre filtreleme yapabilirsiniz. Ardından hizmet gerisini halleder ve size en uygun varış noktaları sunulur. Sonuçlar, her şehir için bulunan ve ilk beşle sınırlı olan orijinal sorguyla eşleşen mükemmel günlerin miktarına göre sıralanır. Mükemmel günler de farklı bir arka planla işaretlenmiştir.
Bir önceki bölümde tanımlanan kullanım durumları için hizmeti nasıl kullanabileceğimizi görelim.
- Rüzgarı, uçurtma uçurmak için ideal, az yağmur ihtimali ve rahat sıcaklık ile 16 ila 32 km/s arasında olacak şekilde ayarlayın.
- Minimum sıcaklığı sizin için yeterince sıcak olacak şekilde ayarlayın, yağmur olasılığını %0'a ayarlayın.
- Sıcaklığı 0 C civarında ve altında olacak şekilde ayarlayın, yağış türü olarak karı ve yağış olasılığının yüksek olmasını seçin.
- Çok güneşli olmasını ve balıkların suda daha derine inmesini, rahat sıcaklık olmasını istediğiniz için rüzgar hızını 16 km/s'den az, az yağmur ve bulutlar olarak ayarlayın.
Dilerseniz, uygulama bir seyahat arama hizmeti Momondo ile entegre olarak geldiğinden, seçtiğiniz varış noktasına nasıl gideceğinizi kolayca kontrol edebilirsiniz.
Nasıl İnşa Ettim
Temel olarak, harici seyahat arama hizmeti dışındaki her şey IBM Bluemix platformunun içinde çalışır.
IBM, hackathon'un tüm katılımcılarına ücretsiz bir deneme sundu, bu yüzden uygulamayı nerede çalıştıracağım konusunda endişelenmeme gerek kalmadı.
Uygulamada verilerin nasıl aktığını ve mimari diyagramda sunulan bileşenlerin nasıl bir araya geldiğini görelim.
Play uygulaması, bir Docker kapsayıcısının içinde barındırılır. Hizmetlerinden biri, Hava Durumu Hizmeti ile iletişim kurma ve 10 günlük hava tahminini Cloudant'a indirme yeteneğine sahiptir. İndirmeyi izleyen bir adımda Spark, Cloudant'tan ham hava durumu verilerini okur, işler ve Play uygulaması tarafından hızlı ve kolay erişim için Cloudant'a geri depolar.
Kullanıcılar, uygulamanın ana sayfasına gittiklerinde, mükemmel hava durumunu tanımlamaları için çeşitli kontroller içeren bir formla sunulur. Girdiler, mükemmel günleri içeren şehirler için Cloudant'ı sorgulayan arka uca gönderilir. Ardından, bir önceki sorguda döndürülen şehirler için tahminin tüm on günü için başka bir sorgu yapılır. Elde edilen sonuçlar kullanıcılara sunulur ve hücreler, şehir başına günlük hava koşullarını temsil eder. Her şehir için son hücre, bir seyahat hizmetine bağlantı içerir. Üzerine tıklamak, kullanıcıları Momondo web sitesine götürecek ve uçuş arama formu, varış noktası ve seyahat tarihleriyle önceden doldurulacaktır. Kullanıcı hizmeti daha önce kullanmışsa (ve tarayıcısında bir tanımlama bilgisi depolamışsa), yolcuların kökeni ve miktarı da önceden doldurulmuş olabilir. Elbette bu formdaki alanlar değiştirilebilir. Örneğin, daha iyi bir ücret aramak için farklı seyahat tarihleri denenebilir.
Uygulamanın yapısı aşağı yukarı bu şekildedir. Aşağıdaki bölümler bazı bileşenlerin daha fazla ayrıntısına girmektedir.
Hava Durumu İçin Kıvılcım ve Öngörüler
Projenin ilk aşaması, Hava Durumu API'sinin ve diğer Bluemix hizmetlerinin nasıl çalıştığını anlamaya harcandı ve ardından Spark kullanılarak ilk hava durumu verilerinin keşfi yapıldı. Veri modelinin nasıl çalıştığını ve uygulamada nasıl kullanılabileceğini anlamamı sağladı.
Bu uygulamanın amacı için, aşağıdaki Weather REST API uç noktalarından yalnızca ilki kullanılır:
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
Uç nokta, söz konusu yerin enlem ve boylamını alan bir coğrafi kod parametresi sağlanarak ilgilenilen her şehir için hava durumu tahmini için sorgulanır.
Hizmetin doğası gereği, Hava Durumu API'sine yapılan isteklerin sayısı, desteklenen şehirlerin sayısıyla ilişkilidir. Günde 500 çağrı olan Hava Durumu Hizmeti için Insights ücretsiz kullanım sınırını düşündüm ve demo amacıyla Avrupa'da güvenli sayıda elli turist tipi şehirle gitmeye karar verdim. Bu, her şehir için günde birkaç arama yapmama ve API'yi kullanma hakkını kaybetme riski olmadan başarısız istekleri işlememe izin verdi. Dünyadaki şehirlerin çoğunu kapsamaya yetecek kadar istekte bulunmak için ödemeye başlamam gerekecekti.

Projenin nihai hedefi, dünyadaki tüm şehirler için (~50.000) Spark crunch hava durumu verilerinin on günlük tahmin verileriyle çarpılması ve tahminlerin mümkün olduğunca doğru olması için günde birkaç kez gerçekleştirilmesi olacaktır.
Tüm Spark kodu bir Jupyter not defterinde bulunur. Şimdiye kadar Spark işlerini yürütmenin başka bir yolu yok. Ham hava durumu verileri Cloudant DB'den okunur, işlenir ve geri yazılır.
Cloudant NoSQL DB
Kısacası Cloudant NoSQL DB ile çalışmayı çok keyifli buldum. Kullanımı kolaydır ve iyi bir tarayıcı tabanlı kullanıcı arayüzüne sahiptir. Böyle bir sürücü yoktur, ancak basit bir REST API'sine sahiptir ve HTTP aracılığıyla etkileşim kurmak kolaydı.
Ancak Bluemix Spark, düşük seviyeli çağrılara ihtiyaç duymadan Cloudant'a okumak ve yazmak için kullanılabilecek bir Cloudant Veri Kaynakları API'sı içerir. Cloudant'ta Spark'tan yeni bir veritabanı oluşturmanın mümkün olmadığını, bu nedenle örneğin web kullanıcı arayüzü ile önceden oluşturulması gerektiğini belirtmekte fayda var.
Oyun Çerçevesi
Web uygulaması Scala ile yazılmıştır. O çok basit. Denetleyici, AngularJS ve Bootstrap ile tek sayfalık bir uygulama sunar ve hizmet, Weather API ve Cloudant ile etkileşime girer.
Karşılaştığım ilginç bir zorluk, doğrudan IBM Container Service ile ilgili. Niyetim, uygulamayı 80 numaralı bağlantı noktasında çalıştırmaktı, böylece kullanıcı dostu oldu. Ancak, Bluemix'te Docker bağlantı noktası iletmeyi kullanmanın ve harici bağlantı noktası 80'i Play uygulamasının Docker dahili bağlantı noktası 9000'e eşlemenin hiçbir yolunu bulamadım. Geçici çözümüm, kabın içinde kök olarak çalıştırmak (önerilen bir uygulama değil) ve Play'in application.conf dosyasını düzenlemekti:
# Production port play.server.http.port = "80"
Liman işçisi
Docker, özellikle Bluemix'e dağıtım sırasında gerçekten kullanışlı oldu. Cloud Foundry Apps hakkında herhangi bir bilgiye sahip olmam, Scala derleme paketleri veya başka bir şey hakkında endişelenmem gerekmiyordu. Docker imajımı zorlayabilir ve çalıştığını görebilirim.
Docker imajını oluşturmak için Typesafe Docker Plugin kullandım, bu yüzden uygun bir Dockerfile'a bile ihtiyacım olmadı.
Kısa bir ilk yapılandırmadan sonra uygulamanın bulutta çalıştığını görmek için yalnızca birkaç komut gerekir:
# 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
Bluemix Container Service'in, çalıştırılmadan önce görüntüler üzerinde bir Güvenlik Açığı Değerlendirmesi gerçekleştirdiğini belirtmekte fayda var. Uygulamam için gerçekten bir anlam ifade etmese de, çalıştırılabilmesi için ana görüntünün /etc/login.defs
yamalamak zorunda kaldım. Eğer ilgileniyorsanız, işte Dockerfile.
Karşılaştığım Zorluklar
Spark, IBM Bluemix'e hala oldukça yeni bir ek olduğundan, belirli sınırlamaları vardır. Şu anda, kod yalnızca bir not defterinin parçası olarak yürütülebilir, bu nedenle çalıştırmaları planlamanın hiçbir yolu yoktur. Bu, hackathon için geçirdiğim zamanın sonunda oldukça büyük bir keşifti. My Perfect Weather için bunun anlamı, Spark notebook manuel olarak yeniden çalıştırılmazsa, sunulan hava günlerinin yavaş yavaş güncelliğini yitireceğidir. IBM'in bu eksikliği bir an önce gidereceğini umuyorum.
Görüntülenen sonuçlarla ilgili bazı sorunları fark ettikten sonra ortaya çıkan Insights for Weather API'sinin belgelerinde de küçük bir yanlışlıkla karşılaştım. Yağış türü için beklenen tek değerler yağmur ve kardı , ancak üçüncü bir değer uçurumu da buldum. Hava durumu bağlamında, kar ile yağmuru gösteriyor gibi görünüyor, bu nedenle uygulamanın basitliği için kar olarak kabul ediliyor.
Gurur Duyduğum Başarılar
Benim Mükemmel Hava Durumumun oldukça harika bir fikir olduğunu düşünüyorum ve tüm bu çeşitli teknolojileri bir araya getirerek çok hızlı bir şekilde uygulayabildiğim için gurur duyuyorum. Yine de, birçok gevşek ucu olan bir hack, ancak en önemli şey çalışıyor olmasıdır!
ne öğrendim
Bu kısa proje sırasında oldukça fazla şey öğrendim. IBM Bluemix'te yeniydim, bu yüzden başlı başına bir maceraydı.
Cloudant DB'yi daha önce hiç duymadım, ancak biraz MongoDB deneyimiyle geçiş oldukça kolaydı.
Ayrıca bir önyüz üzerinde çalışmamam gerektiğini öğrendim. Ben özünde bir arka uç geliştiriciyim, işleri güzel gösterme yeteneğim yok, bu yüzden Bootstrap ve CSS ile çalışmak bir arama-kopyala-yapıştır-değiştirme alıştırmasıydı. Tasarım, görseller, demo ve genel tavsiyelerde yardımcı olduğu için eşime çok teşekkür ederim.
Mükemmel Hava Durumum için sırada ne var
Daha fazla hava durumu kontrolü eklemek ve bunu yakın gelecekte dünyanın çoğunu veya en azından tüm Avrupa'yı kapsayacak şekilde genişletmek istiyorum. Kriterlere uyan daha fazla şehir/hava-gün ile en mükemmel günleri sunmak daha zor olacaktır, bu nedenle kullanıcıların oturumlarından gelen veriler için Spark MLlib'i Spark Streaming ile kullanma kapsamı vardır.
IBM'in, hizmetin tamamen otomatik hale gelebilmesi için, Spark işlerini zamanlama becerisini yakında ekleyeceğini umuyorum.
Çözüm
myperfectweather.eu adresine giderek uygulamayı bilgisayarınızda, akıllı telefonunuzda veya tabletinizde kendiniz inceleyebilirsiniz.
Kodda zirve yapmak istiyorsanız, Github'da barındırılıyor.
My Perfect Weather, yaklaşık 600 katılımcıyla IBM Sparkathon için rekabet eden bir proje olarak oluşturuldu. Büyük Ödül ve Hayranların Favorisi'ni kazandı. Daha fazla bilgi edinmek isterseniz proje sayfasına göz atın.