什么是流处理?
流处理是一种大数据处理技术,用于处理连续数据流,并能在收到数据短时间内快速检测出异常条件,检测时间从几毫秒到几分钟不等。例如,通过流处理查询来自温度传感器的数据流,您可以在温度达到凝固点时收到报警。流处理还有许多其他叫法:实时分析、流分析、复杂事件处理、实时流分析和事件处理。尽管某些术语历史上存在差异,但现在工具(框架)已经在流处理术语下趋于一致。
Apache Storm作为一种“跟Hadoop相似但能更快出结果”的技术将流处理普及,之后Storm被作为一种大数据技术而被广泛应用,而当下这一领域出现了很多竞争者。
为什么需要流处理?
大数据技术就是处理海量数据并获取其中的价值,但这些价值并非完全一样。一些数据在发生后不久更有价值并随着时间推移其价值迅速下降。流处理支持这样的场景,提供更快的有价值信息,通常在从触发器开始的几毫秒到几秒内。流处理作为一种类似Hadoop的技术被引入和推广,但它可以更快地为您提供结果。
下面是使用流处理的一些其他原因:
有些数据天然地作为无止尽事件流出现。如果进行批处理,需要先存储起来,在某个时间点停止收集来处理这些数据,然后您需要执行下一个批处理并考虑跨多个批次进行聚合。相比之下,流式处理能自然优雅地处理无止尽数据流,您可以检测模式、检查结果、多级别聚焦观察、还可以轻松地同时观察来自多个数据流。流处理天然地适合时间序列数据和随时间变化的模式检测。例如,如果您试图检测无止尽流中Web会话的长度则很难用批处理来检测,因为某些会话将被分割到两个不同的批处理中。流处理可以很容易地处理这种问题。你退一步想想,最连续的数据序列就是时间序列数据。举个例子,几乎所有的物联网数据都是时间序列数据,因此使用合理的编程模型是非常有意义的。批处理需要准备数据并尝试一次性处理这些数据,而流处理则在数据到来时处理它们,并随着时间推移连续地进行处理。所以流处理可以比批处理少用很多硬件,而且流处理还可以通过甩负载实现近似查询处理,所以流处理天然地适合那些近似结果就能满足需求的场景。有时候因数据太大导致无法存储。流处理能让你处理大数据并只保留有用的数据。最后,有很多有用的流数据(例如客户交易、活动、网站访问),并且流数据随着物联网(IoT)各种传感器的广泛应用会更快地增长。然而流处理并不适用于所有业务场景。一个有效的判断经验是,如果需要在完整的数据集上处理多次或者随机访问(比如图形数据集),那么流处理就很难处理。流处理中一个比较大的缺失场景就是基于模型训练的机器学习算法。另一方面,如果处理可以通过一次数据传递完成或者具有时间局部性(倾向于只访问最近数据),那么流式处理就非常适合。
如何进行流处理?
如果您计划构建一个处理流数据并进行实时决策的应用程序,您可以使用工具,也可以自己构建它。答案取决于您计划处理问题的复杂度、希望具备的扩展能力、需要的可靠性和容错性等。
如果您想自己构建应用程序,可以将事件放在消息中间件中(例如ActiveMQ、RabbitMQ、 Kafka),编写代码从消息中间件中接收事件(成为您的流),然后将结果写回到消息中间件中。这样的代码我们称为Actor。
然而您也可以使用流处理器来节省开发时间而不是像上述场景那样从头开始。事件流处理器允许您为每个Actor编写逻辑,将Actor连接起来,并通过边(edges)将数据源连接起来。您可以直接将事件发送到流处理器,也可以通过消息中间件发送这些事件。
事件处理器将完成收集数据、将数据传递给每个Actor、确保它们正确的运行顺序、收集计算结果、在负载较高时进行扩容以及处理故障等繁重工作。例如:Storm、Flink和Samza。如果你想使用这种方式构建应用程序,请查看各个框架的用户指南。
自2016年以来,出现了一种称为流式SQL的新想法。一种允许用户编写类似SQL的查询来处理流式数据的语言,我们称之为流式SQL语言。
有许多流式SQL语言正在兴起:
WSO2流处理器和SQLStreams已经支持SQL五年多了;Apache Storm在2016年增加了对流式SQL的支持;Apache Flink在2016年增加了对流式SQL的支持;Apache Kafka在2017年增加了对SQL(称为KSQL)的支持;Apache Samza在2017年增加了对SQL的支持。使用流式SQL语言,开发人员可以快速地将流式查询合并到其应用程序中。到2018年大多数流式处理器都支持通过流式SQL语言处理数据。
让我们来了解一下SQL是如何映射到流的。流可以看作是移动中的表数据,想象一个永不结束的表随着时间的推移会一直有新数据添加进来,流就是这样的表,其中的一条记录或行称为事件但都有一个模式(Schema),其行为就像数据库的行。关于流式SQL首先要了解的是它用流替代表。当编写SQL查询时,你要查询的数据保存在数据库中。然而,当你编写流式SQL查询时,你要查询的数据是当前的数据以及将来要出现的数据,因此流式SQL查询永远不会结束。大家可能会认为这是问题,其实不会,因为这些流式SQL查询结果输出也是流。一旦事件匹配某个查询,结果事件将被立即放置在输出流中。
流代表来自一个逻辑通道的所有事件,并且永远不会结束。例如,如果我们在锅炉中有个温度传感器,那我们可以将传感器的输出当作流。然而,传统的SQL查询是从数据库表中获取数据,处理并将结果写回到数据表中。相反,流式SQL查询会在数据流中的数据到来时获取它们并产生结果作为输出数据流。假设锅炉流中每十分钟产生一个事件,当事件与查询过滤器匹配时,查询过滤器将立即生产结果事件并输出到结果流中。
所以,您可以像下面这样建立自己的应用程序,通过直接发送或消息中间件发送事件到流处理器,然后,使用流式SQL语言编写应用程序的流式处理部分,最后,配置流处理器对结果执行操作,这是通过在流处理器触发时调用外部服务或通过将事件发布到消息中间件并监听来完成。
谁在使用流处理?
流处理以其能快速、高效处理海量数据能力逐渐成为大数据处理技术主流工具,下面是一些常见应用场景:
算法交易、股市监控入侵、监视及欺诈检测智能电网地理围栏、车辆及野生动物跟踪交通监控一般来说,流处理对我们检测问题并有效改进结果时效性的场景非常有用。此外,流处理在数据驱动的公司中扮演着关键角色