我通读了 spark 结构化流媒体文档,我想知道 spark 结构化流媒体如何确定事件已晚到?它是否将事件时间与处理时间进行比较?
以上图为例,右粗箭头线“时间”代表处理时间吗?如果是这样的话
1)这个处理时间从哪里来?因为它的流媒体 是否假设有人可能使用具有处理时间戳的上游源,或者 spark 添加了处理时间戳字段?例如,当从 Kafka 读取消息时,我们会做一些类似的事情
Dataset<Row> kafkadf = spark.readStream().forma("kafka").load()
默认情况下,此数据框具有时间戳列,我假设它是处理时间。正确的?如果是这样,Kafka 或 Spark 是否添加此时间戳?
2)我可以看到消息中粗体右箭头线和时间之间存在时间比较。这就是 spark 确定事件迟到的方式吗?
最佳答案
单个作业的处理时间(RDD
中的一个 DStream
)通常决定了处理时间。这不是该 RDD 的实际处理发生的时间,而是 RDD
作业已分配待处理。
为了清楚地理解上述语句的含义,创建一个 Spark 流应用程序,其中批处理时间 = 60 seconds
并确保批次需要 2 minute
.最终,您会看到一个作业被分配为一次处理,但由于前一个作业尚未完成而未被接收。
下一个:
可以用两种不同的方式处理乱序数据。
High water mark
. 它在您获得图片的同一个 spark 用户指南页面中进行了解释。
很容易理解我们在哪里有
key
, value
其中 key 是 timestamp
的对.设置 .withWatermark("timestamp", "10 minutes")
我们基本上是说,如果我收到了 10 AM
的消息那么我将允许比那个稍早的消息 (Upto 9.50AM)
.任何比这更旧的消息都会被丢弃。mapGroupsWithState
中使用。或 mapWithState
功能。在这里你可以决定当你得到一堆键值时要做什么。在时间 X 之前放下任何东西,或者比那更漂亮。 (例如,如果是来自 A 的数据,则允许延迟 20 分钟,其余允许延迟 30 分钟等...)
关于apache-spark - Spark Structured Streaming 如何确定事件已晚到?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48990755/