1.3 实时流数据的特点
1.3节介绍了实时流计算技术的使用场景。实时流计算技术的处理对象是实时流数据。尽管实时流数据的来源千变万化、丰富多彩,但归纳起来,实时流数据通常具有实时性、随机性、无序性和无限性。
1.实时性
之所以要采集实时流数据,并对其进行实时处理,是因为这些数据具有实时价值。例如,提前预警避免火灾,贷前反欺诈避免骗贷,量化交易抢得市场先机等。如果事后再分析这些数据,这个时候火灾已经发生,骗子已经卷款而逃,市场机会已经错过,分析数据带来的价值也只限于“前事不忘,后事之师”了。因此,对实时流数据的计算和分析一定要在其实时价值消退之前完成,这就要求计算的时延必须小。有时候数据量大、计算复杂的原因会导致实时计算无法完成,这时甚至会牺牲结果的准确性,在保证误差在可接受范围的前提下,优先满足计算的实时性。
2.随机性
流数据是真实世界发生各种事件的体现。真实世界事件的随机发生,使得流数据的产生在时间和数量上具有随机性。有时候在很长一段时间内只产生少量数据,有时候又会在很短时间内产生大量数据。实时流数据的随机性对实时流计算系统在各种流量和突发情况下的处理能力与服务稳定性提出要求。我们可以从数据采样、数据缓冲、计算资源动态调整3个角度来解决实时流数据随机性的问题。有些情况下,流数据量很大,暂时超过了系统的处理能力,如果业务需求允许,则可以考虑丢弃部分数据,或者使用带采样性质的算法,减少计算压力。如果数据不允许丢失,则可以采用带缓冲和持久化能力的消息中间件来暂时缓冲数据,让系统平稳处理数据流,削平流量高峰。另外,在一些资源敏感的情况下,可能还需要实时流计算系统能够根据流量压力情况,动态增加或减少计算资源,使得在满足实时流计算的同时,最大化计算资源的使用效率。
3.无序性
流数据是一个关于时间的事件序列。我们通常希望事件会按照它们发生的时刻依次到达系统,但由于异步、并发、网络延时、时间不同步和系统故障等诸多原因,严格意义上的全局有序是很难保证的,甚至几乎不可能。于是退而求其次,我们可以让数据在局部时间窗口内有序。在目前主流的实时流计算框架中,常见的做法是将接收到的事件,按时间戳分发到一个个的时间窗口分片中,在等待一段时候后,再触发时间窗口分片内数据的统一处理操作。流数据中的时间有两类:事件发生时间和事件处理时间。事件发生时间是指事件发生的时刻,而事件处理时间则是系统处理事件的时刻。这两种时间会导致流计算的过程和结果都有所不同,具体使用哪种时间因场景而异。
4.无限性
流数据是一种随时间无限增长的数据序列。这是流数据和批数据最本质的区别。批数据在每次处理时数据量是有限的,而流数据没有“每次”的概念,它总在不断产生,无穷无尽。流数据和批数据的区别,导致它们在系统架构和算法实现上都有所不同。
在系统架构上,实时流数据的无限性要求系统必须具备高可用性和实时处理能力。一方面,当系统发生故障时,如果系统没有高可用性,则流数据会丢失,并会暂停流计算。这与实时流计算的目标(即在实时流数据上获取实时价值)是相违背的,因此不可容忍。另一方面,当系统处理能力不能跟上数据流产生的速度时,待处理的消息会越积越多。当积压数量超过阈值后,具有有限存储空间的系统必然会崩溃。为了消除已经存在的积压消息,系统处理能力必须超过数据流产生的速度,否则积压情况会一直存在。
在算法实现上,实时流数据的无限性对原本针对批数据设计的算法提出挑战。一方面,实时流计算过程中的可用空间和可用时间都有更严苛的限制;另一方面,流计算的输入数据随时间无限增加,这和批处理算法的输入是有限数据集有本质区别。因此,实时流计算使用的算法相比批处理算法,在算法实现和算法复杂度方面会有明显不同。
在实时流数据的四大特点中,无限性是流数据相比批数据最大的区别,这直接导致了流处理和批处理的查询模式有所不同。批处理是在固定数据集上进行不同的查询,而流处理是在无限数据集上进行固定的查询。实时性、随机性和无序性既是实时流计算系统的特点,也是我们要解决的问题。在1.4节中,我们将针对这些问题来分析实时流计算系统的架构特点。