左外连接在两个不发出空输出的流上。它只是在等待将记录添加到其他流中。使用socketstream来测试这个。在我们的例子中,我们想要使用与id或/不匹配的空值来发出记录,而不是在时间范围内的条件
水印和间隔的详细信息如下:
val ds1Map = ds1
.selectExpr("Id AS ds1_Id", "ds1_timestamp")
.withWatermark("ds1_timestamp","10 seconds")
val ds2Map = ds2
.selectExpr("Id AS ds2_Id", "ds2_timestamp")
.withWatermark("ds2_timestamp", "20 seconds")
val output = ds1Map.join( ds2Map,
expr(
""" ds1_Id = ds2_Id AND ds2_timestamp >= ds1_timestamp AND ds2_timestamp <= ds1_timestamp + interval 1 minutes """),
"leftOuter")
val query = output.select("*")
.writeStream
.outputMode(OutputMode.Append)
.format("console")
.option("checkpointLocation", "./spark-checkpoints/")
.start()
query.awaitTermination()
谢谢。
答案 0 :(得分:0)
这可能是由于开发人员指南中提到的微批处理体系结构实现的一个空洞:https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#semantic-guarantees-of-stream-stream-inner-joins-with-watermarking
在微批量引擎的当前实现中,水印在微批次结束时前进,下一个微批次使用更新的水印来清理状态并输出外部结果。由于我们仅在存在要处理的新数据时才触发微批处理,因此如果在流中没有接收到新数据,则外部结果的生成可能会延迟。简而言之,如果连接的两个输入流中的任何一个在一段时间内没有接收到数据,则外部(两种情况,左侧或右侧)输出可能会延迟。
对于我来说,情况就是这样,在一段时间后触发了另一批次之前,空数据没有被清除
答案 1 :(得分:0)
您好,杰克,感谢您的答复。问题/问题是一年半之前的,恢复我去年所做的工作花了一些时间:), 我在两个主题上运行了流2流连接,其中一个具有更多的10K sec msg,它正在具有4.67 TB总内存和1614 VCor的Spark集群上运行。
实施是简单的结构化流式流2流连接,如Spark官方文档中所示:
// Join with event-time constraints
impressionsWithWatermark.join(
clicksWithWatermark,
expr("""
clickAdId = impressionAdId AND
clickTime >= impressionTime AND
clickTime <= impressionTime + interval 1 hour
""")
)
它运行了几个小时,直到OOM。 经过调查,我发现了HDFSBackedStateStoreProvider中的火花清理状态和spark中打开的Jira的问题:
https://issues.apache.org/jira/browse/SPARK-23682
Memory issue with spark structured streaming
这就是为什么我移回并在Spark Streaming 2.1.1 mapWithState中实现流到流连接的原因。
Thx