6

我们有一个 Spark Streaming 应用程序,它从接收器中的 Kafka 队列中读取数据,并进行一些转换并输出到 HDFS。批处理间隔为 1 分钟,我们已经调整了背压和spark.streaming.receiver.maxRate参数,因此大部分时间都可以正常工作。

但是我们还有一个问题。当 HDFS 完全宕机时,批处理作业会长时间挂起(假设 HDFS 不工作 4 小时,作业会挂起 4 小时),但接收方不知道作业未完成,因此它仍在接收接下来 4 小时的数据。这导致OOM异常,整个应用程序宕机,我们丢失了很多数据。

所以,我的问题是:是否有可能让接收者知道工作没有完成,所以它会收到更少(甚至没有)的数据,当工作完成时,它会开始接收更多的数据来赶上。在上述情况下,当HDFS down时,receiver会从kafka中读取较少的数据,并且接下来4小时产生的block真的很小,receiver和整个应用程序都没有down,在HDFS ok后,receiver会读取更多数据并开始迎头赶上。

4

1 回答 1

8

您可以通过设置属性来启用背压spark.streaming.backpressure.enabled=true。这将动态修改您的批量大小,并避免您从队列建立中获得 OOM 的情况。它有几个参数:

  • spark.streaming.backpressure.pid.proportional - 最后批量大小错误的响应信号(默认 1.0)
  • spark.streaming.backpressure.pid.integral - 对累积误差的响应信号 - 有效的阻尼器(默认 0.2)
  • spark.streaming.backpressure.pid.derived - 对错误趋势的响应(用于快速响应变化,默认 0.0)
  • spark.streaming.backpressure.pid.minRate - 批处理频率暗示的最小速率,更改它以减少高吞吐量作业中的下冲(默认 100)

默认值非常好,但我在这里模拟了算法对各种参数的响应

于 2016-12-04T12:36:49.587 回答