Base de données chronologique

DolphinDB fournit une table de flux et un moteur de calcul de flux pour le traitement des données en temps réel, y compris la détection d'anomalies des données de capteurs dans l'Internet des objets. Le moteur de détection d'anomalies intégré peut répondre aux besoins de la plupart des scénarios de détection d'anomalies. Si la logique de détection d'anomalies est complexe et spéciale et que le moteur de détection d'anomalies normalisé ne peut pas répondre aux exigences, l'utilisateur peut l'implémenter avec une fonction de traitement de message personnalisée.


1. Conditions d’application

Un système de surveillance collecte des données toutes les secondes. Il existe deux exigences de détection d'anomalies comme suit:

  • Toutes les 3 minutes, si la température du capteur est supérieure à 40 degrés Celsius deux fois et supérieure à 30 degrés Celsius trois fois, le système émettra une alarme.
  • Si le réseau de capteurs est déconnecté et qu'il n'y a pas de données dans les 5 minutes, le système émettra une alarme.

L'alarme ci-dessus signifie que si une anomalie est détectée, un enregistrement est écrit dans une table de données de flux.


2. Idées de conception

Le flux calcul cadre de la base de données de séries chronologiques distribué DolphinDB supporte actuellement les moteurs d'agrégation de séries temporelles , les moteurs d'agrégation de section transversale , anomalie moteurs de détection, et le débit personnalisé moteurs de calcul:

  • Agrégateur de séries temporelles: il peut effectuer un calcul d'agrégation verticale de l'état de l'appareil (agrégé en séries chronologiques), ou agréger plusieurs états d'appareils horizontalement, puis les agréger en fonction du temps. L'agrégation de séries chronologiques prend en charge les calculs en continu avec des fenêtres coulissantes. DolphinDB a optimisé les performances des fonctions d'agrégation de fenêtres intégrées, et un processeur monocœur peut compléter l'agrégation temporelle de près d'un million d'états par seconde.
  • Cross Sectional Aggregator (Cross Sectional Aggregator): il s'agit d'une extension du moteur de capture instantanée qui peut effectuer des calculs d'agrégation horizontale sur l'état de l'appareil, comme le calcul de la température moyenne d'un lot de périphériques.
  • Moteur de détection d'anomalies: il peut détecter si les données répondent aux indicateurs d'alarme définis par l'utilisateur en temps réel. Si des données anormales sont détectées, elles seront envoyées à la table pour répondre aux besoins de surveillance en temps réel et d'alerte précoce de l'Internet. Choses.
  • Moteur de calcul de flux personnalisé: lorsqu'aucun des trois moteurs ci-dessus ne peut répondre à la demande, les utilisateurs peuvent également utiliser le script DolphinDB ou le langage API pour personnaliser les fonctions de traitement des messages.

Pour la première exigence, le système émettra une alarme lorsque la température du capteur est anormale dans les 3 minutes, et le moteur de détection anormale convient tout simplement. Écrivez simplement une expression avec le script DolphinDB pour décrire la logique d'exception. Mais la deuxième exigence ne s'applique pas. Le moteur de détection d'anomalies est traité par regroupement d'appareils. Le calcul est déclenché chaque fois que de nouvelles données affluent, ou le calcul d'agrégation n'est effectué que dans une fenêtre mobile de longueur fixe à intervalles réguliers. Si un capteur ne génère pas de nouvelles données, il ne peut pas déclencher de calculs. La solution consiste à personnaliser un gestionnaire de messages à calculer et à détecter. L'idée de réalisation spécifique est: utiliser une table de mémoire clé-valeur pour enregistrer la dernière heure d'acquisition de chaque capteur. Le message entre dans la fonction de traitement des messages à un certain intervalle de temps (par exemple, 1 seconde). La fonction de traitement des messages met d'abord à jour la table de mémoire des valeurs-clés, puis vérifie si la dernière heure de collecte enregistrée par chaque périphérique de cette table dépasse 5 minutes, et si tel est le cas, elle déclenchera une alarme.


3. Étapes de mise en œuvre détaillées


3.1 Définir le tableau de données des flux d'entrée et de sortie

Définissez d'abord une table de données de streaming pour recevoir les données de capteur collectées en temps réel et utilisez la fonction enableTableShareAndPersistence pour partager et conserver la table de données de streaming sur le disque dur. Le paramètre cacheSize limite la quantité maximale de données conservées dans la mémoire à 1 million de lignes. Bien que le capteur possède de nombreux indicateurs, comme cet exemple ne concerne que des indicateurs de température, cet exemple simplifie la structure du tableau. La structure du tableau ne contient que trois colonnes, à savoir le numéro de capteur deviceID, le temps ts et la température. code montrer comme ci-dessous:

st = streamTable (1000000: 0, `deviceID`ts`temperature, [INT, DATETIME, FLOAT]) 
enableTableShareAndPersistence (table = st, tableName =` sensor, asynWrite = false, compress = true, cacheSize = 1000000)

其次定义报警输出流数据表用于异常检测引擎的输出。按照DolphinDB用户手册中对创建异常检测引擎函数createAnomalyDetectionEngine各参数的说明,异常引擎对输出表的格式有严格要求,即它的第一列必须是时间类型,用于存放检测到异常的时间戳,并且该列的数据类型需与输入表的时间列一致。如果keyColumn(分组列)参数不为空,那么第二列为keyColumn,在本例中,分组列为传感器编号deviceID。之后的两列分别为int类型和string/symbol类型,用于记录异常的类型(在metrics中的下标)和异常的内容。建表代码如下:

share streamTable(1000:0, `time`deviceID`anomalyType`anomalyString, [DATETIME,INT,INT, SYMBOL]) as warningTable

3.2 创建异常检测引擎,实现传感器温度异常报警的功能

异常检测引擎中,设置异常指标为sum(temperature > 40) > 2 && sum(temperature > 30) > 3 ,分组列(keyColumn)为传感器编号deviceID,数据窗口windowSize为180秒,计算的时间间隔step为30秒。这些参数如何设置可参考异常检测引擎。代码如下:

engine = createAnomalyDetectionEngine(name="engine1", metrics=<[sum(temperature > 40) > 2 && sum(temperature > 30) > 3  ]>,dummyTable=sensor, outputTable=warningTable, timeColumn=`ts, keyColumn=`deviceID, windowSize = 180, step = 30)
subscribeTable(tableName="sensor", actionName="sensorAnomalyDetection", offset=0, handler= append!{engine}, msgAsTable=true)

3.3 创建自定义消息处理函数,实现传感器离线报警的功能

第二个需求,需要保存每个传感器的最新数据采集时间,用于判断是否已有5分钟未采集数据。本例采用键值内存表保存每个设备的最新状态,并以传感器编号deviceID作为主键。键值表中,基于键值的查找和更新具有非常高的效率。收到传感器数据时,用append!函数更新键值表中的记录。如果新记录中的主键值不存在于表中,那么往表中添加新的记录;如果新记录的主键值与已有记录的主键值重复时,会更新表中该主键值对应的记录。

在输出异常信息到报警输出流数据表时,异常的类型anomalyType因为上节异常检测引擎已用0,所以这里设为1。异常的内容设为空。

配置函数subscribeTable的参数throttle和batchSize,可以达到批量处理消息提升性能的目的。参数throttle决定handler间隔多久时间处理一次消息,本例中设定为每秒处理一次。这里要注意当消息的数量达到batchSize时,即便间隔时间没到也会处理进来的消息,所以需要将batchSize设置为一个比较大的数。示例代码如下,其中传感器数deviceNum假设为3:

t=keyedTable(`deviceID,100:0,`deviceID`time,[INT,DATETIME])
deviceNum=3
insert into t values(1..deviceNum,take(now().datetime(),deviceNum))
def checkNoData (mutable keyedTable, mutable outputTable, msg) {
	keyedTable.append!(select deviceID, ts from msg)
	warning = select now().datetime(), deviceID, 1 as anomalyType, "" as anomalyString from keyedTable where time < datetimeAdd(now().datetime(), -5, "m")
	if(warning.size() > 0) outputTable.append!(warning)
}
subscribeTable(tableName="sensor", actionName="noData", offset=0,handler=checkNoData{t, warningTable}, msgAsTable=true, batchSize=1000000, throttle=1)


4. 模拟写入与验证

假设3个传感器,一秒钟采集一次数据,前一分钟所有设备都有数据,1分钟后第3个设备无数据。示例代码如下:

def writeData(){
	deviceNum = 3
	for (i in 0:60) {
		data = table(take(1..deviceNum, deviceNum) as deviceID, take(now().datetime(), deviceNum) as ts, rand(10..41, deviceNum) as temperature)
		sensor.append!(data)
		sleep(1000)
	}
	deviceNum = 2
	for (i in 0:600) {
		data = table(take(1..deviceNum, deviceNum) as deviceID ,take(now().datetime(), deviceNum) as ts, rand(10..45,deviceNum) as temperature)
		sensor.append!(data)
		sleep(1000)
	}	
}
submitJob("simulateData", "simulate sensor data", writeData)

运行后,查询报警输出表warningTable,可看到结果示例如下:

47c4f8756c9257c7c933403c4f000cc0.png


附录

测试代码


Je suppose que tu aimes

Origine blog.51cto.com/15022783/2675837
conseillé
Classement