Azure 流分析处理事件的时间太长

Azure Stream Analytics takes too long to process the events

我正在尝试配置 Azure 流分析作业,但性能一直很差。我从将数据推送到事件中心的客户端系统接收到数据。 ASA 将其查询到 Azure SQL 数据库中。

几天前,我注意到它生成了大量的 InputEventLateBeyondThreshold 错误。这是 ASA 的示例。 Timestamp 元素由客户端系统设置。

{
    "Tag": "MANG_POWER_5",
    "Value": 1.08411181,
    "ValueType": "Analogue",
    "Timestamp": "2022-02-01T09:00:00.0000000Z",
    "EventProcessedUtcTime": "2022-02-01T09:36:05.1482308Z",
    "PartitionId": 0,
    "EventEnqueuedUtcTime": "2022-02-01T09:00:00.8980000Z"
}

您可以看到事件很快到达,但处理时间超过 30 分钟。为了尽量避免 InputEventLateBeyondThreshold 错误,我增加了延迟事件阈值。这可能会导致处理时间增加,但它太短也会增加 InputEventLateBeyondThreshold 错误的数量。

水印延迟一直很高,但 SU 使用率约为 5%。对于此查询,我已将 SU 增加到尽可能高的水平。

我想弄明白,为什么在事件到达后处理事件需要这么长时间。

这是我正在使用的查询:

WITH PIDataSet AS (SELECT * FROM [<event-hub>] TIMESTAMP BY timestamp)

--Write data to SQL joining with a lookup
SELECT   
    i.Timestamp as timestamp,
    i.Value as value,
INTO [<sql-database>]
FROM PIDataSet as i
INNER JOIN [tagmapping-ref-alias] tm ON tm.sourcename = i.Tag

----Write data to AzureTable joining with a lookup
SELECT
    DATEDIFF(second,CAST('1970-01-01' as DateTime), I1.Timestamp) As Rowkey,
    I2.TagId as PartitionKey,
    I1.Value as Value,
    UDF.formatTime(I1.Timestamp) as DeviceTimeStamp
    into [<azure-table>]
FROM PIDataSet as I1
    JOIN [tagmapping-ref-alias] as I2 on I2.Sourcename = I1.Tag

--Get an hourly count into a SQL Table.
SELECT
    I2.TagId,
    System.Timestamp() as WindowEndTime, COUNT(I2.TagId) AS InputCount
    into [tagmeta-ref-alias]
FROM PIDataSet as I1
    JOIN [tagmapping-ref-alias] as I2 on I2.Sourcename = I1.Tag
    GROUP BY I2.TagId, TumblingWindow(Duration(hour, 1))

当您设置 59 分钟 out-of-order window 时,您所做的就是为该输入设置 59 分钟的缓冲区。当记录落入该缓冲区时,它们将等待 59 分钟,直到它们出来。作为交换,我们有机会 re-order 这些事件,以便他们按顺序查找工作。

在 1 小时使用它是一种极端设置,根据定义,它会自动为您提供 59 分钟的水印。这非常令人惊讶,我想知道为什么您需要这么高的值。

编辑

现在查看迟到政策。

您正在使用活动时间 (TIMESTAMP BY timestamp),这意味着您的活动现在可以延迟,请参阅 this doc and this one

这意味着当记录晚于 1 小时(因此时间戳比我们服务器上挂钟的时间早于 1 小时 - 在 UTC 中),然后我们将其时间戳调整为我们的挂钟减 1 小时,然后发送它到查询。这也意味着您的翻滚 window 总是需要再等一个小时,以确保它不会丢失那些迟到的记录。

这里我会做的是恢复默认设置(没有乱序,5秒延迟事件,调整事件)。然后当你得到 InputEventLateBeyondThreshold 时,这意味着该作业收到了过去晚于 5 秒的 timestamp。您不会丢失数据,我们正在将其 system.timestamp 调整为更新的值(但不是时间戳字段,我们不会更改它)。

然后我们需要了解的是,为什么您的管道中的一条记录从生产到消费需要超过 5 秒的时间。是因为你的摄取管道有很大的延迟,还是因为你的生产者时钟有时间偏差?你知道吗?