1 Flink的介绍

1.1 Apache Flink 简介

1.1.1 Apache Flink是什么

引擎框架 ,可以在 无边界和有边界数据流中进行 有状态的计算。在实时处理上,它提供对 事件的支持,解决了实时领域和传统的服务端开发领域 消息无序问题,而且Flink还 提供了Exactly Once语义的支持,保证了实时数据处理的正确性。 在部署方面Flink既可以在服务器上进行独立部署(Standalone模式),也可以在Mesos、Kubernets、Yarn等多种资源管理器上。
(1)无界与有界数据
  Flink是一个能够处理任何类型数据流的框架,任何类型的数据都可以形成一种事件流,比如电商的购物订单,信用卡的交易记录、系统产生的日志等,这些数据都是按照时间的顺序产生并输出到指定的位置,这些数据在流计算领域中被称为数据流。数据可以分为无界数据流与有界数据流

  • 无界数据:可以定义数据的开始,无法定义数据的结尾,会无休止的产生数据,因此无界数据流必须能被持续处理,即数据被接受后需要立刻被处理。我们 无法等待所有数据都到达后再进行处理
  • 有界数据流:可以定义数据的开始,也可以定义数据的结尾,其非常适合 需要访问全部数据才能完成计算工作的数据

Flink擅长处理无界和有界(后面称它们分别流处理和批处理),并且 提供了统一的API

(2)Flink vs Spark Streaming

数据模型

  • spark 采用 RDD 模型,spark streaming 的 DStream 实际上也就是一组组小批数据 RDD 的集合(微批处理)
  • flink 基本数据模型是数据流,以及事件(Event)序列

运行时架构

  • spark 是批计算,将 DAG 划分为不同的 stage,一个完成后才可以计算下一个
  • flink 是标准的流执行模式,一个事件在一个节点处理完后可以直接发往下一个节点进行处理
1.1.2 Flink的应用场景

接下来我们讲介绍Flink所擅长的几种应用场景

(1)事件驱型应用

  1. 什么是事件驱动型应用
      它是一类具有状态的应用,从一个或多个事件流中提取数据,并根据到来的数据触发计算、状态的更新或其它外部动作。在传统的架构上, 系统的容错性依赖于定期向远程持久化存储系统写入检查点。

java flink入门教程 java flink 有什么用_hadoop

  1. 事件驱型应用的优势
      无须查询远程的事务性数据库,本地访问使它具有更高的吞吐量和更低的延迟。由于定期向远程持久化存储系统写入检查点的工作可以异步,增量式完成,因此对于正常的事件处理的影响甚微。并且它的优势不仅于此,传统分成架构下,通常多个应用会共享同一个数据库,因而对任何数据的修改都要谨慎协调;反而它由于只要考虑自身数据,因此在应用更新或服务扩容的协调工作将大大减少。
  2. Flink如何支持事件驱型应用
      事件驱型应用会受限于底层流处理系统对时间的把控能力,而Flink的诸多优秀特性都围绕这方面来设计的,它提供一系列丰富的状态操作原语,还支持事件事件和自由度极高的定制化窗口逻辑。
      Flink中针对事件驱型应用的 最关键特性当属保存点机制

(2)数据管道型应用

  1. 什么是数据管道型应用
    提取——转换——加载(ETL)是一种在存储系统之间进行数据转换和迁移的常用方法。ETL作业通常会周期性触发,将数据从事务性数据库复制到分析型数据库或数据仓库中。
    数据管道和ETL作业的用途相似,都可以转换和加载数据,并将其从某个存储系统移动到另一个。但数据管道是以持续流处理模式运行的,而非周期性触发。因此它支持一个不断生成数据的源头读取记录,并将它们以极低的延迟发送到终点。
  2. java flink入门教程 java flink 有什么用_flink_02

  3. 数据管道型应用的优势
    和周期性ETL作业相比,持续数据管道可以明显降低将数据移动到目的端的延迟。
  4. Flink如何支持数据管道型应用
    常见的转换操作可以利用Flink的SQL接口(或Table API)及用户定义的函数实现。如有更高级的需求,可选择更通用的DataStream API来实现,并且为多种数据存储系统(如Kafka、ElasticSearch、JDBC数据库系统等)内置了连接器的实现。

1.2 Flink组件

1.2.1 分层API

java flink入门教程 java flink 有什么用_数据_03

  • Stateful Stream Processing:最底层的API,仅对开发则提供一个有状态的数据流,但是ProcessFunction是Flink提供的最具有表达力的函数接口,该接口提供对事件和状态的细粒度控制。
  • DataStream/DataSet API:在实际开发中,大多数处理并不需要上述的底层抽象API,而实针对Core API( 无界:DataStream,有界DataSet API)进行编程,它提供了对数据流/集进行各种形式的转换,连接、聚合操作。
  • Table API:它与之前的API相比表达式更差,使用上却更简捷(编写的代码更少)。开发者可以在Table API 和DataStream/DataSet API之间无缝切换,程序可以混用它们。
  • SQL:Flink提供的最高级抽象,在语义和表达方面与Table API 类似,但是它将流/批处理表示为SQL查询表达式。
1.2.2 作业管理器、任务管理器、客户端

java flink入门教程 java flink 有什么用_flink_04


java flink入门教程 java flink 有什么用_flink_05

作业管理器(JobManager)

  • 控制一个应用程序执行的主进程,也就是说,每个应用程序都会被一个不同的JobManager 所控制执行。
  • JobManager 会先接收到要执行的应用程序,这个应用程序会包括:作业图(JobGraph)、逻辑数据流图(logical dataflow graph)和打包了所有的类、库和其它资源的JAR包。
  • JobManager 会把JobGraph转换成一个物理层面的数据流图,这个图被叫做“执行图”(ExecutionGraph),包含了所有可以并发执行的任务。
  • JobManager 会向资源管理器(ResourceManager)请求执行任务必要的资源,也就是任务管理器(TaskManager)上的插槽(slot)。一旦它获取到了足够的资源,就会将执行图分发到真正运行它们的TaskManager上。而在运行过程中,JobManager会负责所有需要中央协调的操作,比如说检查点(checkpoints)的协调。

任务管理器(TaskManager)

  • Flink中的工作进程。通常在Flink中会有多个TaskManager运行,每一个TaskManager都包含了一定数量的插槽(slots)。插槽的数量限制
    了TaskManager能够执行的任务数量。
  • 启动之后,TaskManager会向资源管理器注册它的插槽;收到资源管理器的指令后,TaskManager就会将一个或者多个插槽提供给
    JobManager调用。JobManager就可以向插槽分配任务(tasks)来执行了。
  • 在执行过程中,一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。

资源管理器(ResourceManager)

  • 主要负责管理任务管理器(TaskManager)的插槽(slot),TaskManger 插槽是Flink中定义的处理资源单元。
  • Flink为不同的环境和资源管理工具提供了不同资源管理器,比如YARN、Mesos、K8s,以及standalone部署。
  • 当JobManager申请插槽资源时,ResourceManager会将有空闲插槽的TaskManager分配给JobManager。如果ResourceManager没有足够的插槽来满足JobManager的请求,它还可以向资源提供平台发起会话,以提供启动TaskManager进程的容器。

分发器(Dispatcher)

  • 可以跨作业运行,它为应用提交提供了REST接口。
  • 当一个应用被提交执行时,分发器就会启动并将应用移交给一个JobManager。 • Dispatcher也会启动一个Web UI,用来方便地展示和监控作业执行的信息。
  • Dispatcher在架构中可能并不是必需的,这取决于应用提交运行的方式
1.2.3 任务提交流程

java flink入门教程 java flink 有什么用_flink_06


任务提交流程(YARN)

java flink入门教程 java flink 有什么用_java flink入门教程_07