# Car **Repository Path**: xiewendomg/car ## Basic Information - **Project Name**: Car - **Description**: 新能源汽车实时数仓 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2024-04-22 - **Last Updated**: 2024-04-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 基于Flink的新能源汽车实时监测系统 ## 一、项目架构 ![image-20240118214402597](https://gitee.com/zhikee/drawingbed/raw/master/img/202401182144714.png) ## 二、数据说明 ​ 本次处理的数据全部为车辆日志数据,即车辆在行驶过程中每30秒发送的车辆自身状态的记录。除了日志数据之外,我们还需要处理车辆维度数据,这些数据存储在数据库中。 ### 2.1 车辆日志数据 ​ 车辆日志数据为Json格式的文本文件。每行为一个完整的Json串,其中字段含义如下: | 字段名 | 字段类型 | | :-----------------------------------------: | :------------------------: | | vin | 车辆唯一编码 | | timestamp | 日志采集时间 | | car_status | 车辆状态 | | charg_status | 充电状态 | | execution_mode | 运行模式 | | velocity | 车速 | | mileage | 里程 | | voltage | 总电压 | | electric_current | 总电流 | | soc | SOC | | dc_status | DC-DC状态 | | gear | 挡位 | | insulation_resistance | 绝缘电阻 | | motor_count | 驱动电机个数 | | motor_list | 驱动电机列表 | | fuel_cell_voltage | 燃料电池电压 | | fuel_cell_current | 燃料电池电流 | | fuel_cell_consume_rate | 燃料消耗率 | | fuel_cell_temperature_probe_count | 燃料电池温度探针总数 | | fuel_cell_temperature | 燃料电池温度值 | | fuel_cell_max_temperature | 氢系统中最高温度 | | fuel_cell_max_temperature_probe_id | 氢系统中最高温度探针号 | | fuel_cell_max_hydrogen_consistency | 氢气最高浓度 | | fuel_cell_max_hydrogen_consistency_probe_id | 氢气最高浓度传感器代号 | | fuel_cell_max_hydrogen_pressure | 氢气最高压力 | | fuel_cell_max_hydrogen_pressure_probe_id | 氢气最高压力传感器代号 | | fuel_cell_dc_status | 高压DC-DC状态 | | engine_status | 发动机状态 | | crankshaft_speed | 曲轴转速 | | fuel_consume_rate | 燃料消耗率 | | max_voltage_battery_pack_id | 最高电压电池子系统号 | | max_voltage_battery_id | 最高电压电池单体代号 | | max_voltage | 电池单体电压最高值 | | min_temperature_subsystem_id | 最低电压电池子系统号 | | min_voltage_battery_id | 最低电压电池单体代号 | | min_voltage | 电池单体电压最低值 | | max_temperature_subsystem_id | 最高温度子系统号 | | max_temperature_probe_id | 最高温度探针号 | | max_temperature | 最高温度值 | | min_voltage_battery_pack_id | 最低温度子系统号 | | min_temperature_probe_id | 最低温度探针号 | | min_temperature | 最低温度值 | | alarm_level | 最高报警等级 | | alarm_sign | 通用报警标志 | | custom_battery_alarm_count | 可充电储能装置故障总数N1 | | custom_battery_alarm_list | 可充电储能装置故障代码列表 | | custom_motor_alarm_count | 驱动电机故障总数N2 | | custom_motor_alarm_list | 驱动电机故障代码列表 | | custom_engine_alarm_count | 发动机故障总数N3 | | custom_engine_alarm_list | 发动机故障代码列表 | | other_alarm_count | 其他故障总数N4 | | other_alarm_list | 其他故障代码列表 | | battery_count | 单体电池总数 | | battery_pack_count | 单体电池包总数 | | battery_voltages | 单体电池电压值列表 | | battery_temperature_probe_count | 单体电池温度探针总数 | | battery_pack_temperature_count | 单体电池包总数 | | battery_temperatures | 单体电池温度值列表 | ### 2.2 车辆维度数据 | 字段名 | 字段说明 | | :-------------: | :---------------------: | | id | 车辆唯一编码 | | type_id | 车型ID | | type | 车型 | | sale_type | 销售车型 | | trademark | 品牌 | | company | 厂商 | | seating_capcity | 准载人数 | | power_type | 车辆动力类型 | | charge_type | 车辆支持充电类型 | | category | 车辆分类 | | weight_kg | 总质量(kg) | | warranty | 整车质保期(年/万公里) | ### 2.3 日志编码数据(字典表) | 字段名 | 字段说明 | | :-------: | :------: | | type | 编码类型 | | code_id | 编码ID | | code_name | 编码名称 | ## 三、数仓建模 ### 3.1 业务总线矩阵 [业务总线矩阵](https://www.yuque.com/yuqueyonghuw0k0nl/mmgfr4/qg8tu3bxf1ag4mwl) ### 3.2 指标 [指标](https://www.yuque.com/yuqueyonghuw0k0nl/mmgfr4/gg7b7ckawamcwoli) ## 四、数据采集 ### 4.1 车辆日志采集 ​ 车辆日志数据已经存储到服务器中了,此处将配置Flume将数据采集到Kafka的car_log(Topic)中,此处使用TaildirSource和KafkaChannel。(采集文件路径为\flume\flie_to_kafka.conf) - TaildirSource:支持断点续传,可以实时监控多目录 - KafkaChannel:省去Sink,提高效率 ### 4.2 维度数据采集 ​ 维度数据存储在mysql中,主要有car_info和dic_code两张表,通过flink cdc将数据实时采集到kafka的car_db(Topic中)。(此处详看\car_realtime\src\main\java\com\zhike\app\ods\OdsApp.java) ## 五、DIM层 ​ DIM层表用于维度关联,这里选用HBase ### 5.1 配置表 ​ 本层的任务是将维度数据直接写入到不同的 HBase 表中。那么如何让程序知道流中的哪些数据是维度数据?维度数据又应该写到 HBase 的哪些表中?维度表发生变化改怎么处理?为了解决这个问题,选择在 MySQL 中构建一张配置表,通过 Flink CDC 将配置表信息读取到程序中,只要维度表发生改变,Flink CDC就能实时监测到并配置为广播流广播出去。 ### 5.2 配置表设计 ​ 配置表将设计五个字段(必须开启binlog日志) - source_table:作为数据源的业务数据表名 - sink_table:作为数据目的地的 Phoenix 表名 - sink_columns:Phoenix 表字段 - sink_pk:Phoenix 表主键 - sink_extend:Phoenix 建表扩展,即建表时一些额外的配置语句 ​ 将 source_table 作为配置表的主键(也将作为广播状态的key),可以通过它获取唯一的目标表名、字段、主键和建表扩展,从而得到完整的 Phoenix 建表语句 **代码详看**(car\car_realtime\src\main\java\com\zhike\app\dim\DimApp.java) ## 六、DWD层 ​ DWD层主要根据维度建模理论,该层存储维度模型的事实表,业务总线矩阵的一个业务过程代表一个事实,分别存储在不同topic中 **代码详看**(car\car_realtime\src\main\java\com\zhike\app\dwd\DwdApp.java) ## 七、DWS层 ​ DWS层主要将不同数据域根据不同维度对各个窗口的日志数据进行预聚合操作并存储到Doris中 ### 7.1行驶域 #### 7.1.1车辆行驶表(dws_trip_window) ​ 车辆行驶表主要存储每一辆车在各个窗口的平均速度,行驶里程,急加减次数等 **代码详看** (car\car_realtime\src\main\java\com\zhike\app\dws\DwsTripWindow.java) #### 7.1.2 车型品牌行驶表(dws_trip_bt_window) ​ 车型品牌行驶表主要存储每种车型,品牌在各个窗口的平均速度,行驶里程,急加减次数等 **代码详看** (src/main/java/com/zhike/app/dws/DwsTripBrandTypeWindow.java) ### 7.2 温控域 #### 7.2.1 车辆温度信息表(dws_temp_table_window) ​ 车辆温度信息表主要存储每一辆车在各个窗口的电机,电机控制器,电池等温度信息 **代码详看 **(src/main/java/com/zhike/app/dws/DwsTempWindow.java) ### 7.3 告警域 #### 7.3.1 车辆告警表(dws_alarm_window) ​ 车辆告警表主要存储每辆车在各个窗口的告警信息 **代码详看 **(src/main/java/com/zhike/app/dws/DwsAlarmWindow.java) #### 7.3.2 车型品牌告警表(dws_alarm_bt_window) ​ 车型品牌告警表主要存储每种车型,品牌在各个窗口的告警信息 **代码详看 (**src/main/java/com/zhike/app/dws/DwsAlarmTypeBrandWindow.java) ### 7.4 能耗域 #### 7.4.1 车辆充电信息表(dws_energy_charge_window) ​ 车辆充电信息表主要存储每辆车在各个窗口的充电信息 **代码详看** (src/main/java/com/zhike/app/dws/DwsEnergyChargeWindow.java) #### 7.4.2 车辆能耗信息表(dws_energy_soc_window) ​ 车辆能耗信息表主要存储每辆车在各个窗口的能耗信息 **代码详看 **(src/main/java/com/zhike/app/dws/DwsEnergySocWindow.java)