Spark Streaming Kafka后压力问题

6
我们有一个Spark Streaming应用程序,它从接收器的Kafka队列中读取数据并执行一些转换,最后输出到HDFS。批处理间隔为1分钟,我们已经调整了背压和`spark.streaming.receiver.maxRate`参数,因此大部分时间都可以正常工作。
但是我们仍然有一个问题。当HDFS完全崩溃时,批处理作业将会挂起很长时间(假设HDFS不工作4小时,则作业将挂起4小时),但是接收器并不知道作业没有完成,因此它仍在接收下一个4小时的数据。这会导致OOM异常,整个应用程序宕机,我们丢失了很多数据。
所以我的问题是:是否有可能让接收器知道作业没有完成,因此它会接收更少(甚至没有)数据,并在作业完成后开始接收更多数据进行赶上。在上述情况下,当HDFS崩溃时,接收器将从Kafka读取较少的数据,生成的阻塞非常小,接收器和整个应用程序不会崩溃,在HDFS恢复正常后,接收器将读取更多数据并开始赶上。
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)
默认值非常好,但我模拟了算法对各种参数的响应here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接