至少在数据工程领域,这是一个由来已久的争论:到底是对实时数据进行批处理还是流处理。
收集分析型数据主要有两种方法:批处理与流处理。从根本上说,批处理在一段时间内收集数据,然后将大量数据“批处理”在离散的数据包中。而流处理是一个较长的过程,但几乎可以立即处理数据。
直到20世纪10年代中期,批处理都是处理分析型数据最常用的方法。批处理比流处理要便宜得多,即使是对时间要求最苛刻的处理需求也足以满足。而随着各行各业的公司越来越依赖实时数据,Apache Kafka和Amazon Kinesis等技术让流数据相对以前来说更易于大规模访问,价格也更实惠。
批处理是经过时间考验的标准,并且仍然是公司接收大量数据最为流行且常见的方式。但当组织想要获得实时的洞察时,批处理就显得力不从心了。
这就是流处理可以填补空白的地方。实时访问数据将改变游戏规则,这也为依赖数据而不断更新的产品和服务带来了更高的投资回报。
我们可以用信用卡处理的小例子来对比一下批处理与流处理的不同。在供应商一侧,处理付款可能需要几小时甚至几天时间,这通常是批处理的操作。例如,你可能周一时在当地精品店购买了一条新围巾,但该费用直到周三晚上才完成结算。在信用卡提供商一侧,一旦交易被授权,就可以立即识别潜在的欺诈性交易,并向信用卡持有人发出警报。但如果关于这些交易的数据不准确且不是最新的(也就是在使用批处理的情况下),欺诈检测可能就会被延迟或完全错过。
Apache Hadoop是用于分布式存储和处理大型数据集的最流行的开源批处理框架之一。Hadoop通过将文件拆分为更小的数据包,然后将这些更易于管理的数据块分布在集群中的节点上来运行。Hadoop的托管替代品包括Google BigQuery、Snowflake(如第2章所述)、Microsoft Azure和Amazon Redshift。
流处理的一个简单示例是实时拼车应用程序的请求。例如,当有人通过Uber或Lyft应用程序叫车时,乘客和空闲的司机会实时(或者更确切地说,在有空闲的司机时)进行连接。使用实时流数据,这些拼车应用程序可以将实时位置、价格和司机数据拼凑在一起,从而立即将用户与行程联系起来。
对于流处理来说,一些最常见的开源技术包括来自Apache的解决方案,例如Spark、Kafka、Flink、Storm、Samza和Flume。虽然有许多可用的解决方案,但使用最广泛的还是Apache Spark和Apache Kafka。Apache Spark采用微批处理方法,将传入的流拆分成更小的数据包;Apache Kafka以近乎实时的方式分析事件。它们的托管替代方案包括Databricks、Cloudera和Azure。关于更多信息,我们建议你阅读 Streaming Systems:The What,Where,When,and How of Large-Scale Data Processing (O'Reilly)一书,该书详细地介绍了这些方法、技术和用例。