文章目录
交通管理项目
数据处理流程图
任务提交
1.最次也是脚本化提交
2.平台化提交:在webUI页面上点击提交按钮,发送请求到响应的Controller,在Controller中调用指定的脚本,开启spark Streaming计算,通过Spark Streaming进行实时计算,并把结果显示在webUI页面。
3.在Controller中如何调用制定脚本?
首先在点击提交按钮时,将参数保存到MySQL数据库指定表中(taskId,submitTime,startTime,params),在调用脚本的时候只传递taskId,等待要执行./spark-submit时,再将taskId作为参数去MySQL中查询相应的参数,作为spark-submit的参数传递过去,解决了多次提交参数个数不一致的问题。
数据表
monitor_flow_action 车流量监控表
monitor_camera_info 卡口摄像头基本关系表
数据来源
1.如果任务在本地执行,数据是每次运行模拟
2.如果任务在集群中运行,数据来源是Hive表。
业务项目
core
1.卡扣监控
正常的卡扣数 7
异常的卡扣数 2
正常的摄像头个数 1000
异常的摄像头个数 5
异常的摄像头详细信息 0001:33333,44444~00005:12814,87463,99123
monitor_flow_action:
(0006,11111_22222,33333,44444,55555)
monitor_camera_info:
(0006,11111_22222,33333,44444,55555)
提交任务命令:
./spark-submit --master spark://node1:7077,node2:7077 --jars /root/test/mysql-connector-java-5.1.47.jar,/root/test/fastjson-1.2.11.jar --driver-class-path /root/test/mysql-connector-java-5.1.47.jar:/root/test/fastjson-1.2.11.jar --class com.bjsxt.spark.skynet.MonitorFlowAnalyze /root/test/TrafficProject-1.0-SNAPSHOT.jar 1
./spark-submit --master spark://node1:7077,node2:7077 --class com.bjsxt.spark.skynet.MonitorFlowAnalyze /root/test/TrafficProject-1.0-SNAPSHOT-jar-with-dependencies.jar 1
https://search.maven.org/classic/#advancedsearch
2.车流量top5的卡扣
3.top5卡扣下所有车辆详细信息
4.获取车辆高速通过的TOPN卡扣
二次排序问题
A B
speed >=120 高速 1 1
90<=speed<120 中速 2 10
60<=speed<90 正常 3 2
speed<60 低速 10 20
5.车辆高速这5个卡扣每个卡扣下车辆速度top10
分组取topN问题
1.原生集合排序
2.定义定长数组
6.碰撞分析
01,02中这一天同时出现的车辆
01:(car,row) 02:(car,row)
(car,row).join(car,row)
01:car 02:car
car02.intersection(car02)
7.车辆轨迹
统计卡扣0001下所有车辆的轨迹 – take(20)
8.随机抽取车辆
在一天中抽取1000辆车分析当前道路的运行情况。这些车辆要分布均匀
一天中通过了车辆10000车。要随机抽取1000量车来代表当前道路的运行情况。怎么抽?
sample(0.1) = 1000
00-01:100 -- 100/10000 * 1000 = 10
01-02:200 -- 20
02-03:50 -- 5
03-04:100 -- 10
04-05:100
06-07:100
07-08:2000 --200
08-09:2000 --200
...
...
按照小时段抽取车辆。
9.计算卡扣流量转换率
一辆车的轨迹:
0001->0002->0001->0003->0001->0002
卡扣0001到卡扣0002的车流量转化率:2/3
0001,0002,0003,0004,0005:
0001,0002:
经过卡扣0001又经过卡扣0002的车辆数/经过卡扣0001的车辆数
0001,0002,0003:
经过卡扣0001,0002又经过卡扣0003的车辆数/经过卡扣0001,0002的车辆数
0001,0002,0003,0004:
经过卡扣0001,0002,0003又经过卡扣0004的车辆数/经过卡扣0001,0002,0003的车辆数
0001,0002,0003,0004,0005:
经过卡扣0001,0002,0003,0004又经过卡扣0005的车辆数/经过卡扣0001,0002,0003,0004的车辆数
10.SparkSQL
计算每个区域中车流量top3道路
海淀区 建材城西路 10000 0001=3000|0002=4000|0003=3000
海淀区 建材城东路 8000 0004=3000|0005=5000
海淀区 安宁庄东路 7000
朝阳区 朝阳路01 9000
朝阳区 朝阳路02 8000
朝阳区 朝阳路03 7000
tmp_car_flow_basic:
area_id area_name road_id monitor_id car
select
area_name,road_id,car_count,monitor_infos
from
(select
area_name,road_id, car_count,monitor_infos,row_number() over (partition by area_name order by car_count desc) as rn
from
(select
area_name,road_id,count(car) as car_count,UDAF(monitor_id,x,x,x) as monitor_infos
from
tmp_car_flow_basic
group by
area_name,road_id) tmp_area_road_flow_count) tmp
where rn<=3
11.道路实时拥堵情况
DStream<ConsumerRecord<String, String>> ds1 = KafkaUtil.createDirectStream(xxxx)
DStream ds2 = ds1.map(…)
//DStream<String,tuple2(speed,1)> ds3 = ds2.map((monitor_id,(speed,1)))
DStream<String,speed> ds3 = ds2.map((monitorid,speed))
DStream<String,tuple2(speed,1)> ds3 = ds3.mapValues(speed=>{(speed,1)})
Dstream<monitorid,tuple2<SpeedCount,carCount>> ds4 = ds3.reducdByKeyAndWindow((tuple2<Speed,1> t1,tuple2<Speed,1> t2)
=>{new Tuple2<t1._1+t2._1,t1._2+t2._1>})
ds4.foreachRDD(....)
任务提交
不完整包提交:
./spark-submit --master spark://n1:7077 --jars /home/lys/fastjson-1.2.35.jar[,]
–driver-class-path /home/lys/fastjson-1.2.35.jar[:]
–class com.bjsxt.spark.skynet.MonitorFlowAnalyze
/home/lys/TrafficProject-1.0-SNAPSHOT.jar 1
完整包提交:
./spark-submit --master spark://n1:7077
–class com.bjsxt.spark.skynet.MonitorFlowAnalyze
/home/lys/TrafficProject-1.0-SNAPSHOT.jar 1
车辆轨迹
卡口速度TopN10
使用广播变量