我们有一个 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会读取更多数据并开始迎头赶上。