apache-spark - Spark Structured Streaming 如何确定事件已晚到?

标签 apache-spark

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

enter image description here

以上图为例,右粗箭头线“时间”代表处理时间吗?如果是这样的话

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/

    相关文章:

    MongoDB Spark Connector - 聚合速度慢

    python - 如何在 zeppelin 中使用 anaconda?

    apache-spark - Spark - 如何通过 'SparkLauncher' 识别失败的作业

    shell - 设置hadoop用户通过oozie shell操作启动spark-submit

    scala - 使用Spark检索聚集/存储桶

    apache-spark - 字符串分区键与整数分区键的 Hive/Impala 性能

    apache-spark - 获取有关工作流程提交后创建的当前 dataproc 集群的信息

    apache-spark - 在pyspark数据帧上计算百分比

    scala - Spark-提交 java.lang.ClassNotFoundException

    hadoop - 在没有 map 和 reduce 的情况下使用 Spark 进行顺序的逐行处理