这是一个系列文章中的第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均值模型与流数据进行优步车辆何时在何地的实时分析。
而本文,即第三篇文章讨论了如何构建一个实时的仪表板,用以在谷歌地图上显示簇数据。下图描述了数据流转过程:
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服务代码片段中,我们:
vertx
实例,该实例提供对Vert.x核心API的访问。Router
对象,该对象将HTTP请求URL路由到处理程序。BridgeOptions
对象,并指定具有地址“dashboard”的消息通过事件总线桥。/eventbus/*
的路由路径与事件总线桥SockJSHandler
相关联,这将服务器端Vert.x事件总线扩展到客户端的JavaScript。HttpServer
对象,一个HTTP服务器实现。在下面的代码片段中,从MapR Streams 优步主题中获得消息,并发布到地址为“dashboard”的Vert.x事件总线。事物总线将消息传递给所有订阅此地址的处理程序。
客户端使用谷歌地图的热图层来直观地描绘曼哈顿上的优步行程中不同簇位置的强度。热图将较高强度的区域显示为红色,较低强度的区域显示为绿色。仪表板应用程序使用谷歌地图标记来标记簇中心。
为了学习下面的例子全部写在一个简单的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}
在下面的事件总线处理程序代码中,做了以下工作:
本博客系列中讨论的端到端应用程序体系结构的所有组件都可以与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