作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Radek奥斯托夫斯基
验证专家 在工程

Radek是一名区块链工程师,对以太坊智能合约感兴趣. 他在机器学习方面也有丰富的经验.

Expertise

PREVIOUSLY AT

Sony
Share

在我之前的两篇文章中,我向读者介绍了 Apache Spark and Docker. 现在是时候向您展示一个包含上述两种技术的功能齐全的应用程序了.

这种动机“以数据的形式从天而降”,是由IBM组织的一场黑客马拉松引发的. Sparkathon’s 目标是使用天气数据和分析Apache Spark for IBM Bluemix来构建与天气相关的移动应用程序.

IBM 投资Spark它最近还收购了苹果的数字部分 天气频道. 因此,这次活动似乎是他们宣传的绝佳机会.

Inspiration

你曾经抱怨过你所在地区的天气吗, 有没有计划好的休息时间和金钱, 但我不知道 where to go? 如果答案是肯定的,那么你真的会喜欢 我的完美天气 app.

图片:应用的用例.

为了说明如何使用这款应用,下面是一些用例:

  1. 你有一个答应过要一起放风筝的孩子 this 一周,但你住的地方绝对没有风,你不想食言.
  2. 你和我一样住在多风多雨的地方(爱丁堡), 苏格兰),想要感受到皮肤的温暖 no rain.
  3. 你有一种想堆雪人的冲动,不完成它你就不会休息.
  4. 你想去钓鱼,这一次,你真的想钓到什么.

What It Does

这项服务背后的理念非常简单. 首先,你定义在某一特定时刻,完美天气对你来说意味着什么. Currently, 你可以按温度过滤, wind speed, 降水类型和降水概率如下图所示. 然后,服务会完成剩下的工作,并向您呈现最佳匹配目的地. 结果是按完美天数排序的, 匹配原始查询的那些, 为每个城市查找,并且仅限于前五名. 完美的日子也有不同的背景.

让我们看看如何将服务用于上一节中定义的用例.

  1. 将风速设置在16至32公里/小时之间, 非常适合放风筝, 下雨的可能性很小,温度也很舒适.
  2. 将最低温度设置为足够温暖,将下雨的几率设置为0%.
  3. 将温度设置在0℃左右或以下, 选择雪作为降水类型,降水的可能性很高.
  4. 设置风速小于16公里/小时, 少雨和云,因为你想避免天气太晴朗,让鱼在水里游得更深, 舒适的温度.

If you wish, 你可以很容易地查看如何到达你选择的目的地, 因为这款应用集成了旅游搜索服务Momondo.

我是如何建立它的

基本上,除了外部旅游搜索服务外,其他服务都在IBM Bluemix平台内运行.

IBM向所有黑客马拉松的参与者提供免费试用, 这样我就不用担心在哪里运行应用了.

让我们看看数据是如何在应用程序中流动的,以及架构图中呈现的组件是如何组合在一起的.

Play应用程序托管在Docker容器中. 它的一项服务是能够联系气象服务并将10天的天气预报下载到Cloudant上. 在下载后的步骤中, Spark从Cloudant读取原始天气数据, 处理它并将其存储回Cloudant,以便Play应用程序快速方便地访问.

当用户导航到应用程序的主页面时, 他们会看到一个包含各种控件的表单来定义他们的完美天气. 他们的输入被提交到后端,后端向Cloudant查询包含完美天数的城市. Then, 另一个查询是针对前一个查询中返回的城市的所有十天的预测. 获得的结果将呈现给用户,单元格表示每个城市每天的天气状况. 每个城市的最后一个单元格包含一个到旅游服务的链接. 点击它,用户将进入Momondo网站,航班搜索表单将预先填充目的地和旅行日期. 如果用户以前使用过该服务(并且它在浏览器中存储了一个cookie), 旅客的来源和数量也可以预先填写. 当然,这个表单上的字段可以更改. 例如,人们可以尝试不同的旅行日期来寻找更好的票价.

这就是构建应用程序的基本方式. 下面几节将详细介绍其中一些组件.

图片:天气应用的组件.

火花和洞察天气

该项目的第一阶段是弄清楚Weather API和其他Bluemix服务是如何工作的, 然后使用Spark进行了初步的天气数据探索. 它让我了解了数据模型是如何工作的,以及如何在应用程序中使用它.

为了这个应用程序的目的,只使用以下Weather REST API端点中的第一个:

GET /v2/forecast/daily/10day -天气标准10天每日预报 
GET /v2/forecast/hour /24hour -天气标准每小时预报 
GET /v2/observations/current -当前天气观测
GET /v2/observations/timeseries/24小时-时间序列观测

在端点上查询每个感兴趣城市的天气预报 geocode 参数,该参数接受所讨论的地点的纬度和经度.

因为服务的性质, 向Weather API发出的请求数量与支持的城市数量相关. 我考虑了Insights for Weather Service的免费级别限制,即每天500个呼叫,并决定将其用于演示目的, 我认为欧洲50个旅游城市是安全的. 这让我可以每天为每个城市执行几个调用,并处理失败的请求,而不会有失去使用API的权利的风险. 我必须开始付费,以便有足够的请求覆盖世界上大多数城市.

该项目的最终目标是让Spark处理世界上所有城市(~50个)的天气数据,000)乘以10天的预测数据,每天进行几次,以使预测尽可能准确.

所有的Spark代码都驻留在 Jupyter notebook. 到目前为止,还没有其他的方法来执行Spark作业. 原始天气数据从Cloudant DB中读取、处理并回写.

Cloudant NoSQL DB

简而言之,我发现使用Cloudant NoSQL DB非常愉快. 它易于使用,并且具有良好的基于浏览器的UI. 没有这样的司机, 但它有一个简单的REST API,通过HTTP可以直接交互.

However, Bluemix Spark包含一个Cloudant数据源API, 它可以用来读写Cloudant而不需要低级调用. 值得注意的是,不可能从Spark在Cloudant中创建新数据库,因此必须事先创建, 例如web UI.

游戏框架

web应用程序是用Scala编写的. 这很简单. 控制器使用AngularJS和Bootstrap为一个单页应用提供服务, 该服务与Weather API和Cloudant进行交互.

我面临的一个有趣的挑战与IBM容器服务直接相关. 我的意图是在80端口上运行应用程序,这样用户就方便了. However, 我无法在Bluemix中找到任何方法来使用Docker端口转发并将外部端口80映射到Play应用程序的Docker内部端口9000. 我的解决办法是运行 root 容器内部(不推荐的做法),并编辑Play的应用程序.conf:

#生产端口
play.server.http.port = "80"

Docker

Docker非常有用,特别是在部署到Bluemix时. 我不需要了解云计算应用程序的任何知识, 不要担心Scala构建包或其他任何东西. 我可以推送我的Docker映像并看到它正在运行.

为了创建Docker映像,我使用了Typesafe Docker Plugin,所以我甚至不需要一个合适的Dockerfile.

在简短的初始配置后,只需要几个命令就可以看到应用程序在云中运行:

#登录IBM Bluemix
cf login
cf ic login

#在本地创建图像
sbt码头工人:publishLocal

# rename it
Docker标签- my-perfect-weather.0-SNAPSHOT注册表.ng.bluemix.net/radek1st/my-perfect-weather: 1.0

# push it
Docker推送注册表.ng.bluemix.net/radek1st/my-perfect-weather: 1.0

# and run it
Cf IC运行——name my-perfect-weather -p 80 -m 2048注册表.ng.bluemix.net/radek1st/my-perfect-weather: 1.0

值得注意的是,Bluemix容器服务在运行映像之前会对其执行漏洞评估. 尽管这对于我的应用来说并没有什么意义,但我仍然需要进行修补 /etc/login.defs 父图像的,所以它可以运行. Here’s the Dockerfile 如果你感兴趣的话.

我遇到的挑战

由于Spark仍然是IBM Bluemix的新成员,因此它有一定的局限性. Currently, 代码只能作为笔记本的一部分执行, 因此,没有办法安排运行. 这是我在黑客马拉松结束时的一个重大发现. 这意味着什么? 我的完美天气 如果Spark笔记本不重新运行,所呈现的天气会慢慢过时吗 manually. 我希望IBM能够迅速解决这个缺点.

在注意到显示结果的一些问题后,我还在Insights for Weather API的文档中发现了一个小错误. For the 降水类型,唯一的期望值是 rain and snow,但我也发现了第三个值 precip. 从天气背景来看, 这似乎预示着有雨有雪, 因此,为了简化应用程序,它被视为雪.

我引以为傲的成就

图:在天气应用中使用Docker和Spark.

I think 我的完美天气 是个很酷的主意吗, 我很自豪我能很快地实现它,把所有不同的技术融合在一起. 尽管如此,这是一个黑客,有很多漏洞,但最重要的是它在起作用!

我学到了什么

在这个短暂的项目中,我学到了很多. 我是IBM Bluemix的新手,所以它本身就是一次冒险.

我以前从未听说过Cloudant DB, 但是对于MongoDB的一些经验来说,转换相当容易.

我也认识到我不应该在前端工作. 我本质上是一个后端开发人员,没有 让事情看起来漂亮的天赋因此,使用Bootstrap和CSS是一个搜索-复制-粘贴-修改的练习. 非常感谢我的妻子在设计、视觉效果、演示和一般建议方面的帮助.

《欧博体育app下载》的下一个节目是什么

我想增加更多的天气控制,并将其扩展到世界大部分地区, 或者至少在不久的将来整个欧洲. 有更多符合标准的城市/天气天数, 呈现最完美的日子将更具挑战性, 因此,使用Spark MLlib和Spark Streaming来处理来自用户会话的数据是有一定范围的.

我希望IBM能够很快添加调度Spark作业的功能, 所以这项服务可以变得完全自动化.

Conclusion

你可以在自己的电脑上亲自查看应用程序, 通过智能手机或平板电脑导航到 myperfectweather.eu.

如果你想在代码上有一个峰值,它是托管的 Github.

我的完美天气是作为IBM Sparkathon的竞争项目创建的,有近600名参与者. 它获得了大奖和粉丝最爱. Check out the project page 如果你想知道更多.

聘请Toptal这方面的专家.
Hire Now
Radek奥斯托夫斯基

Radek奥斯托夫斯基

验证专家 在工程

普吉岛,泰国

2014年9月24日成为会员

作者简介

Radek是一名区块链工程师,对以太坊智能合约感兴趣. 他在机器学习方面也有丰富的经验.

作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Expertise

PREVIOUSLY AT

Sony

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® community.

" class="hidden">百万站