本文重点
从数据集的类型来看,数据集可以分为有界数据和无界数据两种,从处理方式来看,有批处理和流处理两种。一般而言有界数据常常使用批处理方式,无界数据往往使用流处理方式。
有界数据和无界数据
有界数据有一个明确的开始和结束。在执行任何计算之前,可以通过获取所有数据来处理有界流。处理有界流不需要有序摄取,因为有界数据集总是可以排序的。有界流的处理也称为批处理。
无界数据有开始但是没有结束。无界数据流必须被连续处理,即事件在被接收后必须被迅速处理。不可能等待所有输入数据到达,因为输入是无限的,并且不会在任何时间点完成。处理无限数据通常需要以特定的顺序接收事件,例如事件发生的顺序,以便能够推断结果的完整性,这往往也是处理无界数据困难的地方,因为事件的接收顺序和事件的发生顺序往往是不一致的。
有界数据集和无界数据集只是一个相对的概念,主要根据时间的范围而定,可以认为一段时间内的无界数据集其实就是有界数据集,同时有界数据也可以通过一些方法转换为无界数据。例如一台插座设备上报一年的电量数据,其本质上应该是有界的数据集,可是当我们把它一条一条按照产生的顺序发送到流式系统,通过流式系统对数据进行处理,在这种情况下可以认为数据是相对无界的。对于无界数据也可以拆分成有界数据进行处理,例如一台设备不停的上报电量数据,如果按照年或月进行切割,此时我们就可以将数据看成是有界的。
从以上分析我们可以得出结论:有界数据和无界数据其实是可以相互转换的。有了这样的理论基础,对于不同的数据类型,业界也提出了不同的能够统一数据处理的计算框架。比如Apache Spark框架和Apache Flink框架。
比如Spark通过批处理模式来统一处理有界和无界的数据集,对于无界数据是将数据按照批次切分成微批 (有界数据集)来进行处理。Flink 通过流处理模式来统一处理不同类型的数据集。将有界数据也按照无界数据进行处理,最终将批处理和流处理统一在一套流式引擎中,而需要部署两套。
批处理和流处理
在大数据领域批处理和流式处理常常被认为是两种不同的任务。
批处理是有界数据流处理的范例。在这种模式下,你可以选择在计算结果输出之前输入整个数据集,这也就意味着你可以对整个数据集的数据进行排序、统计或汇总计算后再输出结果。假设数据处理产线有多个处理操作,批处理需要将所有数据处理完成之后才会进入下一个操作。如图所示,这100条数据经过处理A处理之后,才会将处理结果输入到下一个处理B,如果A没有处理完毕,那么B就只能等待。
流处理正相反,其涉及无界数据流。至少理论上来说,它的数据输入永远不会结束,因此程序必须持续不断地对到达的数据进行处理。如图所示,数据A经过处理B处理完毕之后,就可以放到下一环节被处理C处理,此时新的数据数据B不会闲下来,又处理新来的数据B了,也就是说处理B和处理C可以同时加工不同的数据,处理完就把数据往下扔,然后接着处理上一环节的数据。
注意:并不是说无界数据就一定要流式处理,也不一定有界数据就一定批式处理。我们前面说过了有界数据和无界数据其实是可以相互转换的,如果我们想要批量处理我们就将其转变为有界数据,如果我们想要流式处理我们就将其转变为无界数据就好了。
应用场景
1. 批处理的应用场景
批处理通常用于处理大量的历史数据,例如,企业的销售数据、财务数据等。批处理可以帮助企业进行数据分析、数据挖掘、预测分析等工作,从而帮助企业做出更好的决策。
2. 流处理的应用场景
流处理通常用于处理实时数据,例如,股票行情、网络流量、传感器数据等。流处理可以帮助企业进行实时监控、实时预警、实时决策等工作,从而帮助企业更好地应对突发事件和变化。