ハッカソンでApacheSparkとDockerを使用して天気アプリを作成した方法

公開: 2022-03-11

以前の2つの記事で、ApacheSparkとDockerを聴衆に紹介しました。 前述の両方のテクノロジーを含む完全に機能するアプリケーションを紹介するときが来ました。

その動機は「データの形で空から降り注いだ」ものであり、IBMが主催したハッカソンによって引き起こされました。 Sparkathonの目的は、気象データとApache Spark for IBM Bluemixの分析を使用して、気象関連のモバイルアプリケーションを構築することでした。

IBMはSparkに多額の投資を行っており、最近、TheWeatherChannelのデジタル部分を購入しました。 結果として、このイベントは彼らの宣伝に最適のようです。

インスピレーション

あなたは今まであなたの場所の天気について不平を言い、計画された休暇と使うお金がありましたが、どこに行くべきかわかりませんでしたか? 答えが「はい」の場合は、 MyPerfectWeatherアプリが本当に必要です。

画像:アプリのユースケース。

アプリの使用方法を説明するために、いくつかの使用例を示します。

  1. あなたには今週一緒に凧を飛ばすことを約束した子供がいますが、あなたが住んでいる場所は絶対に無風であり、あなたはあなたの言葉を破りたくありません。
  2. あなたは私のように風が強くて雨多い場所(スコットランド、エジンバラ)に住んでいて、肌に暖かさを感じたいと思っています。
  3. あなたは雪だるまを作りたいという衝動を持っており、それを成し遂げるまで休むことはありません。
  4. あなたは釣りに行きたいです、そして今度はあなたは本当に何かを捕まえたいです。

それが何をするか

サービスの背後にある考え方は非常に単純です。 まず、特定の時点での完璧な天気の意味を定義します。 現在、下のスクリーンショットに示すように、気温、風速、降水タイプ、降水確率でフィルタリングできます。 その後、サービスが残りの作業を行い、最適な目的地が表示されます。 結果は、元のクエリに一致する完全な日数で並べ替えられ、各都市で検出され、上位5つに制限されます。 完璧な日もまた、異なる背景でマークされています。

前のセクションで定義したユースケースでサービスをどのように使用できるかを見てみましょう。

  1. 風は時速16〜32 kmに設定します。これは、凧を飛ばすのに理想的で、雨が降る可能性は低く、気温も快適です。
  2. 最低気温を十分に暖かく設定し、雨の可能性を0%に設定します。
  3. 気温を0℃前後に設定し、降水タイプとして雪を選択し、降水確率を高くします。
  4. 風速を16km/ h未満に設定し、雨や雲が少ないように設定します。晴れすぎないようにし、魚を水中で深くし、快適な温度にします。

アプリケーションには旅行検索サービスのモモンドが統合されているため、必要に応じて、選択した目的地への行き方を簡単に確認できます。

作り方

基本的に、外部の旅行検索サービスを除くすべてがIBMBluemixプラットフォーム内で実行されます。

IBMはハッカソンのすべての参加者に無料トライアルを提供したので、アプリをどこで実行するかを心配する必要はありませんでした。

アプリケーションでデータがどのように流れるか、およびアーキテクチャ図に示されているコンポーネントがどのように組み合わされるかを見てみましょう。

Playアプリは、Dockerコンテナー内でホストされます。 そのサービスの1つは、Weather Serviceに連絡して、10日間の天気予報をCloudantにダウンロードすることができます。 ダウンロード後のステップで、SparkはCloudantから生の気象データを読み取り、処理してCloudantに保存し、Playアプリケーションからすばやく簡単にアクセスできるようにします。

ユーザーがアプリのメインページに移動すると、完璧な天気を定義するためのさまざまなコントロールを含むフォームが表示されます。 彼らの入力はバックエンドに送信され、Cloudantに完璧な日を含む都市を照会します。 次に、前のクエリで返された都市の予測の10日間すべてに対して別のクエリが実行されます。 得られた結果はユーザーに表示され、セルは1日あたりの都市ごとの気象条件を表します。 すべての都市の最後のセルには、旅行サービスへのリンクがあります。 それをクリックすると、ユーザーはモモンドのWebサイトに移動し、フライト検索フォームに目的地と旅行日が事前に入力されます。 ユーザーが以前にサービスを使用したことがある場合(およびブラウザーにCookieが保存されている場合)、出発地と旅行者の数も事前に入力されている可能性があります。 もちろん、このフォームのフィールドは変更できます。 たとえば、より良い運賃を求めてさまざまな旅行日を試すことができます。

これは、アプリケーションの構築方法とほぼ同じです。 次のセクションでは、いくつかのコンポーネントについて詳しく説明します。

画像:天気アプリのコンポーネント。

SparkとInsightsforWeather

プロジェクトの最初のフェーズは、Weather APIと他のBluemixサービスがどのように機能するかを理解することに費やされ、その後、Sparkを使用した最初の気象データの調査が行われました。 データモデルがどのように機能し、アプリケーションでどのように使用できるかを理解できました。

このアプリの目的のために、次のWeatherRESTAPIエンドポイントの最初のもののみが使用されます。

 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

エンドポイントは、問題の場所の緯度と経度を取得するジオコードパラメータを提供することにより、関心のあるすべての都市の天気予報を照会されます。

サービスの性質上、Weather APIに対して行われるリクエストの数は、サポートされている都市の数と相関関係があります。 Insights for Weather Serviceの無料利用枠の制限である1日あたり500コールを検討し、デモの目的で、ヨーロッパの50の観光タイプの都市の安全な数に行くことにしました。 これにより、都市ごとに1日に数回の呼び出しを行い、APIを使用する権利を失うリスクなしに失敗したリクエストを処理できます。 世界のほとんどの都市をカバーするのに十分なリクエストを受け取るには、支払いを開始する必要があります。

プロジェクトの最終的な目標は、世界のすべての都市のSparkクランチ気象データ(〜50,000)に10日間の予測データを掛けて、1日に数回実行し、可能な限り正確な予測を行うことです。

すべてのSparkコードはJupyterノートブックにあります。 これまでのところ、Sparkジョブを実行する他の方法はありません。 生の気象データはCloudantDBから読み取られ、処理されて書き戻されます。

Cloudant NoSQL DB

つまり、CloudantNoSQLDBを操作するのはとても楽しいと思いました。 使いやすく、ブラウザベースの優れたUIを備えています。 そのようなドライバーはありませんが、単純なREST APIを備えており、HTTPを介して対話するのは簡単でした。

ただし、BluemixSparkにはCloudantData Sources APIが含まれており、低レベルの呼び出しを必要とせずにCloudantの読み取りと書き込みに使用できます。 CloudantでSparkから新しいデータベースを作成することはできないため、たとえばWebUIを使用して事前に作成する必要があることに注意してください。

Play Framework

WebアプリケーションはScalaで書かれています。 とても簡単です。 コントローラーはAngularJSとBootstrapを備えた1ページのアプリを提供し、サービスはWeatherAPIとCloudantと相互作用します。

私が直面した興味深い課題の1つは、IBMContainerServiceに直接関係しています。 私の意図は、ユーザーフレンドリーになるようにポート80でアプリを実行することでした。 ただし、Bluemixで、Dockerポートフォワーディングを使用して外部ポート80をPlayアプリのDocker内部ポート9000にマップする方法が見つかりませんでした。 私の回避策は、コンテナー内でrootとして実行し(推奨される方法ではありません)、Playのapplication.confを編集することでした。

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

Docker

Dockerは、特にBluemixへのデプロイメント時に非常に便利でした。 Cloud Foundry Appsの知識は必要ありませんでしたし、Scalaビルドパックなどについて心配する必要もありませんでした。 Dockerイメージをプッシュして、実行されていることを確認できます。

Dockerイメージの作成には、Typesafe Dockerプラグインを使用したため、適切なDockerfileも必要ありませんでした。

短い初期構成の後、クラウドで実行されているアプリを確認するために必要なコマンドはわずかです。

 # 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は、イメージを実行する前に、イメージに対して脆弱性評価を実行することに注意してください。 私のアプリにはあまり意味がありませんでしたが、親イメージの/etc/login.defsにパッチを適用して、実行できるようにする必要がありました。 興味のある方は、Dockerfileをご覧ください。

私が遭遇した課題

SparkはまだIBMBluemixに新しく追加されたものであるため、特定の制限があります。 現在、コードはノートブックの一部としてのみ実行できるため、実行をスケジュールする方法はありません。 これは私がハッカソンのために持っていた時間の終わりにかなりの発見でした。 My Perfect Weatherにとっての意味は、Sparkノートブックを手動で再実行しないと、提示された天気の日が徐々に古くなることです。 IBMがこの欠点に迅速に対処することを願っています。

また、表示された結果にいくつかの問題があることに気付いた後に表面化したInsights forWeatherAPIのドキュメントに小さな不正確さがありました。 降水タイプの場合、期待値はだけでしたが、3番目の値の降水量も見つかりました。 天気のコンテキストからは、雪を伴う雨を示しているように見えるため、アプリを簡単にするために雪として扱われます。

私が誇りに思っている成果

画像:天気アプリでDockerとSparkを使用しています。

My Perfect Weatherは非常にクールなアイデアだと思います。そして、これらのさまざまなテクノロジーをすべて非常に迅速にブレンドして実装できたことを誇りに思います。 それにもかかわらず、それは多くのルーズエンドを持つハックですが、最も重要なのはそれが機能していることです!

私が学んだこと

この短いプロジェクトでたくさんのことを学びました。 私はIBMBluemixを初めて使用したので、それ自体が冒険でした。

Cloudant DBのことは聞いたことがありませんが、MongoDBの経験があれば、移行はかなり簡単でした。

また、フロントエンドで作業するべきではないことも学びました。 私は本質的にバックエンド開発者であり、見栄えを良くする才能がないため、BootstrapとCSSを使用することは、検索、コピー、貼り付け、変更の演習でした。 デザイン、ビジュアル、デモ、一般的なアドバイスを手伝ってくれた妻に感謝します。

私の完璧な天気の次は

気象制御をさらに追加して、世界のほとんど、または少なくとも近い将来にはヨーロッパのすべてをカバーするように拡張したいと思います。 基準に一致する都市/天気の日が増えると、最も完璧な日を提示するのが難しくなるため、ユーザーのセッションからのデータにSparkMLlibとSparkStreamingを使用する余地があります。

IBMがSparkジョブをスケジュールする機能をすぐに追加して、サービスが完全に自動化されるようになることを願っています。

結論

myperfectweather.euに移動すると、コンピューター、スマートフォン、またはタブレットでアプリケーションを自分でチェックアウトできます。

コードをピークにしたい場合は、Githubでホストされています。

My Perfect Weatherは、600人近くの参加者がいるIBMSparkathonの競合プロジェクトとして作成されました。 大賞とファンのお気に入りを獲得しました。 詳細については、プロジェクトページをご覧ください。