flink架构、原理

author author     2023-03-09     787

关键词:

参考技术A

Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。

现有的开源计算方案,会把流处理和批处理作为两种不同的应用类型,因为它们所提供的SLA(Service-Level-Aggreement)是完全不相同的:流处理一般需要支持低延迟、Exactly-once保证,而批处理需要支持高吞吐、高效处理。

Flink从另一个视角看待流处理和批处理,将二者统一起来:Flink是完全支持流处理,也就是说作为流处理看待时输入数据流是无界的; 批处理被作为一种特殊的流处理,只是它的输入数据流被定义为有界的。

Flink流处理特性:

Flink以层级式系统形式组件其软件栈,不同层的栈建立在其下层基础上,并且各层接受程序不同层的抽象形式。

1. 流、转换、操作符

Flink程序是由Stream和Transformation这两个基本构建块组成,其中Stream是一个中间结果数据,而Transformation是一个操作,它对一个或多个输入Stream进行计算处理,输出一个或多个结果Stream。

Flink程序被执行的时候,它会被映射为Streaming Dataflow。一个Streaming Dataflow是由一组Stream和Transformation Operator组成,它类似于一个DAG图,在启动的时候从一个或多个Source Operator开始,结束于一个或多个Sink Operator。

2. 并行数据流

一个Stream可以被分成多个Stream分区(Stream Partitions),一个Operator可以被分成多个Operator Subtask,每一个Operator Subtask是在不同的线程中独立执行的。一个Operator的并行度,等于Operator Subtask的个数,一个Stream的并行度总是等于生成它的Operator的并行度。

One-to-one模式

比如从Source[1]到map()[1],它保持了Source的分区特性(Partitioning)和分区内元素处理的有序性,也就是说map()[1]的Subtask看到数据流中记录的顺序,与Source[1]中看到的记录顺序是一致的。

Redistribution模式

这种模式改变了输入数据流的分区,比如从map()[1]、map()[2]到keyBy()/window()/apply()[1]、keyBy()/window()/apply()[2],上游的Subtask向下游的多个不同的Subtask发送数据,改变了数据流的分区,这与实际应用所选择的Operator有关系。

3.任务、操作符链

Flink分布式执行环境中,会将多个Operator Subtask串起来组成一个Operator Chain,实际上就是一个执行链,每个执行链会在TaskManager上一个独立的线程中执行。

4. 时间

处理Stream中的记录时,记录中通常会包含各种典型的时间字段:

Event Time:表示事件创建时间

Ingestion Time:表示事件进入到Flink Dataflow的时间

Processing Time:表示某个Operator对事件进行处理的本地系统时间

Flink使用WaterMark衡量时间的时间,WaterMark携带时间戳t,并被插入到stream中。

5. 窗口

Flink支持基于时间窗口操作,也支持基于数据的窗口操作:

窗口分类:

Tumbling/Sliding Time Window

// Stream of (sensorId, carCnt)

val vehicleCnts: DataStream[(Int, Int)] = ...

val tumblingCnts: DataStream[(Int, Int)] = vehicleCnts

// key stream by sensorId

.keyBy(0)

// tumbling time window of 1 minute length

.timeWindow(Time.minutes(1))

// compute sum over carCnt

.sum(1)

val slidingCnts: DataStream[(Int, Int)] = vehicleCnts

.keyBy(0)

// sliding time window of 1 minute length and 30 secs trigger interval

.timeWindow(Time.minutes(1), Time.seconds(30))

.sum(1)

Tumbling/Sliding Count Window

// Stream of (sensorId, carCnt)

val vehicleCnts: DataStream[(Int, Int)] = ...

val tumblingCnts: DataStream[(Int, Int)] = vehicleCnts

// key stream by sensorId

.keyBy(0)

// tumbling count window of 100 elements size

.countWindow(100)

// compute the carCnt sum

.sum(1)

val slidingCnts: DataStream[(Int, Int)] = vehicleCnts

.keyBy(0)

// sliding count window of 100 elements size and 10 elements trigger interval

.countWindow(100, 10)

.sum(1)

自定义窗口

基本操作:

6. 容错

Barrier机制:

对齐:

当Operator接收到多个输入的数据流时,需要在Snapshot Barrier中对数据流进行排列对齐:

基于Stream Aligning操作能够实现Exactly Once语义,但是也会给流处理应用带来延迟,因为为了排列对齐Barrier,会暂时缓存一部分Stream的记录到Buffer中,尤其是在数据流并行度很高的场景下可能更加明显,通常以最迟对齐Barrier的一个Stream为处理Buffer中缓存记录的时刻点。在Flink中,提供了一个开关,选择是否使用Stream Aligning,如果关掉则Exactly Once会变成At least once。

CheckPoint:

Snapshot并不仅仅是对数据流做了一个状态的Checkpoint,它也包含了一个Operator内部所持有的状态,这样才能够在保证在流处理系统失败时能够正确地恢复数据流处理。状态包含两种:

7. 调度

在JobManager端,会接收到Client提交的JobGraph形式的Flink Job,JobManager会将一个JobGraph转换映射为一个ExecutionGraph,ExecutionGraph是JobGraph的并行表示,也就是实际JobManager调度一个Job在TaskManager上运行的逻辑视图。

物理上进行调度,基于资源的分配与使用的一个例子:

8. 迭代

机器学习和图计算应用,都会使用到迭代计算,Flink通过在迭代Operator中定义Step函数来实现迭代算法,这种迭代算法包括Iterate和Delta Iterate两种类型。

Iterate

Iterate Operator是一种简单的迭代形式:每一轮迭代,Step函数的输入或者是输入的整个数据集,或者是上一轮迭代的结果,通过该轮迭代计算出下一轮计算所需要的输入(也称为Next Partial Solution),满足迭代的终止条件后,会输出最终迭代结果。

流程伪代码:

IterationState state = getInitialState();

while (!terminationCriterion())

state = step(state);

setFinalState(state);

Delta Iterate

Delta Iterate Operator实现了增量迭代。

流程伪代码:

IterationState workset = getInitialState();

IterationState solution = getInitialSolution();

while (!terminationCriterion())

(delta, workset) = step(workset, solution);

solution.update(delta)

setFinalState(solution);

最小值传播:

9. Back Pressure监控

流处理系统中,当下游Operator处理速度跟不上的情况,如果下游Operator能够将自己处理状态传播给上游Operator,使得上游Operator处理速度慢下来就会缓解上述问题,比如通过告警的方式通知现有流处理系统存在的问题。

Flink Web界面上提供了对运行Job的Backpressure行为的监控,它通过使用Sampling线程对正在运行的Task进行堆栈跟踪采样来实现。

默认情况下,JobManager会每间隔50ms触发对一个Job的每个Task依次进行100次堆栈跟踪调用,过计算得到一个比值,例如,radio=0.01,表示100次中仅有1次方法调用阻塞。Flink目前定义了如下Backpressure状态:

OK: 0 <= Ratio <= 0.10

LOW: 0.10 < Ratio <= 0.5

HIGH: 0.5 < Ratio <= 1

1. Table

Flink的Table API实现了使用类SQL进行流和批处理。

详情参考:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/table_api.html

2. CEP

Flink的CEP(Complex Event Processing)支持在流中发现复杂的事件模式,快速筛选用户感兴趣的数据。

详情参考:https://ci.apache.org/projects/flink/flink-docs-release-1.2/concepts/programming-model.html#next-steps

3. Gelly

Gelly是Flink提供的图计算API,提供了简化开发和构建图计算分析应用的接口。

详情参考:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/libs/gelly/index.html

4. FlinkML

FlinkML是Flink提供的机器学习库,提供了可扩展的机器学习算法、简洁的API和工具简化机器学习系统的开发。

详情参考:https://ci.apache.org/projects/flink/flink-docs-release-1.2/dev/libs/ml/index.html

明天更新部署与测试

本文仅代表个人的观点,如果阐述的不好欢迎大家指导纠正,在此感激不尽。

flink:特性、概念、组件栈、架构及原理分析

参考技术A简单之美|ApacheFlink:特性、概念、组件栈、架构及原理分析http://shiyanjun.cn/archives/1508.htmlApacheFlink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时(FlinkRuntime),提供支持流... 查看详情

3.flink运行时架构解析

 1.flink任务调度原理Flink运行时架构主要组成:       Client、JobManager(master节点)和TaskManger(slave节点)。 Client:Flink作业在哪台机器上面提交,那么当前机器称之为Client。用户开发的Program代码,它会构建出DataFlow... 查看详情

flink环境部署

Flink原理与实现:架构和拓扑概览 架构要了解一个系统,一般都是从架构开始。我们关心的问题是:系统部署成功后各个节点都启动了哪些服务,各个服务之间又是怎么交互和协调的。下方是Flink集群启动后架构图。650)this.wi... 查看详情

flink原理与实现:架构和拓扑概览(代码片段)

传送门:Flink系统性学习笔记1.架构要了解一个系统,一般都是从架构开始。我们关心的问题是:系统部署成功后各个节点都启动了哪些服务,各个服务之间又是怎么交互和协调的。下方是Flink集群启动后架构图... 查看详情

flink基础原理(代码片段)

...处理很像,也有并行流、map、fifter等处理。二、Flink的基础架构(1)、流程 flinkclient(客户端)提交job到jobManager上,这一步实际上就会 查看详情

flink架构和调度

1、Flink架构Flink系统的架构与Spark类似,是一个基于Master-Slave风格的架构,如下图所示:    Flink集群启动时,会启动一个JobManager进程、至少一个TaskManager进程。在Local模式下,会在同一个JVM内部启动一个JobManager进程和TaskManag... 查看详情

flink的架构

(1)flink的任务提交流程(无Dispatcher提交)  1、client向yarn提交application后,同时向HDFS上传flink的Jar包和配置。ResourceManager为application分配Container资源并通知对应的NodeManager启动ApplicationMaster。  2、ApplicationMaster启动后加载Flin... 查看详情

flink学习flink的核心语义和架构模型

Flink的核心语义和架构模型我们在讲解Flink程序的编程模型之前,先来了解一下Flink中的Streams、State、Time等核心概念和基础语义,以及Flink提供的不同层级的API。Flink核心概念Streams(流),流分为有界流和无界流。有界流指的是有... 查看详情

flink原理

Flink是可以同时支持高吞吐、低延迟、高性能的分布式处理框架国内比较出名的互联网公司如阿里巴巴、美团、滴滴等,都在大规模使用flink作为企业的分布式大数据处理引擎Flink逐渐被人们所熟知,不仅是因为flink提供同时支持... 查看详情

flink入门——flink架构介绍

1、基本组件栈了解Spark的朋友会发现Flink的架构和Spark是非常类似的,在整个软件架构体系中,同样遵循着分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。https://mmbiz.qpic.cn/mm... 查看详情

flink内核原理学习任务提交流程(代码片段)

Flink内核原理学习之任务提交流程文章目录Flink内核原理学习之任务提交流程一、Flink任务提交流程(yarn-per-job模式)1.1总体流程解析1.2具体组件解释二、Flink任务提交流程(yarn-session模式)Java、大数据开发学习要点(持续更新中…... 查看详情

flink——部署与运行架构(代码片段)

一、下载&启动官网上下载安装包,执行下列命令即启动完成。./bin/start-cluster.sh效果图二、提交任务 查看详情

oreilly《flink基础教程》读后感一

...flink的原理,API,具体用法等等,而是讲fink的使用场景、架构、用途,优势。应该说是非常适合入门和调研的一本书。书很薄,但我觉得很值。一、第一章为何选择Flink这章主要介绍Flink的使用场景,作为第四代大数据计算引擎... 查看详情

从0到1flink的成长之路-flink原理探析(代码片段)

Flink原理探析ApacheFlink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。LevelsofAbstraction在Flink中提供不同层次抽... 查看详情

从0到1flink的成长之路-flink原理探析(代码片段)

Flink原理探析ApacheFlink是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。LevelsofAbstraction在Flink中提供不同层次抽... 查看详情

flink的运行架构详细剖析(代码片段)

1.Flink程序结构Flink程序的基本构建块是流和转换(请注意,Flink的DataSetAPI中使用的DataSet也是内部流)。从概念上讲,流是(可能永无止境的)数据记录流,而转换是将一个或多个流作为一个或多个流的... 查看详情

大数据flink进阶:apacheflink架构介绍

ApacheFlink架构介绍一、Flink组件栈在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。上图是Flink基本组件栈,从上图可... 查看详情

[3]flink大数据流式处理利剑:flink的部署架构

...个简单的例子;这个章节,我们来看看Flink的部署架构。Flink支持各种部署方式,单机版和集群版;本文将会给你大家介绍一下Flink的集群版的部署架构。Flink集群版的部署架构如下:一主多从;主指的就是J... 查看详情