目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟。以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象。那么,今天就来聊一聊基于Kafka的实时计算引擎如何选择?Flink or Spark?
2.为何需要实时计算?根据IBM的统计报告显示,过去两年内,当今世界上90%的数据产生源于新设备、传感器以及技术的出现,数据增长率也会为此加速。而从技术上将,这意味着大数据领域,处理这些数据将变得更加复杂和具有挑战性。例如移动应用广告、欺诈检测、出租车预订、患者监控等场景处理时,需要对实时数据进行实时处理,以便做出快速可行的决策。
目前业界有开源不少实时计算引擎,以Apache基金会的两款开源实时计算引擎最受欢迎,它们分别是Apache Flink和Apache Spark。接下来,我们来聊一聊它们的使用场景、优势、局限性、相似性、以及差异性。方便大家在做技术选型时,选择切合项目场景的实时计算引擎。
2.1 如何理解流式与实时?说起实时计算,可能会说到流式计算,那么流式和实时是否是等价的呢?严格意义上讲,它们没有必然的联系。实时计算代表的是处理数据耗时情况,而流式计算代表的是处理数据的一种方式。
2.2 什么是流式处理?首先,它是一种数据处理引擎,其设计时考虑了无边界的数据集。其次,它与批处理不同,批处理的Job与数据的起点和终点有关系,并且Job在处理完有限数据后结束,而流式处理用于处理连续数天、数月、数年、或是永久实时的无界数据。
流处理的特点:
容错性:如果节点出现故障,流式处理系统应该能够恢复,并且应该从它离开的位置再次开始处理;
状态管理:在有状态处理要求的情况下,流式处理系统应该能够提供一些机制来保存和更新状态信息;
性能:延时应尽可能的小,吞吐量应尽可能的大;
高级功能:事件时间处理,窗口等功能,这些均是流式处理在处理复杂需求时所需要的功能;
2.3 什么时候适合流式处理?流式处理可以分析连续的数据流,在这种方式中,数据被视为连续流,处理引擎在很短的时间内(几毫米到几分钟)内取数、分析、以及响应。下面让我们来看看流式处理的场景使用场景:
异常检测:流式处理可以应用于连续的数据流并近乎实时的检测异常。例如,在金融交易数据中,欺诈性交易可以被视为异常,流式处理可以检测到这些,保护银行和客户免受财务损失。
业务流程监控:业务流程涉及特定域中的多个事件。例如,在电子商务业务中,从下单、支付、出库、送货、再到用户签收的所有事件都可以被视为一个业务流程。流处理可用于监控此类流程的异常情况,例如在时间范围内为完成、交付商品时出错等。
告警:流式处理可用于根据指定规则触发告警,满足特定条件,可以实时将告警发送到不同的目标。
3. SparkSpark已成为批处理中Hadoop的真正继承者,也是第一个完美支持Lambda架构的框架。Spark受欢迎度极高,成熟并且广泛使用。Spark免费提供Spark Streaming,它使用微批处理进行流式传输。在Spark2.0之后,添加了许多优秀的功能(例如对tungsten、watermarks、event time处理的支持),同时结构化流也更加抽象,截止本篇博客Spark发布的可用版本为2.4.3,可以在最新版本中在微批处理和连续流模式之间进行切换。
3.1 微批处理 & 连续流处理结构化流式传输默认采用微批处理执行,Spark流式计算引擎会定时检查流数据。在连续流处理中,Spark不会启动定时任务,而是启动一组长时间运行的任务,这些任务可以连续读取、处理、写入数据。
微批处理中,驱动程序通过将记录Offset保存到预写Log来检测进度,然后可以使用该Log重新进行查询。需要注意的是,在微批处理处理开始之前,需要在下一个微批处理中处理的范围Offset保存到Log中,以便获取确定性的重新执行和端到端语义。因此,源记录可能需要等待当前的微批处理处理完成,然后记录其Offset。