Spark Structured Streaming源保留策略

时间:2018-02-19 15:04:30

标签: apache-spark spark-structured-streaming

考虑一个关于Kafka主题的连续JSON数据流,我们希望通过结构化流来处理它:

val df = spark
   .readStream
   .format("kafka")
   .option("kafka.bootstrap.servers", "host1:port1,host2:port2")
   .option("subscribe", "topic1")
   .load()

我想知道该程序是否会长时间运行,然后df变量会变得如此之大 - 在我的情况下,就像100 TB一周。那么有没有可用的配置来消除df中的早期数据或者只是将最早的行出列?

1 个答案:

答案 0 :(得分:-1)

在Spark中,在触发操作之前不会启动执行。 这个概念叫做Lazy Evaluation in Apache Spark。 “转换本质上是懒惰的,这意味着当我们在RDD中调用某些操作时,它不会立即执行”

说过加载操作是转换,执行这行代码时不会读取数据。

为了启动流式传输作业,需要提供以下4个逻辑组件并调用start:

  1. 输入(Kafka,文件,套接字,..)
  2. 触发器(输入的频率更新)
  3. 结果表(在触发器更新后根据查询创建)
  4. 输出(定义将写入结果的哪一部分)
  5. 内存消耗取决于将在触发的查询中执行的操作。 Spark Documentation:

      

    "由于Spark正在更新结果表,因此它可以完全控制   在有迟到数据以及清理时更新旧聚合   旧聚合以限制中间状态数据的大小。以来   Spark 2.1,我们支持允许用户使用的水印   指定后期数据的阈值,并允许引擎   据此清理旧州。"

    因此,您必须确定计算结果表所需的数据量,以便估算所需内存的大小 如果您执行以下操作,执行程序可能会因OOM异常而崩溃:mapGroupWithState,...