一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于Flink的水文传感器数据分析系统及其构建方法

2022-07-30 18:48:31 来源:中国专利 TAG:

基于flink的水文传感器数据分析系统及其构建方法
技术领域
1.本发明涉及一种基于flink的水文传感器数据分析系统及其构建方法,属于流数据处理和统计分析技术领域。


背景技术:

2.水文传感器作为水利研究和建设过程中的重要组成部分,其采集和处理的水文数据在抗洪防旱,水害防治中起到了至关重要的作用。通常情况下,水文传感器按照一定时间间隔采集数据,并以流数据的形式发送至分析平台,最终形成水文时间序列用于存储和计算。统计分析是研究水文传感器数据的基础,当前许多水文分析是建立在数据具有某些特征的假设上进行的,期望这些假设与实际的偏差不会影响分析结果。但基于错误假设的水文分析会导致不可靠和不正确的分析结果,因此,在对水文数据做进一步的处理之前,利用统计分析对数据的特征进行检验是十分必要的。
3.传统的统计分析方法通常基于数据库技术,即先将数据存储至数据库中,然后利用单机的r、spss和matlab等工具,把数据集读取至内存,利用特征检验算法进行分析。该方法常见于静态数据集的分析,对于水文传感器数据却并不适用。水文传感器数据具有体量大、流速快的特征,因此单个计算机的内存资源往往无法满足需求,需要不断地将新到来的数据存入数据库以释放内存空间,然后再取出数据进行计算。这一过程带来了额外的时间开销,当计算的速度低于流数据的流速时,将无法及时地给出分析结果。此外,当前主流的大数据框架spark、flink也未对流场景下的统计分析提供良好支持。


技术实现要素:

4.发明目的:本发明提供一种基于flink的水文传感器数据分析系统及其构建方法,为大规模高速率的水文传感器数据的统计分析提供一种完整的解决方案。
5.技术方案:一种基于flink的水文传感器数据分析系统,包括自顶向下依次排布的数据发送层、上游消息传输层、数据处理层、下游消息传输层、持久化层和可视化层。
6.所述数据发送层收集来自不同水文传感器的流数据,并对这些数据进行格式转换,融合成一条数据流后传输给上游消息传输层。
7.所述上游消息传输层用来实现数据发送层和数据处理层之间的数据传输,利用消息队列kafka,采用异步消息传递方式,连接数据发送层和数据处理层。
8.所述数据处理层对水文传感器数据进行处理和分析,并将分析结果发送给下游消息传输层。
9.所述下游消息传输层用来实现数据处理层和持久化层、可视化层的数据传输,利用消息队列kafka,采用异步消息传递方式,连接数据处理层和持久化层、可视化层。
10.所述持久化层利用时间序列数据库iotdb,将数据处理层输出的水文传感器数据分析结果进行持久化。
11.所述可视化层包含实时分析结果的可视化和历史分析结果的可视化,可提供实时
展示和历史数据的查询,供用户进一步分析。
12.一种基于flink的水文传感器数据分析系统的构建方法,包括如下步骤:
13.(1)安装配置流计算框架apache flink、消息队列apache kafka和时间序列数据库apache iotdb,保证流计算框架apache flink、消息队列apache kafka和时间序列数据库apache iotdb之间的通信顺畅;
14.(2)在数据发送层,利用spring boot框架,接收来自不同传感器的水文流数据,将每条数据的格式转换为统一的json格式,并缓存至队列中,通过kafka producer将数据发送给上游消息传输层。
15.(3)在上游消息传输层,创建一个名为source topic的主题,用于缓存数据发送层所传输的源数据,并根据系统所在集群中的节点个数和用户需求,对该topic进行分区数和副本数的设置。
16.(4)在数据处理层,利用flink的时间窗口机制和窗口函数,实现对水文传感器数据的分区、预处理、聚合和分析计算。flink处理完的数据发送至下游消息传输层,一方面可视化层能够从下游消息传输层实时拉取最新的分析结果,另一方面持久化层能够拉取分析结果并进行持久化,下游消息传输层使用kafka的目的是为了异步通信和削峰。
17.(5)在下游消息传输层,创建一个名为result topic的主题,用于缓存数据处理层所传输的结果数据,并根据系统所在集群中的节点个数和用户需求,对该topic进行分区数和副本数的设置。
18.(6)在持久化层,利用时间序列数据库iotdb,实现分析结果的持久化。
19.(7)在可视化层,实现与持久化层和下游消息传输层.
20.0的连接;同时,利用websocket协议和echarts框架,实现实时分析结果的可视化,以及历史分析结果的查询。
21.所述(2)中,实现数据发送层具体包括如下步骤:
22.步骤(21),将水文传感器数据反序列化,取出数据信息;
23.步骤(22),建立一个队列,将数据信息缓存至队列中;
24.步骤(23),对数据信息的组成部分进行解析,将其转换为统一的json格式;
25.步骤(24),利用kafka producer中的send方法,将源数据包装成消息,把消息的key设置为传感器编号,根据kafka的topic名和topic的分区编号,以异步的方式将队列中的数据发送给上游消息传输层。
26.步骤(25),利用spring boot框架开启java后台服务,持续地对水文传感器数据进行步骤(21)-(24)的转换和输出。
27.所述(4)中,实现数据处理层具体包括如下步骤:
28.步骤(41),利用flinkkafkaconsumer方法,对kafka broker中的source topic持续监听,若该topic中存在新数据,则立即拉取该数据;
29.步骤(42),利用keyby算子,对水文数据按照传感器编号的不同进行分区,不同编号的数据相互隔离;
30.步骤(43),建立一个滚动时间窗口作为预处理窗口,对水文数据进行预处理,解决数据中存在的冗余、重复、异常和缺失问题;
31.步骤(44),基于滚动时间窗口,实现对水文数据的聚合,缩减数据规模;
32.步骤(45),将统计检验算法应用于窗口函数processwindowfunction,实现对水文传感器数据正态性、平稳性、均一性和趋势性的分析;
33.步骤(46),利用flinkkafkaproducer方法,把分析结果发送给kafka的result topic,其中,key设置为传感器编号。
34.所述步骤(43)中,实现水文数据预处理具体包括如下步骤:
35.步骤(43a),建立一个滚动窗口w0作为预处理窗口,其窗口大小根据水文传感器的采样频率而定;
36.步骤(43b),对json格式的数据进行解析,保留时间戳、传感器编号和水文数据信息,解决数据冗余问题;
37.步骤(43c),对窗口内数据的时间戳进行比较,若出现相同时间戳数据,则对重复数据进行删除,解决数据重复问题;
38.步骤(43d),利用tukey test对异常值进行检测,根据四分位距iqr、第一四分位数q1和第三四分位数q3,计算上下边界r1、r3,将小于r1或大于r3的数值判定为异常值然后剔除,解决数据异常问题;
39.步骤(43e),若预处理窗口内数据缺失比例未超过设定的比例,则对其利用线性插值填充法进行填充;若数据缺失比例超过设定的比例,则认为该部分数据失去统计学意义,则抛弃该窗口,解决数据缺失问题;
40.步骤(43f),输出预处理后的数据流s0。
41.所述步骤(44)中,实现基于时间窗口的水文数据聚合具体包括如下步骤:
42.步骤(44a),建立一个大小为1小时的滚动窗口w1,在窗口内对预处理后的数据流s0取平均值,来度量窗口内数据的集中位置,然后将均值以数据流s1输出;
43.步骤(44b),再建立一个大小为1天的滚动窗口w2,在窗口内对数据流s1取平均值,来度量窗口内数据的集中位置,然后将均值以数据流s2输出。
44.所述步骤(45)中,实现统计分析具体包括如下步骤:
45.步骤(45a),对聚合后的数据流s2开启三个滑动窗口w3、w4、w5,窗口大小分别为7天(周)、10天(旬)和30天(月),步长为1天;
46.步骤(45b),在三个窗口中,将针对正态性、平稳性、均一性、趋势性四个特征的共计12种检验算法应用于flink的窗口函数processwindowfunction,如表1所示,对每个特征采用3种算法进行综合评判,将水文分析结果作为s3、s4、s5三条数据流输出。
47.表1数据处理层中所使用的特征检验算法
[0048][0049]
所述步骤(6)中,实现持久化层具体包括如下步骤:
[0050]
步骤(61),建立存储组,将分析结果的存储路径设置为“root.object.sensor_type.sensor_id.analysis”,其中:
[0051]

root:默认的根节点;
[0052]

object:代表观测对象,如江、河、水库等;
[0053]

sensor_type:代表传感器类型,如水位、流量、降水传感器等;
[0054]

sensor_id:代表传感器编号,用于定位到具体某一个传感器;
[0055]

analysis:代表分析结果,即每个特征检验算法的最终结果。
[0056]
步骤(62),利用kafka consumer对kafka的result topic持续监听,若flink将新的分析结果写入该topic,则立即对该数据进行拉取;
[0057]
步骤(63),将拉取的水文分析结果写入缓冲区中,若缓冲区的数据条数超过10或距离上次数据写入的时间已超过1秒,则将缓冲区中的数据写入数据库。
[0058]
所述步骤(7)中,实现可视化层具体包括如下步骤:
[0059]
步骤(71),利用kafka consumer对kafka的result topic持续监听,若该topic中流入新数据,则立即对该数据进行拉取;
[0060]
步骤(72),利用websocket协议,在客户端和服务端之间建立一条全双工通信的tcp连接,由服务端主动向客户端推送实时的水文分析结果;
[0061]
步骤(73),在客户端中,利用echarts框架将客户端推送的水文分析结果实时地绘制成图表;
[0062]
步骤(74),利用iotdb jdbc,建立可视化层与持久化层的连接,可根据时间范围、特征选择和传感器编号对历史分析结果进行查询,并利用echarts绘制成图表进行展示。
[0063]
有益效果:与现有技术相比,本发明提供的基于flink的水文传感器数据分析系统及其构建方法,实现对高速无界的水文传感器数据进行实时分析,为当前水文传感器数据的统计分析提供了一套完整的解决方案。该系统利用flink、iotdb和echarts等组件实现对水文传感器数据的获取、预处理、统计分析、存储和可视化,同时利用消息队列kafka对各个层次进行解耦,使得系统趋于模块化,从而更加灵活。
附图说明
[0064]
图1为本发明实施例的系统结构示意图。
具体实施方式
[0065]
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本技术所附权利要求所限定的范围。
[0066]
如图1所示,一种基于flink的水文传感器数据分析系统,包括:数据发送层、上游消息传输层、数据处理层、下游消息传输层、持久化层和可视化层,自顶向下依次排布。
[0067]
数据发送层用于收集来自不同水文传感器的流数据,将数据转换为统一的格式,并汇聚成一条数据流发送给上游消息传输层,为系统提供统一格式的数据源。
[0068]
上游消息传输层用来连接数据发送层和数据处理层,实现数据发送层和数据处理层之间的数据传输。利用消息队列kafka,采用异步消息传递方式,对数据发送层和数据处理层进行解耦,避免由数据处理层消费数据不及时而引起的数据发送层阻塞。同时,对kafka中的topic进行分区和复制,进一步提高吞吐量和可用性。
[0069]
数据处理层基于流计算框架flink实现,是本系统中的核心层次,大量复杂计算发生在该层中。数据处理层通过时间窗口算子,将12种针对水文传感器数据的特征检验算法用java语言实现,并应用于窗口函数processwindowfunction中,实现对水文数据正态性、平稳性、趋势性和均一性这四个特征的分析,所用检验算法如表1所示。但在对数据进行分析之前,需要对数据进行一些处理。首先是将数据根据不同传感器来源进行分区,避免不同传感器数据相互混淆;其次建立一个滚动时间窗口,在窗口内解决数据的冗余、重复、异常和缺失问题;最后为了提高计算效率,实现了基于时间窗口的数据聚合方法来减小数据规模。
[0070]
下游消息传输层用来连接数据处理层和持久化层、可视化层,实现数据处理层和持久化层、可视化层之间的数据传输。利用消息队列kafka,采用异步消息传递方式,对三个层次进行解耦。同时,对kafka中的topic进行分区和复制,进一步提高吞吐量和可用性。
[0071]
持久化层负责对分析结果进行存储。由于分析结果以时间序列的形式呈现,因此采用时间序列数据库iotdb作为持久化手段,对用户发起的历史分析结果查询进行反馈。
[0072]
可视化层用于对水文传感器数据分析结果的展示,包括实时分析结果和历史分析结果。在实时分析结果的展示中,通过对下游消息传输层的监听,将kafka中的结果数据拉取并通过websocket协议发送至客户端,并由echarts框架把数据绘制成实时的图表;在历史分析结果的展示中,通过与持久化层iotdb的连接,根据用户的查询条件对历史结果进行查询并反馈,由echarts框架把数据绘制成图表。
[0073]
本发明还公开了一种基于flink的水文传感器数据分析系统的构建方法,包括如下步骤:
[0074]
步骤1:安装配置流计算框架apache flink、消息队列apache kafka和时间序列数据库apache iotdb。由于本系统趋于模块化,因此可安装在单机中,也可安装在包含多个节点的集群中。接下来以包含3个节点的集群为例,讲解上述三个组件的配置过程,主要包含以下几个步骤:
[0075]
(1)配置flink集群。flink集群由jobmanager和taskmanager组成,在节点1中部署jobmanager,用于对taskmanager进行任务分配、监控和管理,然后在3个节点中部署taskmanager,用于执行flink作业;
[0076]
(2)配置kafka集群。为了对kafka集群进行管理,需要在3个节点中配置zookeeper集群,设置client端口为2181,来对外界的访问提供服务;再于3个节点中配置kafka集群,设置bootstrap端口为9092,来对数据的传输或拉取请求进行监听;
[0077]
(3)配置iotdb。在节点3中安装配置iotdb,对数据库的账户密码进行设置,同时设置监听端口为6667,客户端通过该端口对iotdb进行访问;
[0078]
(4)在集群中启动各个组件,测试各端口的数据连通性,确保组件间的通信顺畅。
[0079]
步骤2:在数据发送层,利用spring boot框架,接收来自不同传感器的水文流数据,将每条数据的格式转换为统一格式,并缓存至队列中,发送给上游消息传输层,具体包含以下几个步骤:
[0080]
(1)将水文传感器数据反序列化,取出数据信息;
[0081]
(2)建立一个队列,将数据信息缓存至队列中;
[0082]
(3)对数据信息的组成部分进行解析,将其转换为统一的json格式;
[0083]
(4)利用kafka producer中的send方法,将key设置为传感器编号,根据topic名和分区编号,以异步的方式将队列中的数据发送给上游消息传输层;
[0084]
(5)利用spring boot框架开启java后台服务,持续地对水文传感器数据进行转换和输出。
[0085]
步骤3:在上游消息传输层,创建一个source topic,用于缓存数据发送层所传输的源数据。对source topic设置3个分区和3个副本,分别存放于3个节点的broker中。分区的设置提高了kafka的吞吐能力,而副本的设置则提高了kafka的可靠性,避免数据的丢失。
[0086]
步骤4:在数据处理层中,利用flink框架对流计算的支持,实现对水文传感器数据的分区、预处理、聚合和统计分析工作,具体包含以下几个步骤:
[0087]
(1)利用flinkkafkaconsumer方法,对kafka broker中的source topic持续监听,若该topic中存在新数据,则立即拉取该数据;
[0088]
(2)利用keyby算子,对水文数据按照传感器编号的不同进行分区,不同编号的数据相互隔离;
[0089]
(3)建立一个滚动时间窗口作为预处理窗口,对水文数据进行预处理,解决数据中存在的冗余、重复、异常和缺失问题。首先建立一个滚动窗口w0作为预处理窗口,其窗口大小根据水文传感器的采样频率而定。其次对json格式的数据进行解析,保留时间戳、传感器编号和水文数据信息,解决数据冗余问题;然后对窗口内数据的时间戳进行比较,若出现相同时间戳数据,则对重复数据进行删除,解决数据重复问题;最后,利用tukey test对异常值进行检测,根据公式对上下边界r0、r1进行估计:
[0090][0091]
式中q1为第一四分位数,q3为第三四分位数,iqr为四分位距:
[0092]
iqr=q
3-q1[0093]
将小于r0或大于r1的数值判定为异常值然后剔除,解决数据异常问题;对于数据的
缺失问题,根据不同情况采取两种方式解决:若预处理窗口内数据缺失比例未超过25%,则对其利用线性插值填充法进行填充;若数据缺失比例超过25%,则认为该部分数据失去统计学意义,则抛弃该窗口,解决数据缺失问题。最后,输出预处理后的数据流s0。
[0094]
(4)基于滚动时间窗口,实现对水文数据的聚合,缩减数据规模。首先建立一个大小为1小时的滚动窗口w1,在窗口内对预处理后的数据s0取平均值,来度量窗口内数据的集中位置,然后将均值以数据流s1输出;然后再建立一个大小为1天的滚动窗口w2,在窗口内对s1取平均值,来度量窗口内数据的集中位置,然后将均值以数据流s2输出。
[0095]
(5)将统计检验算法应用于窗口函数processwindowfunction,实现对水文传感器数据正态性、平稳性、均一性和趋势性的分析。首先对聚合后的数据流s2开启三个滑动窗口w3、w4、w5,窗口大小分别为7天(周)、10天(旬)和30天(月),步长为1天;然后在三个窗口中,将针对正态性、平稳性、均一性、趋势性四个特征的共计12种检验算法应用于flink的窗口函数processwindowfunction,如表1所示。对每个特征采用3种算法进行综合评判,以平稳性分析为例,评判标准如下所示:
[0096]

针对每一种特征,所使用的3种算法中若结果为不拒绝原假设的算法数量大于等于2,则判定水文数据具备平稳性;
[0097]

若结果为不拒绝原假设的算法数量为1个或0个,则判定水文数据不具备平稳性。最后将判定结果作为s3、s4、s5三条数据流输出。
[0098]
(6)利用flinkkafkaproducer方法,把分析结果发送给kafka的result topic,其中,key设置为传感器编号。
[0099]
步骤5:在下游消息传输层,创建一个result topic,用于缓存数据处理层的分析结果。对result topic设置3个分区和3个副本,分别存放于3个节点的broker中。分区的设置提高了kafka的吞吐能力,而副本的设置则提高了kafka的可靠性,避免数据的丢失。
[0100]
步骤6:在持久化层,利用时间序列数据库iotdb,实现分析结果的持久化,具体包含以下几个步骤:
[0101]
(1)建立存储组,划分水文分析结果的存储路径,将结果数据的存储路径设置为“root.object.sensor_type.sensor_id.analysis”,其中:“root”为默认的根节点,“object”代表观测对象,如江、河、水库等,“sensor_type”代表传感器类型,如水位、流量、降水传感器等,“sensor_id”代表传感器编号,用于定位到具体某一个传感器,“analysis”代表分析结果,即每个特征检验算法的最终结果。利用这种目录树结构的存储路径,可将不同观测对象的实体数据存储在磁盘的不同文件夹下,从而实现物理隔离。
[0102]
(2)利用kafka consumer对kafka的result topic持续监听,若该topic中流入新数据,则立即对该数据进行拉取;
[0103]
(3)将拉取的水文分析结果存进写入缓冲区中,为了避免由频繁数据写入引起的大量网络开销,对iotdb的写入策略加以优化,对于下述两个条件:
[0104]

缓冲区中存放的数据量达到10条;
[0105]

缓冲区中含有数据且距离上一次写入的时间已达到1秒。
[0106]
若iotdb的写缓冲区满足上述两个条件中的任意一个,便将缓冲区中的数据插入到数据库中,由此减少通信时间以提高写入的效率。
[0107]
步骤7:在可视化层,实现与持久化层和消息传输层的连接;同时,利用websocket
协议和echarts框架,实现实时分析结果的可视化,以及历史分析结果的查询,具体包含以下几个步骤:
[0108]
(1)在实时分析结果可视化方面,利用kafka consumer对kafka的result topic持续监听,若该topic中流入新数据,则立即对该数据进行拉取;然后利用websocket协议,在客户端和服务端之间建立一条全双工通信的tcp连接,由服务端主动向客户端推送实时的水文分析结果;接着在客户端中,利用echarts框架将客户端推送的水文分析结果实时地绘制成图表。用户可根据传感器编号和特征选择对实时的分析结果进行查看。
[0109]
(4)在历史结果查询方面,利用iotdb的原生java api,建立可视化层与持久化层的连接,可根据时间范围、特征选择和传感器编号对历史分析结果进行查询,并利用echarts绘制成图表进行展示。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献