目录
SparkStreaming + LogisticRegression 实现路况预测
SparkStreaming + LogisticRegression 实现路况预测
1.项目介绍
本篇介绍如何实现一个实时路况拥堵情况预测功能的系统。我们先来分析一下如何实现,以此来确定项目所使用的技术栈。
首先,我们来在现这样一个场景:假设有一条路,这条路上有2个摄像头,用来拍摄记录车辆经过时的速度,然后他会把数据实时发送到后台对应的消息队列中(我们用 kafka)。这就是我们的数据源。然后我们获取到数据,可以对数据进行处理计算,得出我们想要分析的结果,然后把数据存入 redis 中供 web 端展示使用。项目基本架构如下图所示:
既然是预测,那我们就要确定所使用的机器学习算法是哪一个?这里我们选择 LogisticRegression (逻辑回归算法)。为什么要选择这个算法呢?首先,我们知道逻辑回归是做分类的,尤其是二分类。这时候你可能会问,我路况的拥堵情况可能有很多种,比如我们可以把他分为 良好——一般——严重这3个等级。也就是说这是个多分类问题。那么我们利用逻辑回归算法做出分类呢?我们可以把问题简化,因为逻辑回归就适合做二分类,那我们为什么不把路况情况分为 良好——其他,一般——其他?这样我们就需要2个模型来完成一个3分类问题。其实所有的多分类我们都可以转化为二分类。
2.前置知识
2.1 RDD
RDD 是 spark 中的核心概念,官方称为弹性分布式数据集,你可以把他认为就是一堆数据的抽象,这堆数据可以利用他的 API 进行一系列的转换、计算。
2.2 SparkStreaming
SparkStreaming 是一个流式微批计算,说白了就是攒一堆数据隔一段时间,计算一次,就这样一直持续下去。他对外封装了 DStream 这个 对象,你可以简单的把他看为另一种形式的RDD
。官方介绍地址是 http://spark.apache.org/docs/latest/streaming-programming-guide.html。
2.3 kafka
大数据中常用的消息队列(mq),你可以简单的把他看为一个快递员,就是用来存数据和取数据的地方。他干不了复杂的事,所以把他想简单一点。他的作用就是 削峰填谷
,类似于堤坝的作用。在系统中就是 SparkStreaming 的数据源。
2.4 redis
一个高性能的K-V数据库,用来做缓存。没啥好说的。
2.5 LogisticRegression
逻辑回归算法是广义上的线性回归算法,线性回归算法是找一根线来拟合空间中的点,用这样一根线来代表空间中的点。逻辑回归是用来做2分类的。逻辑回归用到了线性回归算法公式,所以称之为广义上的线性回归算法。大家可以把这些算法当作一个个工具来使用就行了。代码上大牛们已经帮我们封装的很好了,我们只需要知道什么时候用什么样的算法最合适,这就够了。
3.代码实现
3.1 数据准备
这是我们数据其中的一条
'310999003702', '3109990037020320140820141230645','沪M05016','','2014-08-20 14:09:35','0',10,'NS', 0.00,'2','','310999','310999003702','03','','','2','','','2014-08-20 14:12:30','2014-08-20 14:16:13',0,0,'2014-08-21 18:50:05','','',' '
其中第一列数据为相机编号,同时也代表了一条路。第三列数据是车牌号,第四列是经过时间,第五列是经过时候的车速。
3.2 代码
redis 连接客户端工具
import org.apache.commons.pool2.impl.GenericObjectPoolConfig
import redis.clients.jedis.JedisPool
object RedisClient extends Serializable {
val redisHost