使用Apache API监控Uber的实时数据,第3篇:使用Vert.x的实时仪表板

这是一个系列文章中的第3篇,该系列由4篇组成。请务必先读第1篇第2篇

根据Gartner的统计,到2020年,智能城市将使用约13.9亿辆联网汽车,物联网(IoT)传感器和设备。通过对城市内的位置和行为模式的分析将优化交通、规划更好的决策和推送更智能的广告。目前大数据取得优势的十大领域之一就是改善城市。例如,分析汽车的GPS数据可以使城市根据实时交通信息优化交通流量。电信公司正在使用手机位置数据,识别和预测位置的活动趋势和大型城市人口模式。基于地理定位数据的机器学习应用正被用于电信、旅行、市场营销和制造业,用以识别模式和趋势,例如用于推荐服务,异常检测和欺诈。

这是一系列博客中的第三篇。本系列讨论一个端到端应用程序的架构,该程序将流数据与机器学习(ML)相结合,对优步(Uber)汽车不同时间不同地点的聚集情况进行实时分析和可视化,以预测和可视化优步汽车最受欢迎的位置。

处理大量的实时数据对应用程序体系结构提出了很高的要求。为了增加伸缩性,Uber和其他公司已经从单体应用架构(monolithic)转为事件驱动微服务架构(event-driven microservices architecture)。在本文中,我们将使用Vert.x(一个用于构建反应性事件驱动的微服务的工具包)来实现实时Web应用程序。

本系列的第一篇讨论了如何使用Apache Spark K-means算法创建机器学习模型,该模型按位置对优步数据进行聚类。

聚类算法通过分析输入示例之间的相似性和发现在数据集合中的分类信息将输入样例分成不同类别。聚类算法可用于:

  • 客户细分。
  • 趋势预测和异常检测。
  • 分组搜索结果或查找类似文章。

K均值(K-means)算法将观测点分成K个簇(cluster),其中每个观测点属于观测点距离簇均值中心最近的簇。下面,从优步数据分析(K = 10)返回的模型聚类中心的输出显示在谷歌(Google)地图上:

第二篇文章中讨论了使用保存的K均值模型与流数据进行优步车辆何时在何地的实时分析。

而本文,即第三篇文章讨论了如何构建一个实时的仪表板,用以在谷歌地图上显示簇数据。下图描述了数据流转过程:

  • 使用Kafka的API将优步行程数据发布到MapR Streams主题(topic)。
  • 订阅了上一步主题的Spark流应用,将簇的位置信息加入收到的事件中,并把结果以JSON格式发布到另一个主题。
  • 订阅第二个主题的Vert.x 网络应用程序在热图中显示优步行程簇。

Vert.x工具包和网络应用程序体系结构

Vert.x工具包是事件驱动的,使用事件总线(event bus)将事件分发到工作处理程序服务(work handler service),工作处理程序服务也称垂直服务(verticle)。Vert.x采用同Node.js类似的基于单线程事件循环的非阻塞式模型处理工作。Vert.x的 SockJS事件总线桥(SockJS event bus bridge)允许网络应用程序使用Websockets与Vert.x事件总线进行双向通信,这使得可以使用服务器推送功能来构建实时Web应用程序。

下面展示优步仪表板应用程序体系结构更多细节:

  • Vert.x Kafka客户端接收来自MapR Streams主题的消息,并在Vert.x事件总线上发布消息。
  • JavaScript浏览器客户端使用SockJS订阅Vert.x事件总线,并在谷歌热图上显示优步行程地点。

Vert.x仪表板服务

在下面的Vert.x服务代码片段中,我们:

  • 创建一个 vertx 实例,该实例提供对Vert.x核心API的访问。
  • 创建一个 Router 对象,该对象将HTTP请求URL路由到处理程序。
  • 创建一个 BridgeOptions 对象,并指定具有地址“dashboard”的消息通过事件总线桥。
  • 将匹配 /eventbus/* 的路由路径与事件总线桥SockJSHandler相关联,这将服务器端Vert.x事件总线扩展到客户端的JavaScript。
  • 创建一个 HttpServer 对象,一个HTTP服务器实现。
  • 使服务器侦听传入请求的端口。

在下面的代码片段中,从MapR Streams 优步主题中获得消息,并发布到地址为“dashboard”的Vert.x事件总线。事物总线将消息传递给所有订阅此地址的处理程序。

Vert.x仪表板 HTML5 JavaScript客户端

客户端使用谷歌地图的热图层来直观地描绘曼哈顿上的优步行程中不同簇位置的强度。热图将较高强度的区域显示为红色,较低强度的区域显示为绿色。仪表板应用程序使用谷歌地图标记来标记簇中心。

为了学习下面的例子全部写在一个简单的index.html文件。下面为调用Vert.x,SockJS,jQuery和Google Maps所需的JavaScript代码。需要注意的是,调用谷歌地图的API需要你自己的密钥。

创建地图

为了将地图显示在网页上,首先通过创建一个命名的div元素为它保留一个位置div id="map"。然后,在initMap(页面加载时调用,用于初始化地图)函数中创建一个谷歌地图实例,并通过document.getElementById()方法指定对div元素的引用。接下来,用数组形式创建HeatmapLayer 对象,里面存储一个空的地理数据。后面我们将使用从服务器获得的地理位置更新这些数据。

创建事件总线

下面,我们创建一个vertx.EventBus对象的实例,指定要连接的URI位置。然后,我们添加一个onopen监听器,该监听器为地址“dashboard”注册一个事件总线处理程序。该处理程序将接收所有发布到“dashboard”地址的消息。

从服务器应用程序接收到的消息是JSON格式,每个行程位置包含以下内容:行程的簇中心ID,日期时间,纬度和经度,行程基准以及簇中心的纬度和经度。一个例子如下所示:

“cid”:18“dt”:2014-08-01 08:51:00“lat”:40.6858“lon”:73.9923“base”:“B02682”“clat”:40.67462874550765 ,“clon”: -  73.98667466026531}

在下面的事件总线处理程序代码中,做了以下工作:

  • 解析JSON消息。
  • 将行程的经度和纬度点添加到位置点数组,然后将这些数据设置在谷歌热度图图层对象上。
  • 如果尚未添加标记,则在地图上为该簇中心位置添加一个标记。
  • 增加此簇中心收到的位置点数量。

本博客系列中讨论的端到端应用程序体系结构的所有组件都可以与MapR融合数据平台(MapR Converged Data Platform)在同一个集群上运行。

下载并运行示例

Vert.x不需要应用程序服务器; 它很容易作为一个包含依赖的脂肪JAR文件(fat JAR)以常规Jave应用程序形式运行,命令如下所示:

$ java -jar ./target/mapr-streams-vertx-uberdashboard-1.0-SNAPSHOT-fat.jar web 8080 / apps / iot_stream:uberp

其他资源

本文的版权归 wheel_BL 所有,如需转载请联系作者。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏知晓程序

附近的小程序新增「分类筛选」功能,你的小程序被分到哪了?

知晓程序(微信号 zxcx0101)发现,今天(8 月 11 日)下午,微信悄然更新了「附近的小程序」列表,为它增加了一个分类筛选功能。

932
来自专栏木子昭的博客

你的照片安全么?

照片元信息 我们平时拍摄的图片,不仅包含了可见的像素信息,还包含了我们看不到的隐藏信息(元信息),而这些元信息,往往会不经意间泄露我们的隐私. ---- ...

4047
来自专栏大数据和云计算技术

大数据仓库-kudu

数据仓库里面存储引擎是非常重要的,存储引擎的好坏,基本决定了整个数仓的基础。 kudu目标 cloudera公司最近发布了一个kudu存储引擎。按照cloud...

4487
来自专栏全栈

全栈是什么体验?想想都恐怖

1355
来自专栏FreeBuf

浅谈拒绝服务攻击的原理与防御(5) | NTP反射攻击复现

0×01 故事起因 前两天以为freebuf上的网友stream(年龄、性别不详)私信我说他在阿里云上的服务器被NTP攻击了,流量超过10G,希望我帮忙一起分析...

4045
来自专栏Coding01

我也来打造一个个人阅读追踪系统

国庆放假期间,偶然发现这篇文章《Serverless实战:打造个人阅读追踪系统》http://insights.thoughtworks.cn/serverle...

1102
来自专栏互联网数据官iCDO

App数据分析(3)变化多端的事件报告

iCDO原创作者:孙维 本文长度约为3800字,预估阅读时间10分钟。 上一篇文中(点此阅读),我们讲了使用Google Analytics(以下简称GA)进行...

3847
来自专栏机器之心

资源 | 挑战谷歌,Facebook 发布交互数据可视化工具 Visdom

选自GitHub 机器之心编译 参与:微胖、吴攀 FAIR 发布了 Visdom,一款可在 Torch、PyTorch 以及 NumPy 上实现交互式数据可视化...

2838
来自专栏CreateAMind

car_demo代码简介

该程序是基于ros和gazebo的。ros简单来讲就是一个robot OS(机器人操作系统),它使你简单方便地制作机器人(具体优点就不说了,感兴趣的可以自己g...

1272
来自专栏顶级程序员

开源巨献:Google最热门60款开源项目

作者:程序猿(微信号:imkuqin) 猿妹 链接:https://www.itcodemonkey.com/article/329.html(点击尾部阅读原...

6359

扫码关注云+社区