反压机制
某种意义上说,反压机制是Spark特有的。Spark的流处理模型导致了系统可能接收数据过快,超过了系统处理数据的能力。
什么是反压?
Spark Streaming每隔一定的时间间隔将接收到的数据进行批处理,如果批处理的时间大于该时间间隔,那么意味着系统当前处理能力不足。也就是说,系统接收数据的速率过快,超过了系统处理数据的速率。如果这种情况持续过长的时间,会造成数据在内存中堆积,轻则导致数据会溢写至磁盘带来延迟,重则导致内存溢出。
反压机制就是使得系统接受数据速率和处理数据速率两者相匹配。
Spark如何反压?
简单来说,反压机制需要调节系统接受数据速率或处理数据速率,然而系统处理数据的速率是没法简单的调节。因此,只能估计当前系统处理数据的速率,调节系统接受数据的速率来与之相匹配。具体细节可参考这里。
Flink如何反压?
严格来说,Flink无需进行反压,因为系统接收数据的速率和处理数据的速率是自然匹配的。系统接收数据的前提是接收数据的Task必须有空闲可用的Buffer,该数据被继续处理的前提是下游Task也有空闲可用的Buffer。因此,不存在系统接受了过多的数据,导致超过了系统处理的能力。具体细节可参考这里。
由此看出,Spark的micro-batch模型导致了它需要单独引入反压机制。
反压与高负载
反压通常产生于这样的场景:短时负载高峰导致系统接收数据的速率远高于它处理数据的速率。
但是,系统能够承受多高的负载是系统数据处理能力决定的,反压机制并不是提高系统处理数据的能力,而是系统所面临负载高于承受能力时如何调节系统接收数据的速率。