施建明 王 伟 王 功
(中国科学院空间应用工程与技术中心, 北京 100094)
空间站实验柜的操作箱是航天员开展各种科学实验、维护维修任务的场所,在每次任务完成后,往往会产生一定的废气,需要通过抽真空、充氮气对箱体进行反复排空与冲洗。 操作箱采用密封设计,耐压能力有限,与空间站舱内压力形成一定的压差,压差在任何条件下必须保持在安全范围内。 在抽真空、充氮气工况下,操作箱体与舱内之间的压差可能会超出箱体的标称耐压值甚至是耐压极限,导致密封失效乃至箱体结构破坏,因此需要对排废气过程进行安全监测。
在排废气过程中,实时采集多种数据,包括箱体内外压差、电磁阀开关状态等,这些数据存在复杂的逻辑关系和时序关系,异常情景往往与复杂事件序列对应。 针对排废气过程较为复杂的安全监测问题,需要综合考虑多个数据维度之间的耦合关系、数据流上下文信息以及时间信息等,简单、静态的分析方法难以应对此类问题。
复杂事件处理(Complex Event Processing,CEP)是一种针对实时数据流进行检测、处理、分析和挖掘的技术方法。 何恒靖等[1]梳理了CEP技术在物联网、分布式系统监控等领域的应用。Feng[2]介绍了集成了CEP 的大数据技术,提出将Spark Streaming 作为实现CEP 平台的构想,并指出CEP 技术对于解决复杂物联网系统状态感知与实时决策问题的天然契合性。 Badr-Eddine等[3]提出了一种将CEP 和多种卫星遥感数据有效结合的卫星遥感数据处理和大气污染预警的软件架构,实现近于实时的大气质量监测和预报。随着大数据技术的发展,近年来作为第三代流式计算框架的Flink 越来越受到关注,已经成为大数据流式计算的事实标准。 Flink CEP 是在Flink上实现的复杂事件处理API 库,常见的应用场景包括金融应用、欺诈检测、复杂系统监控和报警[4]。 姬鸿飞[5]采用Flink CEP 技术,对可穿戴设备采集的多种心脏健康监测数据和运动加速度数据进行融合处理,实现预设规则的复杂事件匹配与检测。
Flink 在多源传感数据流并行处理、时间窗口智能推理计算等方面具有很高的性能,并能有效应对超时数据处理、故障容错与恢复等问题,其在状态监测和故障预警中的应用价值很高。 考虑到空间站实验柜排废气安全监测的复杂性,本文提出将Flink CEP 应用到排废气过程监测中,并对该项技术在安全关键任务监测上的应用进行探索。
CEP 的概念是由Stanford 的Luckham 教授在20 世纪90 年代提出[6],是一种事件驱动的方法。CEP 是一种基于动态环境中事件流的分析技术,事件是指有意义的变量状态变化。 通过分析事件间的关系,利用过滤、关联、聚合等技术,根据事件间的时序关系和聚合关系制定检测规则,持续地从数据流中查询出符合要求的事件,最终分析得到更复杂的复合事件。 例如,发现温度连续10 s上升后检测到压力超过10 MPa,输出报警信号。
Flink CEP 是在Flink 之上实现的CEP 库,使用它从无界数据流中检测出复杂事件模式,以便掌握数据中的重要关键信息[7]。 在流处理程序开发环境中引入Flink CEP 依赖后,就可以使用该库提供的Pattern API 编写CEP 应用程序,首先要定义模式,然后是从数据流检测出与模式匹配的事件序列。
2.2.1 定义模式
模式(Patterns)包括个体模式和模式序列。
个体模式是组成模式序列的单独模式定义,可以是单例模式或者是循环模式。 所谓单例模式是指接受1 个事件的模式,而循环模式则接受超过1 个事件,将单例模式加上量词即转化成循环模式,例如“10 次温度超过40 ℃”。
模式序列也叫组合模式,是由个体模式组合而成。 模式序列必须从1 个初始模式开始,然后就可以添加后续的模式,模式之间通过近邻条件连接。 Flink CEP 支持3 种形式的事件近邻形式:①严格近邻;②宽松近邻;③非确定近邻。
在模式序列中,还可以设置时间约束,这往往是非常关键的,例如在初始模式匹配成功后,必须在10 s 内出现下一个事件。 这里的时间约束设置可以支持处理时间和事件时间。
2.2.2 检测模式
在完成模式序列定义后,就要从输入数据流中检测出潜在的匹配。 给定输入流input 和模式pattern,通过调用CEP.pattern(input, pattern)即可获得1 个模式流(PatternStream)。 获得PatternStream 之后,从中提取相应的事件序列,可以调用select/flatSelect API 来实现模式流的二次处理,生成用户想要的结果。 在调用API 时需要传入一个自定义的select function 函数作为参数,每个成功匹配的事件序列都会调用这个函数。
对于设置了时间约束的模式序列,如果初始模式匹配成功后,在检测时间窗口内没有匹配上后续事件,可以通过侧输出流处理超时数据。
排废气是空间站实验柜的安全关键任务,其过程包含较为复杂的测控操作,涉及多个系统之间的联动,任何环节出现问题都会引起安全风险。
图1 为实验柜密封箱体排废气简图,图中省略了部分阀门、管路细节,只保留了充排气关键组件。 密封箱体经过几轮的排废气、充氮气循环,将箱体内的废气排净。 排废气的流程如下:
图1 密封箱体排废气简化图Fig.1 Simplified graph of EGD of sealed container
1) 打开排废气电磁阀,连通舱外真空环境,排废气持续一段时间,监测密封箱体与舱内的压差dP,当dP超过-20 kPa 时,自动关闭排气阀;
2)打开充气阀,连通氮气供应管路,向箱体充入氮气并监测压差,当压差达到0 kPa 时,关闭充气阀;
3)重复1)和2)若干轮,完成废气清洗任务。
密封箱体上安装有压差传感器,用来测量密封箱体与舱内的压差,为确保可靠,采用2 个相同的传感器同时测量。 控制器根据压差值,来控制排气阀和充气阀的开关。 采用两级控制策略来控制阀门,其中排气阀关闭的两级压差阈值分别为-20 kPa、-45 kPa,充气阀关闭的两级压差阈值分别为0 kPa、45 kPa。 表1 为排废气过程安全监测变量列表。
表1 排废气安全监测相关变量Table 1 Variables monitored during EGD
按照第3.1 节的流程,参与排废气的全部设备均为正常状态时,排废气过程能平稳安全地进行。 在发生可能导致密封箱体失压或过压的危险情况时,应能立即检测到并进入安全模式,因此排废气过程需要严密监测以下几种异常情景:
1)两个压差传感器读数不一致(相差超过0.2 kPa),关闭充气阀和排气阀,传感器校准后再执行排废气任务。 由于采用压差传感器作为两个电磁阀门闭环控制的输入,因此为确保安全,传感器一旦异常即进入安全模式。
2)排废气阀门打开,充氮气阀门关闭,箱体压差连续上升至-20 kPa,如果此时排气阀未关闭,那么箱体压差继续上升至-45 kPa,此时如果二级控制仍未将排气阀关闭,立即开启充气阀,箱体压差开始逐步减小,并同时紧急关闭实验柜外部的排废气管路上的阀门。
3)排废气阀门关闭,充氮气阀门开启,箱体压力连续上升,直至压差达到0 kPa,如果此时充气阀未关闭,那么箱体压力继续上升至压差值达到45 kPa,如果此时充气阀仍未关闭,立即关闭氮气供应源。
基于Flink 及其CEP 库,设计并开发监测程序,实时监测排废气过程是否进入上文提出的3种安全模式,并输出故障报警。
4.1.1 程序流程设计
如图2 所示,CEP 监测程序主要包括5 个步骤。
图2 CEP 监测程序流程Fig.2 Monitoring program flow by CEP
1)读取数据流。 Flink CEP 监测程序从外部系统读取排废气过程产生的实时数据,在排废气安全监测场景下,需要至少秒级的数据采集频次,可以通过Kafka 消息队列来提供监测数据流的源。 Flink 通过与Kafka 的连接器读取数据流,两者配合能满足状态监测对精确一次一致性的要求。 从Kafka 中读取数据,将原始数据转化为样例类(Case Class)“EgdData”格式的输入数据流InputStream,便于后续数据处理。
2)时间特性设置和时间戳分配。 在Flink 流处理应用中,时间语义主要可以分为事件时间和处理时间。 表1 所列变量对应数据发生的时间(即事件时间),是排废气过程安全监测要考虑的重要信息,这些信息都包含在Kafka 生产者发布的数据源中。 首先,在环境中设置时间特性为事件时间。 然后,在完成数据流读入操作后,调用“(assignAscendingTimestamps)”按照升序分配时间戳,这样程序后续处理就能获得InputStream 中所带的时间信息。
3)CEP 匹配检测。 将事先设计好的模式序列作用在InputStream 上,得到PatternStream。 针对3.2 节提出了排废气进入安全模式的3 个情景,开展3 次CEP 匹配检测,输出3 个不同的PatternStream。
4)匹配事件提取与报警输出。 每个PatternStream 中都包含了与模式序列对应的匹配事件,需要从中提取出来报警信息,包括关键的事件及其对应的时间戳信息,并通过样例类包装成报警信息发出来。
5)超时数据处理与报警输出。 当数据流中有超时数据,且模式序列中有时间约束条件时,通过侧输出流来处理超时情况,可以从PatternStream 中提取成功匹配的个体事件信息以及超时截止的时间戳,并通过样例类包装成超时报警信息发出来。
4.1.2 模式序列设计
针对第3.2 节的安全模式情景,设计3 种模式序列。
1)模式序列1(safteyPattern01)。 考虑到压差传感器可能因为干扰出现瞬态现象,这里将模式序列1 描述为:两个压差传感器连续3 次出现相差过大后,排气阀和充气阀立即关闭,任务中止。
①初始事件的匹配条件为循环条件,满足(dP1-dP2).abs>0.2 kPa。
②结尾事件与初始事件之间为严格近邻关系(next),后续事件匹配条件为(vS1 =="closed")&&(vS2=="closed") 。
2)模式序列2(safetyPattern02)。 模式序列2描述为:排气阀打开、充气阀关闭,经过一段时间抽气后,2 个压差传感器均正常并且测量值均超过-20 kPa,随后压差继续上升并超过-45 kPa,紧接着充气阀打开,随后压差开始下降。
① 初始事件的匹配条件为((dP1-dP2).abs≤0.2 kPa) && ((dP1 < - 20 kPa) &&(dP2 <- 20kPa)) 。
② 中间事件1 的匹配条件为((dP1-dP2).abs≤ 0.2kPa) && ((dP1 < - 45kPa)&&(dP2 <- 45kPa)) 。
③ 中间事件2 的匹配条件为(vS1 =="open")&&(vS2=="open") 。
④ 结尾事件的匹配条件为((dP1-dP2).abs≤0.2 kPa) && ((dP1 > - 45 kPa) &&(dP2 >- 45 kPa)) 。
3)模式序列3(safetyPattern03)。 模式序列3描述为:排气阀关闭、充气阀打开,经过一段时间充气后,2 个压差传感器均正常并且测量值均超过0 kPa,随后压差继续上升并超过45 kPa,紧随其后充气阀仍然为打开状态。
① 初始事件的匹配条件为((dP1-dP2).abs≤0.2 kPa)&&((dP1 >0 kPa)&&(dP2 >0 kPa)) 。
② 中间事件的匹配条件为((dP1-dP2).abs≤0.2 kPa)&&((dP1 >45 kPa)&&(dP2 >45 kPa)) 。
③ 结尾事件的匹配条件为 ((vS1 =="open")&&(vS2=="closed")) 。
根据第4.1.1 节的程序流程设计,开发CEP监测程序代码,核心是编写CEP 模式序列代码和事件提取自定义函数类代码,其他代码块均为Flink 流处理程序代码。 这里基于Flink 框架和CEP 库,采用Scala 语言开发排废气安全监测应用程序。
4.2.1 CEP 模式序列代码
采用Flink CEP 库提供的API 编写模式序列,声明3 个Pattern 类型的变量safetyPattern01/02/03,编写相应的模式序列代码,见表2。
①safetyPattern01 由2 个个体模式组合而成,通过严格近邻next( )连接,每个模式的匹配循环条件分别为times(3)和times(2),并且添加了6 s的时间约束条件Time.seconds(6)。
②safetyPattern02 由4 个个体模式组合而成,前2 个通过宽松近邻先后连接,后3 个通过严格近邻先后连接。 每个个体模式都是多个变量满足特定条件的组合,其中begin2 模式包含了循环条件times(3)。
③safetyPattern03 由3 个个体模式组合而成,前2 个通过宽松近邻先后连接,后2 个通过严格近邻先后连接。 每个模式的匹配条件均为循环条件,分别为times(3)、times(3)、times(2)。
在每个模式序列begin 后的[EgdData],代表输入流的数据格式。 将编写好的3 个模式序列分别作用于输入流,即得到patternStream01/02/03 3个PatternStream。
4.2.2 事件提取与报警输出函数类代码
对patternStream01/02/03 分别执行事件提取与信息输出操作,获取到排废气过程安全监测可能出现的异常事件序列并输出报警信息,这里通过继承于PatternSelectFunction 的自定义函数类来定制开发,关键是重写select 方法,这里需要针对每个PatternStream 进行方法的重写,实现代码见表3。
表3 重写“select( )”方法代码Table 3 Code of method “select( )” override
select 方法的输入是1 个Map 变量,在经过模式检测后,所有成功匹配的事件都存储在该变量中。 Map 的key 是String 类型的模式名称,即表2 中个体模式的名称,例如begin1,middle2-1,end1 等;value 是类型为EgdData 的List,用于存储匹配的数据点,这里之所以是List 是因此循环条件会匹配出多个事件。
表2 用于排废气安全监测的CEP 模式序列代码Table 2 Code of CEP pattern sequence applied for EGD safety monitoring
select 方法的输出是Warning01/02/03 样例类格式的数据,分别用于包装压差传感器异常、排气阀门异常、充气阀门异常3 种报警信息流。
1)在SafetyPattern01 Match 函数类中,select方法提取的是压差传感器首次出现异常的事件时间和结尾2 个阀门均关闭的事件时间,最终输出包装了这2 个时间数据和传感器异常“sensory abnormal!”的报警信息。
2)在SafetyPattern02 Match 函数类中,select 方法提取的是4 个关键事件的时间,分别是负压压差超过第一阈值的时间、超过第二阈值的时间、阀门状态匹配的时间、负压压差开始下降的时间,最后输出包装了这4 个时间数据和排气阀门异常“ dischargevalve fails to close!”的报警信息。
3)在SafetyPattern03 Match 函数类中,select方法提取的是3 个关键事件的时间,分别是正压压差超过第一阈值的时间、超过第二阈值的时间、阀门状态匹配的时间,最后输出包装了这3 个时间数据和充气阀门异常“chargevalve fails to close!”的报警信息。
模拟排废气过程,涵盖正常过程和3 种故障模式,监测数据的采集频率为1 Hz。 通过测试检验Flink CEP 监测程序能否正确检测出3 种故障模式,对测试性指标进行验证,讨论数据超时的处理。
按照如下流程,模拟排废气过程并生成相应的仿真数据用于测试:
1)第一次为正常排充气循环,排废气开始时,密封箱体内外压差为0 kPa,排气阀打开,同时充气阀处于关闭状态。 假设此排气阶段压差变化速率为55.6 Pa/s,经过6 min 后,压差变为-20 kPa 左右。 紧接着,排气阀关闭,充气阀打开,开始充气过程,假设此充气阶段压差变化速率为111.2 Pa/s,经过3 min 后,压差变为0 kPa左右。
2)第二次循环模拟压差传感器故障,排废气开始后2 min,模拟2 个压差传感器开始出现连续的不一致,并且1 s 后2 个阀门均变为关闭状态。异常数据延续5 s,该循环终止。
3)第三次循环模拟排气阀关不上故障,第一阶段排废气过程和第一次循环一样,当压差超过-20 kPa 后,排气阀未关闭,压差经过4 min 继续扩大至- 45 kPa,此阶段压差变化速率为104.2 Pa/s。 紧接着,充气阀打开,压差比上一时刻有所下降,此状态持续5 s 后循环终止。
4)第四次循环模拟充气阀关不上故障,充气开始,此时排废气阀处于关闭状态,充气阀为打开状态, 循环初始时密封箱体的内外压差为-20 kPa,充气过程与第1 次循环一样,当压差超过0 kPa 时,充气阀不关闭,压力经过8 min 后,压差变为45 kPa,变化速率为93.8 Pa/s,最后连续5 s 充气阀依然保持开状态,并且压差继续上升,循环模拟终止。
基于以上排废气过程,生成对应表1 中变量的监测数据。 模拟排废气过程共计1935 s,生成数据1935 条。 在每秒采集的压差数据中加入标准差为5 Pa 的随机白噪声,模拟数据的正常波动。
在Kafka 数据服务器上每秒逐条发布5.1 节的数据,作为测试用的数据流来源。 在本地开发环境测试Flink CEP 监测程序,通过控制台打印输出测试结果,分别测试3 种模式检测结果的正确性以及报警生成时间与结尾事件时间的延迟。
如图3 所示,CEP 监测程序成功匹配出数据流中的3 种模式序列,并输出了相应的报警信号。图3 中虚线将3 种模式序列的识别结果划分开,不同颜色、不同形状的图形代表相应的匹配事件,并标记出相应的事件时间,最后的图案代表报警信号发出,标记了报警信号生成的时间,时间语义为处理时间。
图3 模式序列匹配测试结果Fig.3 Testing results of pattern sequences matching
1)安全模式1 处理结果分析:CEP 程序首先匹配出满足两个压差传感器连续3 次相差过大循环条件的事件,橙色圆形下标记第一条数据的事件时间;紧接着,匹配出充气阀、排气阀连续2 次均处于关闭状态事件;最后发出Warning01 报警信号。 报警信号与匹配的结尾事件最后1 条数据的事件时间相差1222 ms。
2)安全模式2 处理结果分析:CEP 程序首先匹配出压差超过-20 kPa 事件,绿色圆形下标记压差穿越一级负压阈值的事件时间;一段时间后,成功匹配出压差超过-45 kPa 事件;紧接着,匹配出“充气阀立即打开”事件;紧接着,匹配出压差低于-45 kPa 事件。 最后发出Warning02 报警信号。 报警信号与结尾事件的事件时间相差1170 ms。
3)安全模式3 处理结果分析:CEP 程序首先匹配出压差超过0 kPa 事件蓝色圆形下标记压差穿过一级正压阈值的事件时间;一段时间后,成功匹配出压差超过45 kPa 事件;紧接着,匹配出充气阀连续2 次均处于打开状态事件;最后发出Warning03 报警信号。 报警信号与结尾事件最后1 条数据的的事件时间相差1217 ms。
1)故障检测率与隔离率验证。 增加循环模拟次数到12 次,扩充故障样本量到9 次,测试故障检测率和隔离率指标。 得到如表4 所示的测试结果。 模拟的9 次故障均能被程序检测到,给出的诊断结果隔离到相应的部件故障模式,故障检测率和隔离率均为100%。 故障诊断信息发出来的时刻与故障发生时刻之间的时间差均值为1921 ms。 测试时,仿真程序和检测程序运行在本地环境,但仿真程序向远程Kafka 集群发布数据,而检测程序又从Kafka 集群拉取数据,因此表4中的差值包含了数据的网络传输时间。
表4 故障检测与隔离测试结果Table 4 Fault detection and isolation test results
2)虚警率测试与讨论。 在压差传感器测量密封箱体内外压差过程中,由于信号干扰等可能会在数据流中引入瞬时数据野点,安全监测程序应能抗干扰,以避免虚警产生。 为此,将测试数据的第127/289/980 条数据点中的dP2 或dP1 改成异常值,使dP2 与dP1 之间的差值超过0.2 kPa。由于CEP 采用了复杂的模式序列设计,该瞬时异常数据不符合模式序列的匹配规则,经实测对应异常点无报警信号输出,在此测试条件下虚警率为0。 其他真实故障的报警信号输出不受影响。
以安全模式1 为例来测试Flink CEP 对超时数据的处理,为了测试方便,截取传感器异常发生时段前后的30 条数据,并将阀门关闭时的数据设置为2 s 延迟,模拟数据传输超时异常工况。
首先,测试无侧输出流的情况,由于后续事件序列已经超过了6 s 的时间约束条件,程序认为没有匹配成功,未输出任何报警信号。 然后,在CEP 程序中增加侧输出流用来处理超时情况,超时报警信息设计4 个字段:传感器异常事件时间、“begin1”个体模式匹配数据条数、超时时间戳、超时报警字符串。 经测试,一共输出5 条超时报警信息,见表5。 其中第1 个时间戳分别对应数据流中的5 个传感器异常数据的事件时间,第2 个时间戳则是分别在第1 个时间戳的基础上加6000 ms,表示6 s 内未成功匹配后续事件,直接给出超时报警提示。
通过Flink CEP 在空间站实验柜排废气安全监测上的应用研究,开发相应的监测应用程序,通过测试,得出以下结论:
1)Flink CEP 能准确识别出排废气过程中复杂的异常事件序列,能应对包含多维数据耦合和数据流上下文关联的复杂事件处理问题;
2)监测程序输出报警的处理时间与序列结尾事件时间相差在1~2 s 之间,能及时输出报警信号;
3)监测程序具有抗干扰和处理超时数据的能力,适用于实际数据流监测场景。