流数据处理和纳秒时间分辨率

wnrlj8wa  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(453)

我刚刚开始讨论实时流数据处理框架的主题,我有一个问题,到目前为止我还没有找到任何结论性的答案:
通常的嫌疑犯(apache的spark、kafka、storm、flink等)是否支持处理事件时间分辨率为纳秒(甚至皮秒)的数据?
大多数人和文档都谈论毫秒或微秒的分辨率,但我无法找到一个明确的答案,如果更多的分辨率是可能的或一个问题。我推断的唯一具有此功能的框架是influxdata的kapacitor框架,因为他们的tsdb influxdb似乎以纳秒分辨率存储时间戳。
这里有谁能提供一些关于这方面的见解,甚至一些有见地的事实吗?提供此功能的替代解决方案/框架?
任何事都将不胜感激!
谢谢和问候,
西蒙
我的问题背景:我现在工作的环境中有很多专有的数据存储和处理实现,并且正在考虑一些组织/优化。我们正在用许多不同的诊断/测量系统在不同的采样率下进行等离子体物理实验,现在的采样率高达“每秒千兆样本以上”。在我们的系统中,一个常见的事实/假设是,每个样本都有一个纳秒分辨率的记录事件时间。当尝试使用一个已建立的流(或批处理)处理框架时,我们必须保持这个时间戳分辨率。或者更进一步,因为我们最近在一些系统上突破了1 gsps的门槛。这就是我的问题。

7rtdyuoh

7rtdyuoh1#

虽然kafka streams使用毫秒分辨率,但运行时实际上有点不可知。到头来只是漫长。
话虽如此,“问题”在于时间窗口的定义。如果指定的时间窗口为1分钟,但时间戳分辨率小于毫秒,则窗口将小于1分钟。作为一种解决方法,您可以使窗口变大,例如,1000分钟或1000000分钟的微秒/纳秒分辨率。
另一个“问题”是,代理只理解毫秒分辨率,而保留时间就是基于此。因此,您需要将保留时间设置得更高,以“欺骗”代理并避免它过早删除数据。

pn9klfpd

pn9klfpd2#

如果不清楚,您应该注意事件时间和处理时间之间的区别:
event time—在源位置生成事件的时间
processing time—处理引擎内事件执行的时间
src:flink文件
afaik storm不支持活动时间,spark支持有限。这就留给Kafka和Flink去考虑了。
flink使用long类型作为时间戳。文档中提到,这个值是1970-01-01t00:00:00z以来的毫秒数,但是当您使用事件时间特性时,唯一的进度度量是事件时间戳。因此,如果你能将你的价值观纳入长期范围,那么它应该是可行的。
编辑:
通常,水印(基于时间戳)用于测量窗口、触发器等中事件时间的进度。因此,如果使用:
然后,在处理时间域中,以config(autowatermark interval)中定义的间隔(即使使用了事件时间特性)发出新的水印。详情见 org.apache.flink.streaming.runtime.operators.TimestampsAndPeriodicWatermarksOperator#open() 方法,其中注册了处理时间中的计时器。因此,如果autowatermark设置为500ms,则每500ms的处理时间(从 System.currentTimeMillis() )将发出新的水印,但水印的时间戳基于事件的时间戳。
赋值有标点水印,那么最好的描述可以在文档中找到 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

相关问题