以前の2つの記事で、聴衆に Apache Spark そして Docker 。前述の両方のテクノロジーを含む完全に機能するアプリケーションを紹介するときが来ました。
その動機は「データの形で空から降り注いだ」ものであり、IBMが主催したハッカソンによって引き起こされました。 Sparkathon’s 目的は、気象データとApache Spark for IBM Bluemixの分析を使用して、気象関連のモバイルアプリケーションを構築することでした。
IBMは重く Sparkへの投資 、最近のデジタル部分を購入しました 天気予報チャンネル 。結果として、このイベントは彼らの宣伝に最適のようです。
あなたは今まであなたの場所の天気について不平を言ったことがありますか、いくつかの計画された休暇と使うお金がありましたが、知りませんでした どこ トーゴ?答えが「はい」の場合、あなたは本当に欲しいです 私の完璧な天気 アプリ。
アプリの使用方法を説明するために、いくつかの使用例を示します。
サービスの背後にある考え方は非常に単純です。まず、特定の時点での完璧な天気の意味を定義します。現在、下のスクリーンショットに示すように、気温、風速、降水タイプ、降水確率でフィルタリングできます。その後、サービスが残りを実行し、最適な宛先が表示されます。結果は、元のクエリに一致する完全な日数で並べ替えられ、各都市で検出され、上位5つに制限されます。完璧な日もまた、異なる背景でマークされています。
例を挙げたUXデザインとは
前のセクションで定義したユースケースでサービスを使用する方法を見てみましょう。
このアプリケーションは旅行検索サービスのモモンドと統合されているため、必要に応じて、選択した目的地への行き方を簡単に確認できます。
基本的に、外部の旅行検索サービスを除くすべてがIBMBluemixプラットフォーム内で実行されます。
IBMは、ハッカソンのすべての参加者に無料トライアルを提供したので、アプリをどこで実行するかを心配する必要はありませんでした。
アプリケーション内でデータがどのように流れるか、およびアーキテクチャ図に示されているコンポーネントがどのように組み合わされるかを見てみましょう。
Playアプリは、Dockerコンテナー内でホストされます。そのサービスの1つは、Weather Serviceに連絡して、10日間の天気予報をCloudantにダウンロードすることができます。ダウンロード後のステップで、SparkはCloudantから生の気象データを読み取り、処理してCloudantに保存し、Playアプリケーションからすばやく簡単にアクセスできるようにします。
ユーザーがアプリのメインページに移動すると、完璧な天気を定義するためのさまざまなコントロールを含むフォームが表示されます。彼らの入力はバックエンドに送信され、Cloudantに完璧な日を含む都市を照会します。次に、前のクエリで返された都市の予測の10日間すべてに対して別のクエリが実行されます。得られた結果はユーザーに表示され、セルは1日あたりの都市ごとの気象条件を表します。すべての都市の最後のセルには、旅行サービスへのリンクがあります。それをクリックすると、ユーザーはモモンドのWebサイトに移動し、フライト検索フォームに目的地と旅行日が事前に入力されます。ユーザーが以前にサービスを使用したことがある場合(およびブラウザにCookieが保存されている場合)、出発地と旅行者の数も事前に入力されている可能性があります。もちろん、このフォームのフィールドは変更できます。たとえば、より良い運賃を求めてさまざまな旅行日を試すことができます。
これは、アプリケーションの構築方法とほぼ同じです。次のセクションでは、いくつかのコンポーネントの詳細について説明します。
プロジェクトの最初のフェーズは、Weather APIおよびその他のBluemixサービスがどのように機能するかを理解することに費やされ、その後、Sparkを使用した最初の気象データの調査が行われました。データモデルがどのように機能し、アプリケーションでどのように使用できるかを理解できました。
このアプリの目的のために、次のWeather RESTAPIエンドポイントの最初のもののみが使用されます。
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を使用する権利を失うリスクなしに失敗したリクエストを処理できます。世界のほとんどの都市をカバーするのに十分なリクエストを受け取るには、支払いを開始する必要があります。
プロジェクトの最終的な目標は、世界のすべての都市のスパーククランチ気象データ(〜50,000)に10日間の予測データを掛けて、1日に数回実行して予測を可能な限り正確にすることです。
すべてのSparkコードは Jupyter ノート。これまでのところ、Sparkジョブを実行する他の方法はありません。生の気象データはCloudantDBから読み取られ、処理されて書き戻されます。
つまり、Cloudant NoSQLDBを使用するのは非常に楽しいと思いました。使いやすく、優れたブラウザベースのUIを備えています。そのようなドライバーはありませんが、単純なREST APIを備えており、HTTPを介して対話するのは簡単でした。
ただし、BluemixSparkにはCloudantData Sources APIが含まれており、低レベルの呼び出しを必要とせずにCloudantの読み取りと書き込みに使用できます。 CloudantでSparkから新しいデータベースを作成することはできないため、たとえばWebUIを使用して事前に作成する必要があることに注意してください。
WebアプリケーションはScalaで書かれています。とても簡単です。コントローラーはAngularJSとBootstrapを備えた1ページのアプリを提供し、サービスはWeatherAPIとCloudantと相互作用します。
PHP7を使用する必要があります
私が直面した興味深い課題の1つは、IBM ContainerServiceに直接関係しています。私の意図は、アプリをポート80で実行して、ユーザーフレンドリーにすることでした。ただし、Bluemixで、Dockerポートフォワーディングを使用して外部ポート80をPlayアプリのDocker内部ポート9000にマップする方法が見つかりませんでした。私の回避策は、 ルート コンテナ内(推奨される方法ではありません)およびPlayのapplication.confを編集するには:
# Production port play.server.http.port = '80'
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に新しく追加されたものであるため、特定の制限があります。現在、コードはノートブックの一部としてのみ実行できるため、実行をスケジュールする方法はありません。これは私がハッカソンのために持っていた時間の終わりにかなりの発見でした。それが何を意味するのか 私の完璧な天気 Sparkノートブックを再実行しないと、提示された天気の日が徐々に古くなるということです 手動で 。 IBMがこの欠点に迅速に対処することを願っています。
また、表示された結果にいくつかの問題があることに気付いた後に表面化したInsights for WeatherAPIのドキュメントに小さな不正確さがありました。のために 降水型 、期待値は 雨 そして 雪 、しかし私はまた3番目の値を見つけました 降水量 。天気のコンテキストからは、雨と雪を示しているように見えるため、アプリを簡単にするために雪として扱われます。
おもう 私の完璧な天気 非常にクールなアイデアであり、これらのさまざまなテクノロジーをすべて非常に迅速にブレンドして実装できたことを誇りに思います。それにもかかわらず、それは多くのルーズエンドを伴うハックですが、最も重要なのはそれが機能していることです!
この短いプロジェクトで多くのことを学びました。私はIBMBluemixを初めて使用したので、それ自体が冒険でした。
Cloudant DBのことは聞いたことがありませんが、MongoDBの経験があれば、移行はかなり簡単でした。
また、フロントエンドで作業するべきではないことも学びました。私は本質的にバックエンド開発者であり、 物事を美しく見せるための才能 、したがって、BootstrapとCSSの操作は、検索、コピー、貼り付け、変更の演習でした。デザイン、ビジュアル、デモ、一般的なアドバイスを手伝ってくれた妻に感謝します。
気象制御をさらに追加して、世界のほとんど、または少なくとも近い将来にはヨーロッパ全体をカバーするように拡張したいと思います。基準に一致する都市/天気の日が増えると、最も完璧な日を提示するのが難しくなるため、ユーザーのセッションからのデータにSparkMLlibとSparkStreamingを使用する余地があります。
IBMがSparkジョブをスケジュールする機能をすぐに追加して、サービスが完全に自動化されるようになることを願っています。
次の場所に移動すると、コンピューター、スマートフォン、またはタブレットでアプリケーションを自分でチェックアウトできます。 myperfectweather.eu 。
コードをピークにしたい場合は、 Github 。
My Perfect Weatherは、600人近くの参加者がいるIBMSparkathonの競合プロジェクトとして作成されました。大賞とファンのお気に入りを獲得しました。チェックしてください プロジェクトページ 詳細を知りたい場合。