2016-04-15 106 views
4

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

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

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

回答

6

您可以通过设置属性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

+1

不要错过链接,不错的和详细的分析.. – raksja