Bagaimana Saya Menggunakan Apache Spark dan Docker di Hackathon untuk Membangun Aplikasi Cuaca

Diterbitkan: 2022-03-11

Dalam dua artikel saya sebelumnya, saya memperkenalkan audiens ke Apache Spark dan Docker. Waktunya telah tiba bahwa saya menunjukkan kepada Anda aplikasi yang berfungsi penuh termasuk kedua teknologi yang disebutkan di atas.

Motivasi "menghujani dari langit dalam bentuk data" dan dipicu oleh hackathon yang diselenggarakan oleh IBM. Tujuan Sparkathon adalah menggunakan data cuaca dan Analytics untuk Apache Spark untuk IBM Bluemix untuk membangun aplikasi seluler terkait cuaca.

IBM banyak berinvestasi di Spark, dan baru-baru ini membeli bagian digital dari The Weather Channel. Akibatnya, acara ini tampaknya sempurna untuk publisitas mereka.

Inspirasi

Pernahkah Anda mengeluh tentang cuaca di lokasi Anda, memiliki waktu luang yang direncanakan dan uang untuk dibelanjakan, tetapi tidak tahu harus ke mana ? Jika jawabannya ya, maka Anda sangat menyukai aplikasi My Perfect Weather .

Gambar: Gunakan kasus untuk aplikasi.

Untuk mengilustrasikan bagaimana aplikasi dapat digunakan, berikut adalah beberapa kasus penggunaan:

  1. Anda memiliki seorang anak yang Anda janjikan untuk menerbangkan layang-layang minggu ini , tetapi tempat tinggal Anda benar-benar tidak berangin dan Anda tidak ingin melanggar janji Anda.
  2. Anda tinggal di tempat yang berangin dan hujan seperti saya (Edinburgh, Skotlandia) dan ingin merasakan kehangatan di kulit Anda dan jelas tidak ada hujan.
  3. Anda memiliki keinginan untuk membangun manusia salju dan Anda tidak akan beristirahat sampai Anda memenuhinya.
  4. Anda ingin pergi memancing, dan kali ini, Anda benar-benar ingin menangkap sesuatu.

Apa Fungsinya?

Ide di balik layanan ini sangat sederhana. Pertama, Anda menentukan apa arti cuaca yang sempurna bagi Anda pada saat tertentu. Saat ini, Anda dapat memfilter berdasarkan suhu, kecepatan angin, jenis presipitasi, dan kemungkinan presipitasi seperti yang ditunjukkan pada tangkapan layar di bawah. Kemudian layanan melakukan sisanya dan Anda disajikan dengan tujuan yang paling cocok. Hasilnya diurutkan berdasarkan jumlah hari sempurna, yang cocok dengan kueri asli, ditemukan untuk setiap kota, dan terbatas pada lima teratas. Hari-hari yang sempurna juga ditandai dengan latar belakang yang berbeda.

Mari kita lihat bagaimana kita bisa menggunakan layanan untuk kasus penggunaan yang didefinisikan di bagian sebelumnya.

  1. Atur kecepatan angin antara 16 dan 32 km/jam, ideal untuk menerbangkan layang-layang, dengan sedikit kemungkinan hujan dan suhu yang nyaman.
  2. Atur suhu minimum agar cukup hangat untuk Anda, atur kemungkinan hujan menjadi 0%.
  3. Atur suhu menjadi sekitar dan di bawah 0 C, pilih salju sebagai jenis presipitasi dan peluang presipitasi menjadi tinggi.
  4. Atur kecepatan angin menjadi kurang dari 16 km/jam, sedikit hujan dan awan yang Anda inginkan agar tidak terlalu cerah dan biarkan ikan masuk lebih dalam ke air, suhu yang nyaman.

Jika mau, Anda dapat dengan mudah melihat cara mencapai tujuan yang Anda pilih, karena aplikasi ini terintegrasi dengan layanan pencarian perjalanan Momondo.

Bagaimana Saya Membangunnya?

Pada dasarnya, semuanya kecuali layanan pencarian perjalanan eksternal berjalan di dalam platform IBM Bluemix.

IBM menawarkan uji coba gratis kepada semua peserta hackathon, jadi saya tidak perlu khawatir tentang tempat menjalankan aplikasi.

Mari kita lihat bagaimana aliran data dalam aplikasi dan bagaimana komponen yang disajikan dalam diagram arsitektur bersatu.

Aplikasi Play dihosting di dalam container Docker. Salah satu layanannya mampu menghubungi Layanan Cuaca dan mengunduh ramalan cuaca 10 hari ke Cloudant. Dalam langkah setelah pengunduhan, Spark membaca data cuaca mentah dari Cloudant, memprosesnya, dan menyimpannya kembali ke Cloudant untuk akses cepat dan mudah oleh aplikasi Play.

Saat pengguna menavigasi ke halaman utama aplikasi, mereka disajikan dengan formulir yang berisi berbagai kontrol untuk menentukan cuaca sempurna mereka. Masukan mereka dikirimkan ke backend yang menanyakan Cloudant untuk kota-kota yang berisi hari-hari yang sempurna. Kemudian, kueri lain dibuat untuk semua perkiraan sepuluh hari untuk kota-kota yang dikembalikan dalam kueri sebelumnya. Hasil yang diperoleh disajikan kepada pengguna dan sel mewakili kondisi cuaca per kota per hari. Sel terakhir untuk setiap kota menyimpan tautan ke layanan perjalanan. Mengkliknya akan membawa pengguna ke situs web Momondo dan formulir pencarian penerbangan akan diisi sebelumnya dengan tujuan dan tanggal perjalanan. Jika pengguna telah menggunakan layanan sebelumnya (dan menyimpan cookie di browser mereka), asal dan jumlah wisatawan mungkin juga telah diisi sebelumnya. Tentu saja, bidang pada formulir ini dapat diubah. Misalnya, seseorang dapat mencoba tanggal perjalanan yang berbeda untuk mencari tarif yang lebih baik.

Kurang lebih beginilah cara aplikasi dibangun. Bagian berikut masuk ke rincian lebih lanjut dari beberapa komponen.

Gambar: Komponen aplikasi cuaca.

Spark dan Wawasan untuk Cuaca

Fase pertama proyek dihabiskan untuk mencari tahu cara kerja Weather API dan layanan Bluemix lainnya, dan diikuti oleh eksplorasi data cuaca awal menggunakan Spark. Itu membuat saya mengerti bagaimana model data bekerja dan bagaimana itu bisa digunakan dalam aplikasi.

Untuk tujuan aplikasi ini, hanya yang pertama dari titik akhir Weather REST API berikut yang digunakan:

 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

Titik akhir ditanyai untuk prakiraan cuaca untuk setiap kota yang diminati dengan menyediakan parameter geocode yang mengambil garis lintang dan bujur dari tempat yang dimaksud.

Karena sifat layanannya, jumlah permintaan yang dibuat ke Weather API berkorelasi dengan jumlah kota yang didukung. Saya mempertimbangkan batas tingkat gratis Insights for Weather Service yaitu 500 panggilan per hari dan memutuskan bahwa untuk tujuan demo, saya akan pergi dengan jumlah aman lima puluh kota tipe turis di Eropa. Ini memungkinkan saya melakukan beberapa panggilan per hari untuk setiap kota dan menangani permintaan yang gagal tanpa risiko kehilangan hak untuk menggunakan API. Saya harus mulai membayar untuk memiliki permintaan yang cukup untuk menutupi sebagian besar kota di dunia.

Tujuan akhir dari proyek ini adalah memiliki data cuaca krisis Spark untuk semua kota di dunia (~50.000) dikalikan dengan sepuluh hari data perkiraan dan melakukannya beberapa kali per hari untuk mendapatkan prediksi seakurat mungkin.

Semua kode Spark berada di notebook Jupyter. Sejauh ini tidak ada cara lain untuk menjalankan pekerjaan Spark. Data cuaca mentah dibaca dari Cloudant DB, diproses dan ditulis kembali.

Cloudant NoSQL DB

Singkatnya, saya merasa sangat menyenangkan bekerja dengan Cloudant NoSQL DB. Mudah digunakan dan memiliki UI berbasis browser yang bagus. Tidak ada driver seperti itu, tetapi memiliki REST API sederhana dan mudah untuk berinteraksi melalui HTTP.

Namun, Bluemix Spark menyertakan Cloudant Data Sources API, yang dapat digunakan untuk membaca dan menulis ke Cloudant tanpa memerlukan panggilan tingkat rendah. Perlu dicatat bahwa tidak mungkin membuat database baru di Cloudant dari Spark sehingga harus dibuat terlebih dahulu, misalnya dengan UI web.

Mainkan Kerangka

Aplikasi web ditulis dalam Scala. Hal ini sangat sederhana. Pengontrol menyajikan aplikasi satu halaman dengan AngularJS dan Bootstrap, dan layanan berinteraksi dengan Weather API dan Cloudant.

Salah satu tantangan menarik yang saya hadapi adalah terkait langsung dengan IBM Container Service. Niat saya adalah menjalankan aplikasi pada port 80 sehingga mudah digunakan. Namun, saya tidak dapat menemukan cara apa pun di Bluemix untuk menggunakan penerusan port Docker dan memetakan port eksternal 80 ke port internal Docker 9000 dari aplikasi Play. Solusi saya adalah menjalankan sebagai root di dalam wadah (bukan praktik yang disarankan) dan mengedit application.conf Play:

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

Buruh pelabuhan

Docker sangat berguna, terutama pada saat penerapan ke Bluemix. Saya tidak perlu memiliki pengetahuan tentang Cloud Foundry Apps, khawatir tentang buildpack Scala atau apa pun. Saya hanya bisa mendorong gambar Docker saya dan melihatnya berjalan.

Untuk membuat image Docker, saya menggunakan Plugin Typesafe Docker, jadi saya bahkan tidak memerlukan Dockerfile yang tepat.

Hanya perlu beberapa perintah untuk melihat aplikasi berjalan di cloud setelah konfigurasi awal yang singkat:

 # 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

Perlu dicatat bahwa Bluemix Container Service melakukan Penilaian Kerentanan pada gambar sebelum dapat dijalankan. Meskipun itu tidak masuk akal untuk aplikasi saya, saya masih harus menambal /etc/login.defs dari gambar induk, sehingga dapat dijalankan. Inilah Dockerfile jika Anda tertarik.

Tantangan yang Saya Hadapi

Karena Spark masih merupakan tambahan baru untuk IBM Bluemix, ia memiliki batasan tertentu. Saat ini, kode hanya dapat dieksekusi sebagai bagian dari buku catatan, sehingga tidak ada cara untuk menjadwalkan proses. Ini adalah penemuan yang cukup bagus di akhir waktu yang saya miliki untuk hackathon. Yang dimaksud dengan My Perfect Weather adalah hari-hari cuaca yang disajikan perlahan-lahan akan ketinggalan zaman jika notebook Spark tidak dijalankan kembali secara manual . Saya berharap IBM akan segera mengatasi kekurangan ini.

Saya juga menemukan sedikit ketidakakuratan dalam dokumentasi Insights for Weather API yang muncul setelah melihat beberapa masalah dengan hasil yang ditampilkan. Untuk tipe presipitasi , satu - satunya nilai yang diharapkan adalah hujan dan salju , tetapi saya juga menemukan presipit nilai ketiga . Dari konteks cuaca, sepertinya menunjukkan hujan dengan salju, jadi untuk kesederhanaan aplikasi ini diperlakukan sebagai salju.

Prestasi Yang Saya Banggakan

Gambar: Menggunakan Docker dan Spark di aplikasi cuaca.

Saya pikir My Perfect Weather adalah ide yang cukup keren, dan saya bangga dapat menerapkannya dengan sangat cepat dengan memadukan berbagai teknologi itu bersama-sama. Ini adalah peretasan, dengan banyak ujung yang longgar, tetapi yang paling penting adalah itu berfungsi!

Apa yang saya pelajari

Saya belajar cukup banyak selama proyek singkat ini. Saya baru mengenal IBM Bluemix, jadi ini adalah petualangan tersendiri.

Saya belum pernah mendengar tentang Cloudant DB sebelumnya, tetapi dengan beberapa pengalaman MongoDB transisinya agak mudah.

Saya juga belajar bahwa saya tidak boleh bekerja di frontend. Saya seorang pengembang backend di hati, tanpa bakat untuk membuat segalanya terlihat bagus, jadi bekerja dengan Bootstrap dan CSS adalah latihan pencarian-salin-tempel-modifikasi. Banyak terima kasih kepada istri saya untuk membantu dengan desain, visual, demo dan saran umum.

Apa selanjutnya untuk My Perfect Weather

Saya ingin menambahkan lebih banyak kontrol cuaca dan memperluasnya untuk mencakup sebagian besar dunia, atau setidaknya seluruh Eropa dalam waktu dekat. Dengan lebih banyak kota/cuaca-hari yang sesuai dengan kriteria, akan lebih menantang untuk menyajikan hari yang paling sempurna, sehingga ada ruang lingkup untuk menggunakan Spark MLlib dengan Spark Streaming untuk data yang berasal dari sesi pengguna.

Saya berharap IBM akan segera menambahkan kemampuan penjadwalan pekerjaan Spark, sehingga layanan dapat menjadi sepenuhnya otomatis.

Kesimpulan

Anda dapat memeriksa aplikasi sendiri di komputer, ponsel cerdas, atau tablet Anda dengan menavigasi ke myperfectweather.eu.

Jika Anda ingin memiliki puncak pada kode, itu di-host di Github.

My Perfect Weather dibuat sebagai proyek pesaing untuk IBM Sparkathon dengan hampir 600 peserta. Itu memenangkan Hadiah Utama dan Favorit Penggemar. Lihat halaman proyek jika Anda ingin tahu lebih banyak.