考虑一个关于Kafka主题的连续JSON数据流,我们希望通过结构化流来处理它:
val df = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "topic1")
.load()
我想知道该程序是否会长时间运行,然后df
变量会变得如此之大 - 在我的情况下,就像100 TB一周。那么有没有可用的配置来消除df
中的早期数据或者只是将最早的行出列?
答案 0 :(得分:-1)
在Spark中,在触发操作之前不会启动执行。 这个概念叫做Lazy Evaluation in Apache Spark。 “转换本质上是懒惰的,这意味着当我们在RDD中调用某些操作时,它不会立即执行”
说过加载操作是转换,执行这行代码时不会读取数据。
为了启动流式传输作业,需要提供以下4个逻辑组件并调用start:
内存消耗取决于将在触发的查询中执行的操作。 Spark Documentation::
"由于Spark正在更新结果表,因此它可以完全控制 在有迟到数据以及清理时更新旧聚合 旧聚合以限制中间状态数据的大小。以来 Spark 2.1,我们支持允许用户使用的水印 指定后期数据的阈值,并允许引擎 据此清理旧州。"
因此,您必须确定计算结果表所需的数据量,以便估算所需内存的大小 如果您执行以下操作,执行程序可能会因OOM异常而崩溃:mapGroupWithState,...