首页 > 解决方案 > 流数据处理和纳秒时间分辨率

问题描述

我刚刚开始研究实时流数据处理框架的主题,我有一个问题,我至今找不到任何确凿的答案:

通常的嫌疑人(Apache 的 Spark、Kafka、Storm、Flink 等)是否支持以纳秒(甚至皮秒)的事件时间分辨率处理数据?

大多数人和文档都在谈论毫秒或微秒的分辨率,但是如果可能有更多的分辨率或问题,我无法找到明确的答案。我推断唯一具有此功能的框架是 influxData 的 Kapacitor 框架,因为他们的 TSDB influxDB 似乎以纳秒分辨率存储时间戳。

这里的任何人都可以提供一些对此的见解,甚至是一些知情的事实吗?提供此功能的替代解决方案/框架?

任何事情都会非常感激!

谢谢并恭祝安康,

西蒙


我的问题的背景:我正在一个环境中工作,该环境具有许多用于数据存储和处理的专有实现,并且目前正在考虑一些组织/优化。我们正在使用许多不同的诊断/测量系统以不同的采样率进行等离子体物理实验,现在高达“每秒超过千兆样本”。我们系统中的一个常见事实/假设是每个样本确实有一个以纳秒分辨率记录的事件时间。当尝试使用已建立的流(或批处理)处理框架时,我们必须保持这个时间戳分辨率。或者更进一步,因为我们最近在某些系统上突破了 1 Gsps 阈值。因此我的问题。

标签: apache-kafkaapache-flinkapache-stormapache-kafka-streamskapacitor

解决方案


如果不清楚,您应该注意事件时间和处理时间之间的差异:

事件时间- 在源处生成事件的时间

处理时间- 处理引擎内事件执行的时间

src:Flink 文档

AFAIK Storm 不支持事件时间,Spark 的支持有限。这让 Kafka Streams 和 Flink 有待考虑。

Flink 使用 long 类型作为时间戳。文档中提到该值是自 1970-01-01T00:00:00Z 以来的毫秒数,但是 AFAIK,当您使用事件时间特征时,唯一的进度度量是事件时间戳。因此,如果您可以将您的价值观纳入长期范围,那么它应该是可行的。

编辑:

通常,水印(基于时间戳)用于测量窗口、触发器等中事件时间的进度。因此,如果您使用:

  • AssignerWithPeriodicWatermarks然后在处理时域的配置(自动水印间隔)中定义的间隔中发出新的水印 - 即使使用事件时间特征也是如此。有关详细信息,请参见org.apache.flink.streaming.runtime.operators.TimestampsAndPeriodicWatermarksOperator#open()方法,其中注册了处理时间中的计时器。因此,如果自动水印设置为 500 毫秒,则每 500 毫秒的处理时间(取自System.currentTimeMillis())发出一个新水印,但水印的时间戳基于事件的时间戳。

  • AssignerWithPunctuatedWatermarks那么最好的描述可以在文档中找到org.apache.flink.streaming.api.datastream.DataStream#assignTimestampsAndWatermarks(org.apache.flink.streaming.api.functions.AssignerWithPunctuatedWatermarks<T>)

为数据流中的元素分配时间戳,并根据元素本身创建水印以指示事件时间进度。

此方法纯粹基于流元素创建水印。对于通过 处理的每个元素,如果返回的水印值非负且大于前一个水印,则调用AssignerWithPunctuatedWatermarks#extractTimestamp(Object, long)该方法并发出新的水印。AssignerWithPunctuatedWatermarks#checkAndGetNextWatermark(Object, long)

当数据流中嵌入了水印元素,或者某些元素带有可以用来确定当前事件时间水印的标记时,这种方法很有用。此操作使程序员可以完全控制水印的生成。用户应该意识到过于激进的水印生成(即每秒生成数百个水印)可能会降低一些性能。

要了解水印的工作原理,强烈推荐阅读:Tyler Akidau on Streaming 102


推荐阅读