Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark Structured Streaming如何确定事件延迟?_Apache Spark - Fatal编程技术网

Apache spark Spark Structured Streaming如何确定事件延迟?

Apache spark Spark Structured Streaming如何确定事件延迟?,apache-spark,Apache Spark,我通读了spark结构化流媒体文档,我想知道spark结构化流媒体是如何确定某个事件迟到的?它是否将事件时间与处理时间进行比较 以上图为例,粗体右箭头线“Time”是否表示处理时间?如果是的话 1) 这个处理时间是从哪里来的?因为它是流式的,所以它是否假设有人可能使用具有处理时间戳的上游源,或者spark添加了一个处理时间戳字段?例如,当我们阅读卡夫卡的信息时 Dataset<Row> kafkadf = spark.readStream().forma("kafka").load

我通读了spark结构化流媒体文档,我想知道spark结构化流媒体是如何确定某个事件迟到的?它是否将事件时间与处理时间进行比较

以上图为例,粗体右箭头线“Time”是否表示处理时间?如果是的话

1) 这个处理时间是从哪里来的?因为它是流式的,所以它是否假设有人可能使用具有处理时间戳的上游源,或者spark添加了一个处理时间戳字段?例如,当我们阅读卡夫卡的信息时

Dataset<Row> kafkadf = spark.readStream().forma("kafka").load()
Dataset kafkadf=spark.readStream().forma(“kafka”).load()
默认情况下,这个数据帧有timestamp列,我假设这是处理时间。对的如果是这样,卡夫卡或Spark是否会添加此时间戳


2) 我可以看到消息中粗体右箭头线和时间之间存在时间比较。这就是spark确定事件延迟的方式吗?

单个作业的处理时间(一个
RDD
DStream
)通常决定了处理时间。它不是在实际处理该RDD时发生,而是在分配要处理的
RDD
作业时发生。 为了清楚地理解上述语句的含义,请创建一个spark streaming应用程序,其中批处理时间=
60秒
,并确保批处理时间
2分钟
。最终,您将看到一个作业被分配一次处理,但由于上一个作业尚未完成,因此未被拾取

下一步: 无序数据可以用两种不同的方式处理

  • 创建一个
    高水位线
    这在您获得图片的spark用户指南页面中进行了解释

    很容易理解哪里有
    对,其中键是
    时间戳
    。设置
    .withWatermark(“timestamp”,“10分钟”)
    基本上是说,如果我收到了上午10点的
    消息,那么我将允许比该
    (上午9点50分之前)
    稍早的消息。任何早于此的消息都会被删除

  • 处理无序数据的另一种方法是使用
    mapGroupsWithState
    mapWithState
    函数。 在这里,您可以决定在为一个键获取一组值时要做什么。在时间X之前放下任何东西,或者去比它更华丽的地方。(例如,如果是来自A的数据,则允许20分钟延迟,对于其他数据,则允许30分钟延迟等。)

  • 这篇来自databricks的文档非常清楚地解释了这一点:

    基本上可以归结为水印(延迟数据阈值)和数据记录到达的顺序。处理时间根本不起作用。在表示事件时间的列上设置水印。如果事件时间为T1的记录R1在已经看到事件时间为T2的记录R2之后到达,并且T2>T1+阈值,则R1将被丢弃

    例如,假设T1=09:00,T2=10:00,Threshold=61分钟。如果事件时间为T1的记录R1在事件时间为T2的记录R2之前到达,则R1包括在计算中。如果R1在R2之后到达,则R1仍包括在计算中,因为T2
    现在假设阈值=59分钟。如果R1在R2之前到达,则R1包括在计算中。如果R1在R2之后到达,则R1将被丢弃,因为我们已经看到了一条事件时间为T2且T2>T1+阈值的记录。

    亲爱的Downvoter,如果您在进行Downvoter时能说出问题所在,那就太好了-然后用户可以编辑并提高质量:)