一.特点

(一)同时支持高吞吐、低延迟、高性能
Flink 是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式 流式数据处理框架。像 Apache Spark 也只能兼顾高吞吐和高性能特性,主要因为在 Spark Streaming 流式计算中无法做到低延迟保障;而流式计算框架 Apache Storm 只 能支持低延迟和高性能特性,但是无法满足高吞吐的要求。而满足高吞吐、低延迟、高 性能这三个目标对分布式流式计算框架来说是非常重要的。

(二)支持事件时间(Event Time)概念
在流式计算领域中,窗口计算的地位举足轻重,但目前大多数框架窗口计算采用的都是系统时间(Process Time),也是事件传输到计算框架处理时,系统主机的当前时 间。Flink 能够支持基于事件时间(Event Time)语义进行窗口计算,也就是使用事件 产生的时间,这种基于事件驱动的机制使得事件即使乱序到达,流系统也能够计算出精 确的结果,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。

(三)支持有状态计算
Flink 在 1.4 版本中实现了状态管理,所谓状态就是在流式计算过程中将算子的中 间结果数据保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中 获取中间结果中计算当前的结果,从而无须每次都基于全部的原始数据来统计结果,这 种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗。对于数据量大且 运算逻辑非常复杂的流式计算场景,有状态计算发挥了非常重要的作用。

(四)支持高度灵活的窗口(Window)操作
在流处理应用中,数据是连续不断的,需要通过窗口的方式对流数据进行一定范围 的聚合计算,例如统计在过去的 1 分钟内有多少用户点击某一网页,在这种情况下,我 们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行再计 算。Flink 将窗口划分为基于 Time、Count、Session,以及 Data-driven 等类型的窗口 操作,窗口可以用灵活的触发条件定制化来达到对复杂的流传输模式的支持,用户可以 定义不同的窗口触发机制来满足不同的需求。

(五)基于轻量级分布式快照(CheckPoint)实现的容错
Flink 能够分布式运行在上千个节点上,将一个大型计算任务的流程拆解成小的计 算过程,然后将 tesk 分布到并行节点上进行处理。在任务执行过程中,能够自动发现 事件处理过程中的错误而导致数据不一致的问题,比如:节点宕机、网路传输问题,或 是由于用户因为升级或修复问题而导致计算服务重启等。在这些情况下,通过基于分布 式快照技术的 Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现 异常停止,Flink 就能够从 Checkpoints 中进行任务的自动恢复,以确保数据在处理过 程中的一致性(Exactly-Once)。

(六)基于 JVM 实现独立的内存管理
内存管理是所有计算框架需要重点考虑的部分,尤其对于计算量比较大的计算场 景,数据在内存中该如何进行管理显得至关重要。针对内存管理,Flink 实现了自身管 理内存的机制,尽可能减少 JVM GC 对系统的影响。另外,Flink 通过序列化/反序列化 方法将所有的数据对象转换成二进制在内存中存储,降低数据存储的大小的同时,能够 更加有效地对内存空间进行利用,降低 GC 带来的性能下降或任务异常的风险,因此 Flink 较其他分布式处理的框架会显得更加稳定,不会因为 JVM GC 等问题而影响整个 应用的运行。

(七)Save Points(保存点)
对于 7*24 小时运行的流式应用,数据源源不断地接入,在一段时间内应用的终止 有可能导致数据的丢失或者计算结果的不准确,例如进行集群版本的升级、停机运维操 作等操作。值得一提的是,Flink 通过 Save Points 技术将任务执行的快照保存在存储 介质上,当任务重启的时候可以直接从事先保存的 Save Points 恢复原有的计算状态, 使得任务继续按照停机之前的状态运行,Save Points 技术可以让用户更好地管理和运 维实时流式应用。

二.优势

Storm 是比较早的流式计算框架,后来又出现了 Spark Streaming 和 Trident,现在又出现了 Flink 这种优秀的实时计算框架,那么这几种计算框架到底有什么区别呢?
Flink 的特点和优势_flink

  1. 模型:Storm 和 Flink 是真正的一条一条处理数据;而 Trident(Storm 的封装框架) 和 Spark Streaming 其实都是小批处理,一次处理一批数据(小批量)。
  2. API:Storm 和 Trident 都使用基础 API 进行开发,比如实现一个简单的 sum 求和操作; 而 Spark Streaming 和 Flink 中都提供封装后的高阶函数,可以直接拿来使用,这样就 比较方便了。
  3. 保证次数:在数据处理方面,Storm 可以实现至少处理一次,但不能保证仅处理一次, 这样就会导致数据重复处理问题,所以针对计数类的需求,可能会产生一些误差; Trident 通过事务可以保证对数据实现仅一次的处理,Spark Streaming 和 Flink 也是 如此。
  4. 容错机制:Storm和Trident可以通过ACK机制实现数据的容错机制,而Spark Streaming 和 Flink 可以通过 CheckPoint 机制实现容错机制。
  5. 状态管理:Storm 中没有实现状态管理,Spark Streaming 实现了基于 DStream 的状态 管理,而 Trident 和 Flink 实现了基于操作的状态管理。
  6. 延时:表示数据处理的延时情况,因此 Storm 和 Flink 接收到一条数据就处理一条数据, 其数据处理的延时性是很低的;而 Trident 和 Spark Streaming 都是小型批处理,它们 数据处理的延时性相对会偏高。
  7. 吞吐量:Storm 的吞吐量其实也不低,只是相对于其他几个框架而言较低;Trident 属 于中等;而 Spark Streaming 和 Flink 的吞吐量是比较高的。
    Flink 的特点和优势_数据_02