文章目录
- 电子围栏简介和应用场景
- 电子围栏规则和分析结果数据结构
- 电子围栏分析步骤
- 电子围栏分析任务实现
- 广播状态与实现
- 电子围栏中的 ConnectStreamed应用
- 电子围栏分析结果入库
- 测试电子围栏
电子围栏简介和应用场景
- 电子围栏简介和意义
地理围栏是一个虚拟的空间围栏,可以帮助开发者检测人或物何时进入或离开预定义区域,并支持实时报警功能。
- 电子围栏的应用场景
- 签到打卡类场景
- 共享单车类场景
- 线下门店促销场景
- 创建电子围栏
- 在此项目中,使用的电子围栏是规则的圆形,判断是否在圆形电子围栏区域内,可以使用车辆位置和中心点球面距离小于等于半径,在电子围栏的区域内。
- 还有一些不规则的电子围栏,这些可以使用射线取点的个数来判断是否在电子围栏内,如果是偶数在电子围栏外,否则是电子围栏内。
电子围栏规则和分析结果数据结构
- 电子围栏的定义
- 电子围栏规则数据结构
- 字段
- 数据样本示例
- 电子围栏分析结果数据结构
- 字段
电子围栏分析步骤
- 电子围栏任务8大步骤
- 电子围栏分析任务设置、原始数据json解析、过滤异常数据
- 读取已存在电子围栏中的车辆与电子围栏信息(广播流临时结果数据)
- 原始车辆数据与电子围栏广播流进行合并,生成电子围栏规则模型流数据(DStream)
- 创建90秒翻滚窗口,计算电子围栏信息(ElectricFenceModel中的值根据车辆是否在围栏内进行设置)
- 读取电子围栏分析结果表数据并广播
- 翻滚窗口电子围栏对象模型流数据与电子围栏分析结果数据广播流进行connect
- 对电子围栏对象模型,添加uuid和inMySQL(车辆是否已存在mysql表中)
- 电子围栏分析结果数据落地mysql,也可以选择落地mongo
电子围栏分析任务实现
- 电子栅栏分析的逻辑图
- 电子围栏分析主类:ElectricFenceTask
- 简化 ItcastDataObj 对象:ItcastDataPartObj.java
- 简化解析 ItcastParseUtil 对象: JsonParsePartUtil.java
- 测试工具类对象
广播状态与实现
- 回顾广播变量概念
广播变量就是将变量广播到各个 taskmanager的内存中,可以共享数据,一般情况下广播变量的类型是 map 类型 key->value
- 广播变量的数据格式是——map类型state
- 如何使用广播变量
HashMap<String,ElectriFenceResultTmp> ,其中String:vin
- 电子围栏转换临时对象——ElectricFenceResultTmp
- 自定义 source 读取 MySQL 的数据源并广播
- 定义读取电子围栏规则类——MysqlElectricFenceSouce
返回类型为 HashMap<String,ElectricFenceResultTmp>
- 读取数据库中配置信息
电子围栏中的 ConnectStreamed应用
connect流说明
connect流使用场景
两点之间球面距离的计算——DistanceCaculateUtil
- 导入工具jar包坐标
- 两点之间球面距离的计算工具类
电子围栏中自定义对象将两个数据流合并
- 通过关联两个数据流后CoFlatMap 后生成实体类—— ElectricFenceModel
- 实现将两个流合并CoFlatMapFunction接口—— ElectricFenceRulesFuntion
设置窗口并计算确定是否在电子围栏内告警
- 设置水印机制
- 根据 vin 进行分组
- 创建 90 秒翻滚窗口
- 自定义电子围栏窗口实现类:ElectricFenceWindowFunction
- apply 方法步骤如下
- 如果判断为进入到电子围栏,进入到电子围栏的第一条数据的时间会被记录下来
合并分析电子围栏结果
读取电子围栏分析结果并广播
- 读取mysql的电子围栏结果表的数据——MysqlElectricFenceResultSource
- 读取电子栅栏的 vin 和 最近id
- 将读取的电子栅栏信息数据流广播出去
窗口流数据与广播流数据连接
- 将电子栅栏模型数据流和电子栅栏 获取的<vin,id>流进行关联,并进行 flatMap
- 实现电子围栏分析结果模型添加 uuid 和 inMysql 字段 —— ElectricFenceModelFunction
电子围栏分析结果入库
- 将电子围栏分析结果数据写入到 mysql 数据库中 —— ElectricFenceMysqlSink
测试电子围栏