随着计算机机硬件的快速发展,机器的内存大小也从原来的以兆为单位到现在的上百G,这也推动了分布式计算从原来的基于硬盘存储发展到现在的基于内存存储,spark作为实时计算的佼佼者也逐渐的走上了大规模商业应用的道路,spark streaming常常用在实时流计算的各个领域,在这一章节我们主要讲解一下streaming处理过程中的流量控制,在我们平时的streaming程序开发过程中应该注意哪些方面以提高程序的吞吐量
流控的目标
系统进行流控的主要目的是维护系统的稳定性,避免大流量数据的处理造成系统的扰动,最终导致系统宕机;流式处理平台系统在进行流控设计时,需要综合考虑稳定性、吞吐量、端到端的延迟,流控经常是在这三者之间做选择;
spark streaming流控
spark streaming程序通常是以指定时间间隔(batch interval)周期性的处理这个时间片内的批量数据,在这种场景下,稳定性指定的是这批数据必须在当前这个周期内处理完毕,系统最大吞吐量为处理时间等于时间间隔时的数据流量;由于spark streaming的周期在系统启动的时候就已经确定了,其流控退化为调整数据的流入速率以最大的提高系统的吞吐量;线上的streaming程序的处理时间和数据的批量大小并没有固定的规律可循,同时一个其他的突发因素(如发生GC)也会影响到数据的处理速率;spark streaming的流控需要做的是基于过去一段时间内的已经处理完成的批量数据来推算出下一个周期内应该处理的数据量,另外,一个好的流控算法需要更敏捷、更准确、更通用。