Productos secos 丨 Cómo utilizar el motor informático de flujo DolphinDB para lograr la detección de anomalías en los datos del sensor

La base de datos DolphinDB proporciona una tabla de flujo y un motor de cálculo de flujo para el procesamiento de datos en tiempo real, incluida la detección anormal de datos de sensores en el Internet de las cosas. El motor de detección de anomalías integrado (motor de detección de anomalías) puede satisfacer las necesidades de la mayoría de los escenarios de detección de anomalías. Si la lógica de detección de anomalías es compleja y especial, y el motor de detección de anomalías estandarizado no puede cumplir con los requisitos, el usuario puede implementarla con una función de procesamiento de mensajes personalizada.


1. Requisitos de solicitud

Un sistema de monitoreo recopila datos cada segundo. Hay dos requisitos de detección de anomalías como se indica a continuación:

  • Cada 3 minutos, si la temperatura del sensor es superior a 40 grados Celsius dos veces y superior a 30 grados Celsius tres veces, el sistema emitirá una alarma.
  • Si la red de sensores se desconecta y no hay datos en 5 minutos, el sistema emitirá una alarma.

La alarma anterior se refiere a escribir un registro en una tabla de datos de flujo si se detecta una anomalía.


2. Ideas de diseño

El marco corriente de computación de la DolphinDB base de datos de series de tiempo distribuido actualmente soporta motores de tiempo de agregación de serie , de la sección transversal motores de agregación , anomalía de motores de detección y motores de corriente encargo de computación:

  • Agregador de series de tiempo: puede realizar cálculos de agregación vertical del estado del dispositivo (agregado en series de tiempo), o agregar varios estados de dispositivos horizontalmente y luego agregarlos según el tiempo. La agregación de series de tiempo admite la transmisión de cálculos con ventanas deslizantes. DolphinDB ha optimizado el rendimiento de las funciones de agregación de ventanas integradas, y una CPU de un solo núcleo puede completar la agregación de tiempo de casi un millón de estados por segundo.
  • Agregador de sección transversal (Agregador de sección transversal): es una extensión del motor de instantáneas que puede realizar cálculos de agregación horizontal sobre el estado del dispositivo, como calcular la temperatura promedio de un lote de dispositivos.
  • Motor de detección de anomalías: puede detectar si los datos cumplen con los indicadores de alarma definidos por el usuario en tiempo real. Si se encuentran datos anormales, se enviarán a la mesa para satisfacer las necesidades de monitoreo en tiempo real y alerta temprana de Internet de Cosas.
  • Motor de procesamiento de flujo personalizado: cuando ninguno de los tres motores anteriores puede satisfacer la demanda, los usuarios también pueden usar el script DolphinDB o el lenguaje API para personalizar las funciones de procesamiento de mensajes.

Para el primer requisito, el sistema emitirá una alarma cuando la temperatura del sensor sea anormal en 3 minutos y el motor de detección anormal sea adecuado. Simplemente escriba una expresión con el script DolphinDB para describir la lógica de excepción. Pero el segundo requisito no se aplica. El motor de detección de anomalías se procesa mediante agrupación de dispositivos. El cálculo se activa cada vez que ingresan nuevos datos, o el cálculo de agregación se realiza en una ventana móvil de una longitud fija a intervalos. Si un sensor no genera nuevos datos, no puede activar cálculos. La solución es personalizar un manejador de mensajes (manejador de mensajes) para calcular y detectar. La idea de realización específica es: utilizar una tabla de memoria de valores clave para registrar el último tiempo de adquisición de cada sensor. El mensaje ingresa a la función de procesamiento de mensajes en un cierto intervalo de tiempo (por ejemplo, 1 segundo). La función de procesamiento de mensajes primero actualiza la tabla de memoria de valores clave y luego verifica si el último tiempo de recopilación registrado por cada dispositivo en esta tabla supera los 5 minutos y, de ser así, emitirá una alarma.

 

3. Pasos de implementación detallados


3.1 Definir la tabla de datos de flujo de entrada y salida

Primero, defina una tabla de datos de transmisión para recibir los datos del sensor recopilados en tiempo real y utilice la función enableTableShareAndPersistence para compartir y conservar la tabla de datos de transmisión en el disco duro. El parámetro cacheSize limita la cantidad máxima de datos retenidos en la memoria a 1 millón de filas. Aunque el dispositivo sensor tiene muchos indicadores, debido a que este ejemplo solo incluye indicadores de temperatura, este ejemplo simplifica la estructura de la tabla. La estructura de la tabla contiene solo tres columnas, a saber, el número de sensor ID del dispositivo, el tiempo ts y la temperatura. el código se muestra a continuación:

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

En segundo lugar, defina la tabla de datos del flujo de salida de alarma para la salida del motor de detección de anomalías. Según la descripción de los parámetros de createAnomalyDetectionEngine en el manual de usuario de DolphinDB , el motor de anomalías tiene requisitos estrictos sobre el formato de la tabla de salida, es decir, su primera columna debe ser un tipo de hora, utilizada para almacenar la marca de tiempo de la anomalía detectada y El tipo de datos de esta columna debe ser coherente con la columna de tiempo de la tabla de entrada. Si el parámetro keyColumn (columna de agrupación) no está vacío, la segunda columna es keyColumn. En este ejemplo, la columna de agrupación es el número de sensor deviceID. Las siguientes dos columnas son tipo int y tipo cadena / símbolo, que se utilizan para registrar el tipo de excepción (subíndice en métricas) y el contenido de la excepción. El código de la tabla es el siguiente:

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

3.2 Cree un motor de detección de anomalías para realizar la función de alarma de temperatura del sensor anormal

En el motor de detección de anomalías, establezca el índice de anomalías en suma (temperatura> 40)> 2 && suma (temperatura> 30)> 3, la columna de agrupación (keyColumn) es el número de sensor ID de dispositivo, la ventana de datos windowSize es 180 segundos y el intervalo de tiempo calculado es de 30 segundos. Cómo configurar estos parámetros puede referirse al motor de detección de anomalías . el código se muestra a continuación:

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 Crear una función de procesamiento de mensajes personalizada para realizar la función de alarma fuera de línea del sensor

El segundo requisito es guardar el último tiempo de recopilación de datos de cada sensor para determinar si los datos no se han recopilado durante 5 minutos. Este ejemplo usa una tabla de memoria de valor-clave para almacenar el estado más reciente de cada dispositivo y usa el número de sensor deviceID como clave principal. En la tabla de clave-valor, la búsqueda y actualización basadas en el clave-valor tienen una eficacia muy alta. Al recibir datos del sensor, utilice la función append! Para actualizar los registros en la tabla de valores clave. Si el valor de la clave principal del nuevo registro no existe en la tabla, agregue un nuevo registro a la tabla; si el valor de la clave principal del nuevo registro duplica el valor de la clave principal del registro existente, el valor de la clave principal correspondiente en se actualizará el registro de la tabla.

Al enviar información de anomalías a la tabla de datos del flujo de salida de alarmas, el tipo de anomalía anomalyType se establece en 1 porque el motor de detección de anomalías de la sección anterior ya ha utilizado 0. El contenido de la excepción se establece en vacío.

El parámetro throttle y batchSize de la función de configuración subscribeTable puede lograr el propósito de mejorar el rendimiento del procesamiento por lotes de mensajes. El parámetro throttle determina la frecuencia con la que el controlador procesará un mensaje. En este ejemplo, está configurado para procesar cada segundo. Debe tenerse en cuenta aquí que cuando el número de mensajes alcanza el tamaño de lote, los mensajes entrantes se procesarán incluso si el intervalo no está terminado, por lo que batchSize debe establecerse en un número relativamente grande. El código de muestra es el siguiente, donde se supone que el número de sensores deviceNum es 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. Escritura y verificación de simulación

Suponiendo que 3 sensores recopilan datos una vez por segundo, todos los dispositivos tienen datos en el minuto anterior y el tercer dispositivo no tiene datos después de 1 minuto. El código de muestra es el siguiente:

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)

Después de ejecutar, consulte la tabla de salida de advertencia warningTable, puede ver que los resultados son los siguientes:


apéndice

Código de prueba

Supongo que te gusta

Origin blog.csdn.net/qq_41996852/article/details/112799453
Recomendado
Clasificación