Apache Flink快速入门-基本架构、核心概念和运行流程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Apache Flink快速入门-基本架构、核心概念和运行流程相关的知识,希望对你有一定的参考价值。

参考技术A

Flink是一个基于流计算的分布式引擎,以前的名字叫stratosphere,从2010年开始在德国一所大学里发起,也是有好几年的 历史 了,2014年来借鉴了社区其它一些项目的理念,快速发展并且进入了Apache顶级孵化器,后来更名为Flink。

Flink在德语中是快速和灵敏的意思 ,用来体现流式数据处理速度快和灵活性强等特点。

Flink提供了同时支持高吞吐、低延迟和exactly-once 语义的实时计算能力,另外Flink 还提供了基于流式计算引擎处理批量数据的计算能力,真正意义上实现了流批统一。

Flink 独立于Apache Hadoop,且能在没有任何 Hadoop 依赖的情况下运行。

但是,Flink 可以很好的集成很多 Hadoop 组件,例如 HDFS、YARN 或 HBase。 当与这些组件一起运行时,Flink 可以从 HDFS 读取数据,或写入结果和检查点(checkpoint)/快照(snapshot)数据到 HDFS 。 Flink 还可以通过 YARN 轻松部署,并与 YARN 和 HDFS Kerberos 安全模块集成。

Flink具有先进的架构理念、诸多的优秀特性,以及完善的编程接口。

Flink的具体优势有如下几点:

(1)同时支持高吞吐、低延迟、高性能;

(2)支持事件时间(Event Time)概念;

事件时间的语义使流计算的结果更加精确,尤其在事件到达无序或者延迟的情况下,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。

(3)支持有状态计算;

所谓状态就是在流计算过程中,将算子的中间结果数据保存在内存或者文件系统中,等下一个事件进入算子后,可以从之前的状态中获取中间结果,计算当前的结果,从而无需每次都基于全部的原始数据来统计结果。

(4)支持高度灵活的窗口(Window)操作;

(5)基于轻量级分布式快照(Snapshot)实现的容错;

(6)基于JVM实现独立的内存管理;

(7)Save Points(保存点);

保存点是手动触发的,触发时会将它写入状态后端(State Backends)。Savepoints的实现也是依赖Checkpoint的机制。Flink 程序在执行中会周期性的在worker 节点上进行快照并生成Checkpoint。因为任务恢复的时候只需要最后一个完成的Checkpoint的,所以旧有的Checkpoint会在新的Checkpoint完成时被丢弃。Savepoints和周期性的Checkpoint非常的类似,只是有两个重要的不同。一个是由用户触发,而且不会随着新的Checkpoint生成而被丢弃。

在Flink整个软件架构体系中,统一遵循了分层的架构设计理念,在降低系统耦合度的同时,为上层用户构建Flink应用提供了丰富且友好的接口。

整个Flink的架构体系可以分为三层:

Deployment层: 该层主要涉及了Flink的部署模式,Flink支持多种部署模式:本地、集群(Standalone/YARN),云(GCE/EC2),Kubernetes等。

Runtime层:Runtime层提供了支持Flink计算的全部核心实现,比如:支持分布式Stream处理、JobGraph到ExecutionGraph的映射、调度等等,为上层API层提供基础服务。

API层: 主要实现了面向无界Stream的流处理和面向Batch的批处理API,其中面向流处理对应DataStream API,面向批处理对应DataSet API。

Libraries层:该层也可以称为Flink应用框架层,根据API层的划分,在API层之上构建的满足特定应用的计算框架,也分别对应于面向流处理和面向批处理两类。

核心概念:Job Managers,Task Managers,Clients

Flink也是典型的master-slave分布式架构。Flink的运行时,由两种类型的进程组成:

Client: Client不是运行时和程序执行的一部分,它是用来准备和提交数据流到JobManagers。之后,可以断开连接或者保持连接以获取任务的状态信息。

当 Flink 集群启动后,首先会启动一个 JobManger 和一个或多个的 TaskManager。由 Client 提交任务给 JobManager, JobManager 再调度任务到各个 TaskManager 去执行,然后 TaskManager 将心跳和统计信息汇报给 JobManager。 TaskManager 之间以流的形式进行数据的传输。上述三者均为独立的 JVM 进程。

每个Worker(Task Manager)是一个JVM进程,通常会在单独的线程里执行一个或者多个子任务。为了控制一个Worker能够接受多少个任务,会在Worker上抽象多个Task Slot (至少一个)。

只有一个slot的TaskManager意味着每个任务组运行在一个单独JVM中。 在拥有多个slot的TaskManager上,subtask共用JVM,可以共用TCP连接和心跳消息,同时可以共用一些数据集和数据结构,从而减小任务的开销。

Flink的任务运行其实是多线程的方式,这和MapReduce多JVM进程的方式有很大的区别,Flink能够极大提高CPU使用效率,在多个任务之间通过TaskSlot方式共享系统资源,每个TaskManager中通过管理多个TaskSlot资源池对资源进行有效管理。

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

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 能够通过该层支持不同平台的部署,用户可以根据需要选择使用对应的部署模式。

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

以上是关于Apache Flink快速入门-基本架构、核心概念和运行流程的主要内容,如果未能解决你的问题,请参考以下文章

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

spark基本概念及入门

Apache Flink 零基础入门:基础概念解析

大数据Flink进阶:Apache Flink架构介绍

flink二三事:起家的技术

Flume入门 | 基本概念及架构说明