Spark Streaming Kafka背压

时间:2016-04-15 07:57:16

标签: apache-spark apache-kafka streaming backpressure spark-streaming-kafka

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

但我们还有一个问题。当HDFS完全关闭时,批处理作业将挂起很长时间(让我们说HDFS工作4小时不起作业,并且作业将挂起4小时),但是接收器不知道作业没有完成,所以它仍在接收未来4小时的数据。这导致OOM异常,并且整个应用程序关闭,我们丢失了大量数据。

所以,我的问题是:是否有可能让接收者知道作业没有完成,因此它将收到更少(甚至没有)数据,并且当作业完成时,它将开始接收更多数据以赶上。在上述情况下,当HDFS关闭时,接收器将从Kafka读取较少的数据,并且在接下来的4小时内生成的块非常小,接收器和整个应用程序没有关闭,在HDFS正常后,接收器将读取更多数据并开始追赶。

1 个答案:

答案 0 :(得分: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)

默认值非常好,但我模拟了算法对各种参数here

的响应