大数据Flink学习系列文章(快学)---02 Flink基本概念及架构

2020-06-27 00:00:00 数据 用户 时间 状态 计算

Flink笔记02--Flink基本概念及架构

1、基本概念

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

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


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

State。状态是计算过程中的数据信息,在容错恢复和 Checkpoint 中有重要的作用,流计算在本质上是 Incremental Processing,因此需要不断查询保持状态;另外,为了确保 Exactly- once 语义,需要数据能够写入到状态中;而持久化存储,能够保证在整个分布式系统运行失败或者挂掉的情况下做到 Exactly- once,这是状态的另外一个价值。

应用状态是 Flink 中的一等公民,Flink 提供了许多状态管理相关的特性支持,其中包括:

  • 多种状态基础类型:提供多种状态基础类型,例原子值(value),列表(list)以及映射(map);
  • 插件化的State Backend: State Backend 负责管理应用程序状态,并在需要的时候进行 checkpoint。Flink 支持多种 state backend,可将状态保存在 内存 或 Rocks DB,以及自定义 state backend 进行状态存储。
  • 一次语义:Flink 的 checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性。Flink 能够在应用程序发生故障时,对应用程序透明,不造成正确性的影响。
  • 超大数据量状态:Flink 能够利用其异步以及增量式的 checkpoint 算法,存储数 TB 级别的应用状态。
  • 可弹性伸缩的应用:Flink 能够通过在更多或更少的工作节点上对状态进行重新分布,支持有状态应用的分布式的横向伸缩。

时间是流处理应用另一个重要的组成部分。因为事件总是在特定时间点发生,所以大多数的事件流都拥有事件本身所固有的时间语义。进一步而言,许多常见的流计算都基于时间语义,例如窗口聚合、会话计算、模式检测和基于时间的 join。流处理的一个重要方面是应用程序如何衡量时间,即区分事件时间(event-time)和处理时间(processing-time)。

Flink 提供了丰富的时间语义支持。分为 Event time、Ingestion time、Processing time,Flink 的无限数据流是一个持续的过程,时间是判断业务状态是否滞后,数据处理是否及时的重要依据。

API。Flink将数据处理接口抽象成四层:

  • SQL API:SQL语言的学习成本低,能够让数据分析人员和开发人员快速上手,帮助其更加专注业务本身而不受限于复杂的编程接口,可以通过SQL API完成对批计算和流计算的处理;
  • Table API:将内存中 DataStream 和 DataSet 在原有的基础上增加Schema信息,将数据类型统一抽象成表结构,然后通过Table API提供的接口处理对应的数据集;
  • DataStream/DataSet API:主要面向具有开发经验的用户,用户可以根据API处理无界流数据和批量数据;
  • Stateful Stream Processing:是Flink中底层的开发接口,可以使用接口中操作状态、时间等底层数据,可以实现非常复杂的流式计算逻辑。

API越接近 SQL 层,表达能力会逐步减弱,抽象能力会增强。反之越接近底层,API 的表达能力越强,可以进行多种灵活方便的操作,但抽象能力也相对越小。


2、架构

了解一个系统,基本都是从架构开始。系统由哪些组件组成,安装时各节点需要启动哪些服务,各个服务之间如何交互协调,这些都是首先需要了解的。Flink系统的架构与Spark类似,也是基于Master-Slave风格的架构,如下图所示:

Flink集群启动时,会启动一个JobManager进程、至少一个TaskManager进程

JobManager

  • Flink系统的协调者,负责接受 Job ,调度组成Job的多个Task的执行
  • 收集Job的状态信息,并管理Flink集群中从节点 TaskManager

TaskManager

  • 负责执行计算的Worker,在其上执行Flink Job的一组Task
  • TaskManager负责管理其所在节点上的资源信息,如内存、磁盘、网络,在启动的时候将资源的状态向 JobManager 汇报

Client

  • 用户提交一个Flink程序时,会首先创建一个Client。Client首先会对提交的Flink程序进行预处理,并提交到Flink集群
  • Client会将用户提交的Flink程序组装JobGraph,终以JobGraph的形式提交

3、Flink组件栈

Flink 同样遵循着分层的架构设计理念,在降低系统耦合的同时,也为上层用户构建 Flink 应用提供了丰富且友好的接口。

Flink 分层架构,从上到下依次是:API & Libraries 层、Runtime 核心层 和 物理部署层。

API & Libraries 层Flink 同时提供流计算和批计算的接口,并在此基础上抽象出不同的应用类型的组件库。如基于流处理的 CEP (复杂事件处理库),SQL & TABLE 库 和 基于批处理的机器学习库(FlinkML)、图处理库(Gelly)。

API 层包括构建流计算应用的 DataStream API 和批计算应用的 DataSet API,两者都是提供给用户丰富的数据处理 API,例如 Map,FlatMap 等。同时也提供比较低级的 Process Function API ,用户可以直接操作状态和时间等底层数据。

Runtime 核心层该层负责为上层接口提供基础服务,也是 Flink 分布式计算框架的核心实现层。支持分布式 Stream 作业的执行、JobGraph 到 ExecutionGraph 的映射转换、任务调度等。将 DataStream 和 DataSet 转成统一的可执行的 Task Operator,达到在流式引擎下同时处理批量计算和流式计算的目的。

物理部署层该层主要涉及 Flink 的部署模式,目前 Flink 支持多种部署模式:本地、集群(Standalone / YARN)、云(GCE / EC2)、kubenetes。Flink 能够通过该层支持不同平台的部署,用户可以根据需要选择使用对应的部署模式。

我会不间断的更新,维护,希望可以对正在找大数据工作的朋友们有所帮助.

相关文章