本文概述
在前两篇文章中, 我向观众介绍了Apache Spark和Docker。现在, 我向你展示了包含上述两种技术的全功能应用程序。
动机”以数据的形式从天而降”, 它是由IBM组织的黑客马拉松引发的。 Sparkathon的目标是使用天气数据和适用于IBM Bluemix的Apache Spark的Analytics(分析)来构建与天气相关的移动应用程序。
我如何使用Apache Spark和Docker构建Weather App
IBM正大力投资Spark, 最近又收购了The Weather Channel的数字部分。因此, 此活动对于他们的宣传而言似乎是完美的。
灵感
你是否曾经抱怨过你所在地区的天气, 是否计划了一些休息时间并花了很多钱, 但不知道该去哪里?如果答案是肯定的, 那么你真的很喜欢My Perfect Weather应用程序。
为了说明如何使用该应用程序, 以下是一些用例:
- 你有一个孩子, 承诺过这个星期放风筝, 但是你住的地方绝对没有风, 你也不想违约。
- 你像我一样生活在多雨多雨的地方(苏格兰爱丁堡), 想要在皮肤上感到温暖, 绝对不下雨。
- 你有兴建堆雪人的冲动, 直到完成雪堆, 你才会休息。
- 你想去钓鱼, 这次, 你真的想抓东西。
它能做什么
服务背后的想法非常简单。首先, 定义给定时刻的理想天气对你而言意味着什么。目前, 你可以按温度, 风速, 降水类型和降水概率进行过滤, 如下图所示。然后, 该服务将完成剩下的工作, 并为你提供最匹配的目的地。结果是按完美天数(与原始查询匹配的天数)排序的, 这些天数是针对每个城市找到的, 并且仅限于前五天。完美的日子也带有不同的背景。
让我们看看如何将服务用于上一节中定义的用例。
- 将风速设置为16至32 km / h, 非常适合放风筝, 下雨的几率很小, 温度也较低。
- 将最低温度设置为足够温暖, 将下雨的机会设置为0%。
- 将温度设置在0°C左右并低于0°C, 选择雪作为降水类型, 并且降水机会较高。
- 将风速设置为小于16 km / h, 少雨少打云, 以免天气太晴朗并使鱼在水中更深, 温度合适。
下面的屏幕截图对应于第三个用例。
嘿!看来我要在赫尔辛基堆雪人
如果你愿意的话, 由于该应用程序已与旅行搜索服务Momondo集成在一起, 因此你可以轻松查看如何到达所选目的地。
我是如何建造的
基本上, 除外部旅行搜索服务之外的所有内容都在IBM Bluemix平台内部运行, 如以下屏幕快照所示。
IBM为黑客马拉松的所有参与者提供了免费试用, 因此我不必担心在哪里运行该应用程序。
让我们看看数据如何在应用程序中流动以及架构图中呈现的组件如何组合在一起。
Play应用托管在Docker容器内部。它的一项服务是能够联系天气服务, 并将10天预报下载到Cloudant中。在下载之后的一个步骤中, Spark从Cloudant读取原始天气数据, 进行处理并将其存储回Cloudant, 以供Play应用程序快速轻松地访问。
当用户导航到应用程序的主页时, 将向他们显示一个包含各种控件的表单, 以定义他们的理想天气。他们的输入被提交给后端, 该后端向Cloudant查询包含理想日子的城市。然后, 对前一个查询中返回的城市的整个十天的预报进行另一个查询。将获得的结果呈现给用户, 单元格代表每个城市每天的天气状况。每个城市的最后一个单元格都包含一个旅行服务的链接。单击它会将用户带到Momondo网站, 并且航班搜索表单将预先填写目的地和旅行日期。如果用户以前使用过该服务(并且该cookie在其浏览器中存储了cookie), 则可能还会预先填写旅行者的来源和人数。当然, 可以更改此表单上的字段。例如, 可以尝试不同的旅行日期以寻找更好的票价。
这几乎就是构建应用程序的方式。以下各节将详细介绍某些组件。
火花和天气见解
该项目的第一阶段用于弄清楚Weather API和其他Bluemix服务的工作方式, 随后是使用Spark进行初始天气数据探索。它让我了解了数据模型如何工作以及如何在应用程序中使用它。
就此应用而言, 仅使用以下Weather REST API端点中的第一个:
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”免费套餐的限制, 该限制是每天500个呼叫, 并决定出于演示目的, 我选择了欧洲50个旅游型城市。这样一来, 我每天可以为每个城市进行几次呼叫, 并处理失败的请求, 而不会失去使用API的权利。我将不得不开始付费, 以便有足够的请求来覆盖世界上大多数城市。
该项目的最终目标是将世界上所有城市的星火紧缩天气数据(约50, 000个)乘以十天的预报数据, 并每天执行几次, 以使预报尽可能准确。
所有Spark代码都驻留在Jupyter笔记本中。到目前为止, 没有其他方法可以执行Spark作业。从Cloudant DB读取原始天气数据, 进行处理并写回。
Cloudant NoSQL数据库
简而言之, 我发现使用Cloudant NoSQL DB非常令人愉快。它易于使用, 并且具有基于浏览器的良好UI。没有这样的驱动程序, 但是它具有简单的REST API, 并且可以通过HTTP直接进行交互。
但是, Bluemix Spark包含Cloudant数据源API, 该API可用于读取和写入Cloudant, 而无需进行低级调用。值得注意的是, 无法在Cloudant中从Spark创建新数据库, 因此必须事先创建(例如, 使用Web UI)。
播放框架
Web应用程序是用Scala编写的。这很简单。该控制器使用AngularJS和Bootstrap为一页应用程序提供服务, 并且该服务与Weather API和Cloudant进行交互。
我面临的一个有趣的挑战与IBM容器服务直接相关。我的意图是在端口80上运行该应用程序, 以使其易于使用。但是, 我在Bluemix中找不到使用Docker端口转发并将外部端口80映射到Play应用程序的Docker内部端口9000的任何方法。我的解决方法是在容器内以root用户身份运行(不建议这样做), 并编辑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仍然是IBM Bluemix的新增功能, 因此它具有某些局限性。当前, 该代码只能作为笔记本的一部分执行, 因此无法安排运行时间。在我参加骇客马拉松比赛的最后, 这真是一个发现。对于My Perfect Weather而言, 如果未手动运行Spark笔记本, 则显示的天气日将过时。我希望IBM能够尽快解决这一缺陷。
我还发现了Insights for Weather API的文档中的一个小错误, 该错误在注意到显示结果存在一些问题后才浮出水面。对于降水类型, 唯一的期望值为降雨和降雪, 但我还发现了第三个期望值。从天气的角度来看, 这似乎表示有雪在下雨, 因此为了简化应用程序, 将其视为雪。
我引以为傲的成就
我认为”完美天气”是个不错的主意, 我很自豪能够将所有这些各种技术迅速融合在一起来实施。尽管如此, 这是一个hack, 目的很多, 但最重要的是它可以正常工作!
我学到的是
在这个简短的项目中, 我学到了很多东西。我是IBM Bluemix的新手, 所以它本身就是一次冒险。
之前我从未听说过Cloudant DB, 但是有了MongoDB的一些经验, 过渡非常容易。
我还了解到我不应该从事前端工作。我是一个内在的后端开发人员, 没有使事情看起来更好的天赋, 因此与Bootstrap和CSS一起工作是一项搜索, 复制, 粘贴, 修改的练习。非常感谢我的妻子在设计, 视觉效果, 演示和一般建议方面的帮助。
我的完美天气的下一步是什么
我想添加更多的天气控制并将其扩展到不久的将来覆盖世界大部分地区或至少整个欧洲。随着越来越多的城市/天气日符合标准, 呈现最完美的日子将变得更具挑战性, 因此存在将Spark MLlib与Spark Streaming结合使用以处理来自用户会话的数据的可能性。
我希望IBM能够尽快添加调度Spark作业的功能, 以便该服务可以完全自动化。
总结
你可以通过导航到myperfectweather.eu在计算机, 智能手机或平板电脑上自行签出该应用程序。
如果你想在代码上达到顶峰, 请在Github上进行托管。
我的完美天气是IBM Sparkathon的一个竞争项目, 有将近600名参与者。它获得了大奖和粉丝最爱。如果你想了解更多信息, 请查看项目页面。
评论前必须登录!
注册