一. Flink是什么?

1. Flink的定义

Apache Flink is a framework and distributed processing engine for stateful computations overunbounded and boundeddata streams. Flink has been designed to runinallcommon cluster environments, perform computations atin-memory speedandatany scale.
Apache Flink 是一个框架和分布式处理引擎,用于在无边界有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。

2. 有界流和无界流

任何类型的数据都可以形成一种事件流。信用卡交易、传感器测量、机器日志、网站或 移动应用程序上的用户交互记录,所有这些数据都形成一种流。

  1. 无界流: **有定义流的开始,但没有定义流的结束。**它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理, 因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事 件,例如事件发生的顺序,以便能够推断结果的完整性。
  2. 有界流: **有定义流的开始,也有定义流的结束。**有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理

Apache Flink 擅长处理无界和有界数据集 精确的时间控制和状态化使得 Flink 的运 行时(runtime)能够运行任何处理无界流的应用。 有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。

3. 有状态的计算架构

数据产生的本质,其实是一条条真实存在的事件按照时间顺序源源不断的产生,我们很 难在数据产生的过程中进行计算并直接产生统计结果,因为这不仅对系统有非常高的要求, 还必须要满足高性能、高吞吐、低延时等众多目标。而有状态流计算架构(如图所示)的提 出,从一定程度上满足了企业的这种需求,企业基于实时的流式数据,维护所有计算过程的 状态,所谓状态就是计算过程中产生的中间计算结果,每次计算新的数据进入到流式系统中 都是基于中间状态结果的基础上进行运算,最终产生正确的统计结果。基于有状态计算的方 式最大的优势是不需要将原始数据重新从外部存储中拿出来,从而进行全量计算,因为这种 计算方式的代价可能是非常高的。从另一个角度讲,用户无须通过调度和协调各种批量计算 工具,从数据仓库中获取数据统计结果,然后再落地存储,这些操作全部都可以基于流式计 算完成,可以极大地减轻系统对其他框架的依赖,减少数据计算过程中的时间损耗以及硬件
存储。

二. Flink的特点和优势

1. Flink 的具体优势和特点有以下几点
  1. 同时支持高吞吐、低延迟、高性能
    Flink 是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式 流式数据处理框架。 像 Apache Spark 也只能兼顾高吞吐和高性能特性,主要因为在 Spark Streaming 流式计算中无法做到低延迟保障;而流式计算框架 Apache Storm 只 能支持低延迟和高性能特性,但是无法满足高吞吐的要求。而满足高吞吐、低延迟、高性能这三个目标对分布式流式计算框架来说是非常重要的。
  2. 支持事件时间(Event Time)概念
    目前大多数框架窗口计算采用的都是系统时间(Process Time),也是事件传输到计算框架处理时,系统主机的当前时 间。Flink 能够支持基于事件时间(Event Time)语义进行窗口计算,也就是使用事件 产生的时间,这种基于事件驱动的机制使得事件即使乱序到达,流系统也能够计算出精确的结果,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。
  3. 支持有状态计算
    所谓状态就是在流式计算过程中将算子的中 间结果数据保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中 获取中间结果中计算当前的结果,从而无须每次都基于全部的原始数据来统计结果,这种方式极大地提升了系统的性能,并降低了数据计算过程的资源消耗。
  4. 支持高度灵活的窗口(Window)操作
    Flink 将窗口划分为基于 Time、Count、Session,以及 Data-driven 等类型的窗口 操作,窗口可以用灵活的触发条件定制化来达到对复杂的流传输模式的支持,用户可以定义不同的窗口触发机制来满足不同的需求。
  5. 基于轻量级分布式快照(CheckPoint)实现的容错
    通过基于分布 式快照技术的 Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现 异常停止,Flink 就能够从 Checkpoints 中进行任务的自动恢复,以确保数据在处理过程中的一致性(Exactly-Once)
  6. 基于 JVM 实现独立的内存管理
    Flink 实现了自身管 理内存的机制,尽可能减少 JVM GC 对系统的影响。另外,Flink 通过序列化/反序列化 方法将所有的数据对象转换成二进制在内存中存储,降低数据存储的大小的同时,能够 更加有效地对内存空间进行利用,降低 GC 带来的性能下降或任务异常的风险,因此 Flink 较其他分布式处理的框架会显得更加稳定,不会因为 JVM GC 等问题而影响整个应用的运行。
  7. Save Points(保存点)
    Flink 通过 Save Points 技术将任务执行的快照保存在存储 介质上,当任务重启的时候可以直接从事先保存的 Save Points 恢复原有的计算状态, 使得任务继续按照停机之前的状态运行,Save Points 技术可以让用户更好地管理和运维实时流式应用。
2. 流式计算框架的对比

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

三. Flink 整体结构

从下至上:

  1. 部署:Flink 支持本地运行、能在独立集群或者在被 YARN 或 Mesos 管理的集群上运行, 也能部署在云上。
  2. 运行:Flink 的核心是分布式流式数据引擎,意味着数据以一次一个事件的形式被处理。
  3. API:DataStream、DataSet、Table、SQL API。
  4. 扩展库:Flink 还包括用于复杂事件处理,机器学习,图形处理和 Apache Storm 兼容性的专用代码库。

四. Flink 数据流编程模型

  1. 最底层提供了有状态流。它将通过 过程函数(Process Function)嵌入到 DataStream API 中。它允许用户可以自由地处理来自一个或多个流数据的事件,并使用一致、容错的状态。除此之外,用户可以注册事件时间和处理事件回调,从而使程序可以实现复杂的计算。
  2. DataStream / DataSet API 是 Flink 提供的核心 API ,DataSet 处理有界的数据集,DataStream 处理有界或者无界的数据流。用户可以通过各种方法(map / flatmap / window / keyby / sum / max / min / avg / join 等)将数据进行转换 / 计算。
  3. Table API 是以 表 为中心的声明式 DSL,其中表可能会动态变化(在表达流数据时)。Table API 提供了例如 select、project、join、group-by、aggregate 等操作,使用起来却更加简洁(代码量更少)。
    你可以在表与 DataStream/DataSet 之间无缝切换,也允许程序将 Table API 与 DataStream 以及 DataSet 混合使用。
  4. Flink 提供的最高层级的抽象是 SQL 。这一层抽象在语法与表达能力上与 Table API 类似,但是是以 SQL查询表达式的形式表现程序。SQL 抽象与 Table API 交互密切,同时 SQL 查询可以直接在 Table API 定义的表上执行。

本文参考了尚学堂Flink教案
本文参考了http://www.54tianzhisheng.cn/2018/10/13/flink-introduction/

本文地址:https://blog.csdn.net/bingque6535/article/details/107195001