Flink 的核心计算架构是下图中的 Flink Runtime 执行引擎,它是一个分布式系统,能够接受数据流程序并在一台或多台机器上以容错方式执行。
Flink Runtime 执行引擎可以作为 YARN(Yet Another Resource Negotiator)的应用程序在集群上运行,也可以在 Mesos 集群上运行,还可以在单机上运行(这对于调试 Flink 应用程序来说非常有用)。

上图为 Flink 技术栈的核心组成部分,值得一提的是,Flink 分别提供了面向流式处理的接口(DataStream API)和面向批处理的接口(DataSet API)。因此,Flink既可以完成流处理,也可以完成批处理。 Flink 支持的拓展库涉及机器学习(FlinkML)、复杂事件处理(CEP)、以及图计算(Gelly),还有分别针对流处
理和批处理的 Table API

Flink 提 供 了 用 于 流 处 理 的DataStream API 和用于批处理的 DataSet API。值得注意的是,尽管 Flink Runtime
执行引擎是基于流处理的,但是 DataSet API 先于 DataStream API 被开发出来,这是因为工业界对无限流处理的需求在 Flink 诞生之初并不大。

DataStream API 可以流畅地分析无限数据流,并且可以用 Java 或者 Scala 来实现。开发人员需要基于一个叫 DataStream 的数据结构来开发,这个数据结构用于表示永不停止的分布式数据流。

Flink 的分布式特点体现在它能够在成百上千台机器上运行,它将大型的计算任务分成许多小的部分,每个机器执行一部分。Flink 能够自动地确保发生机器故障或者其他错误时计算能够持续进行,或者在修复 bug 或进行版本升级后有计划地再执行一次。这种能力使得开发人员不需要担心运行失败。Flink 本质上使用容错性数据流,这使得开发人员可以分析持续生成且永远不结束的数据(即流处理)。

JobManager 与 TaskManager

Flink 运行时包含了两种类型的处理器:
JobManager 处理器:也称之为 Master,用于协调分布式执行,它们用来调度 task,协调检查点,协调失败时恢复等。Flink 运行时至少存在一个 master 处理器,如果配置高可用模式则会存在多个 master 处理器,它们其中有一个是 leader,而其他的都
standby
TaskManager 处理器:也称之为 Worker,用于执行一个 dataflow 的 task(或者特殊的 subtask)、数据缓冲和 data stream 的交换,Flink 运行时至少会存在一个 worker处理器。


MasterWorker 处理器可以直接在物理机上启动,或者通过像 YARN 这样的资源调度框架。
Worker 连接到 Master,告知自身的可用性进而获得任务分配。

任务提交流程


Flink 任务提交后,ClientHDFS 上传 FlinkJar 包和配置,之后向 Yarn ResourceManager 提交任务,ResourceManager 分配 Container 资源并通知对应的NodeManager 启动 ApplicationMasterApplicationMaster 启动后加载 FlinkJar 包和配置构建环境,然后启动 JobManager,之后 ApplicationMasterResourceManager
申请资源启动 TaskManagerResourceManager 分 配 Container 资 源 后 , 由ApplicationMaster 通 知 资源所在节点的 NodeManager 启 动 TaskManagerNodeManager 加载 FlinkJar 包和配置构建环境并启动 TaskManagerTaskManager启动后向 JobManager 发送心跳包,并等待 JobManager 向其分配任务。

TaskManager 与 Slots

每一个 TaskManager 是一个 JVM 进程,它可能会在独立的线程上执行一个或多个 subtask。为了控制一个 worker 能接收多少个 taskworker 通过 task slot 来进行控制(一个 worker 至少有一个 task slot)。·每个 task slot 表示 TaskManager 拥有资源的一个固定大小的子集。假如一个TaskManager 有三个 slot,那么它会将其管理的内存分成三份给各个 slot。资源 slot化意味着一个 subtask 将不需要跟来自其他 jobsubtask 竞争被管理的内存,取而代之的是它将拥有一定数量的内存储备。需要注意的是,这里不会涉及到 CPU 的隔
离,slot 目前仅仅用来隔离 task 的受管理的内存。
通过调整 task slot 的数量,允许用户定义 subtask 之间如何互相隔离。如果一个 TaskManager 一个 slot,那将意味着每个 task group 运行在独立的 JVM 中(该 JVM可能是通过一个特定的容器启动的),而一个 TaskManager 多个 slot 意味着更多的subtask 可以共享同一个 JVM。而在同一个 JVM 进程中的 task 将共享 TCP 连接(基
于多路复用)和心跳消息。它们也可能共享数据集和数据结构,因此这减少了每个task 的负载。

Task Slot 是静态的概念,是指 TaskManager 具有的并发执行能力,可以通过参数 taskmanager.numberOfTaskSlots 进行配置,而并行度 parallelism 是动态概念,即 TaskManager 运行程序时实际使用的并发能力,可以通过参数 parallelism.default进行配置。
也就是说,假设一共有 3 个 TaskManager,每一个 TaskManager 中的分配 3 个TaskSlot,也就是每个 TaskManager 可以接收 3 个 task,一共 9 个 TaskSlot,如果我们设置 parallelism.default=1,即运行程序默认的并行度为 1,9 个 TaskSlot 只用了 1个,有 8 个空闲,因此,设置合适的并行度才能提高效率。

Dataflow

Flink 程序由 Source、Transformation、Sink 这三个核心组件组成,Source 主要负责数据的读取,Transformation 主要负责对属于的转换操作,Sink 负责最终数据的输出,在各个组件之间流转的数据称为流(streams

Flink 程序的基础构建模块是 流(streams) 与 转(transformations)(需要注意的是,FlinkDataSet API 所使用的 DataSets 其内部也是 stream)。一个 stream可以看成一个中间结果,而一transformations 是以一个或多个 stream 作为输入的
某种 operation,该 operation 利用这些 stream 进行计算从而产生一个或多个 result stream

在运行时,Flink 上运行的程序会被映射成 streaming dataflows,它包含了streamstransformations operators。每一个 dataflow 以一个或多个 sources 开始以一个或多个 sinks 结束,dataflow 类似于任意的有向无环图(DAG)。

并行数据流

Flink 程序的执行具有并行、分布式的特性。在执行过程中,一个 stream 包含一个或多个 stream partition , 而 每 一 个 operator 包 含 一 个 或 多 个 operator subtask,这些 operator subtasks 在不同的线程、不同的物理机或不同的容器中彼此互不依赖得执行。

一个特定 operatorsubtask 的个数被称之为其 parallelism(并行度)。一个stream 的并行度总是等同于其 producing operator 的并行度。一个程序中,不同的operator 可能具有不同的并行度。


Streamoperator 之间传输数据的形式可以是 one-to one(forwarding)的模式也可以是 redistributing 的模式,具体是哪一种形式,取决于 operator 的种类。

One-to-one:stream(比如在 source 和 map operator 之间)维护着分区以及元素的顺序。那意味着 map operator 的 subtask 看到的元素的个数以及顺序跟 sourceoperator 的 subtask 生产的元素的个数、顺序相同,map、fliter、flatMap 等算子都是one-to-one 的对应关系。

Redistributing:这种操作会改变数据的分区个数。每一个 operator subtask 依据所 选 择 的 transformation 发 送 数 据 到 不 同 的 目 标 subtask。 例 如 , keyBy() 基 于hashCode 重分区、broadcast 和 rebalance 会随机重新分区,这些算子都会引起redistribute 过程,而 redistribute 过程就类似于 Spark 中的 shuffle 过程

task 与 operator chains

出于分布式执行的目的,Flinkoperatorsubtask 链接在一起形成 task,每个 task 在一个线程中执行。将 operators 链接成 task 是非常有效的优化:它能减少线程之间的切换和基于缓存区的数据交换,在减少时延的同时提升吞吐量。链接的行为可以在编程 API 中进行指定。
下面这幅图,展示了 5 个 subtask 以 5 个并行的线程来执行:

任务调度流程

客户端不是运行时和程序执行的一部分,但它用于准备并发送 dataflow 给Master,然后,客户端断开连接或者维持连接以等待接收计算结果,客户端可以以两种方式运行:要么作为 Java/Scala 程序的一部分被程序触发执行,要么以命令行./bin/flink run 的方式执行。

flink基本原理入门相关推荐

  1. Flink 基本原理与生产实践分享【入门必读,概念清晰】

    Flink 基本原理与生产实践分享[入门必读,概念清晰] https://zh.wikipedia.org/zh-hans/Apache_Flink Apache Flink是由Apache软件基金会 ...

  2. flink入门_阿里巴巴为何选择Flink?20年大佬分11章讲解Flink从入门到实践!

    前言 Apache Flink 是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,之前叫做 Stratosphere.他们在2014 年开源了这个项目,起名为 Flink. Apache ...

  3. Flink 最锋利的武器:Flink SQL 入门和实战

    学习路径:<2021年最新从零到大数据专家学习路径指南> 面      试:<2021年最新版大数据面试题全面开启更新> [注意]:Flink1.9版本后的Flink SQL使 ...

  4. Flink最锋利的武器:Flink SQL入门和实战 | 附完整实现代码

    作者 | 机智的王知无 转载自大数据技术与架构(ID: import_bigdata) 一.Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门 ...

  5. Flink从入门到精通100篇(二十一)-万字长文详解 Flink 中的 CopyOnWriteStateTable

    前言 现如今想阅读 HashMap 源码实际上比较简单,因为网上一大堆博客去分析 HashMap 和 ConcurrentHashMap.本文详细分析 CopyOnWriteStateTable 源码 ...

  6. Flink编程入门(二)

    Flink 有三种部署模式,分别是 Local.Standalone Cluster 和 Yarn Cluster. 1.1. Local模式 对于 Local 模式来说,JobManager 和 T ...

  7. Flink 最锋利的武器:Flink SQL 入门和实战带你了解NBA球星数据

    一.Flink SQL 背景 Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言. 自 2015 年开始,阿里巴巴开始调研 ...

  8. Flink sql入门篇-概念、初步实现

    目录 Flinksql入门前的概念 物化视图 动态表和连续查询 在流上定义表 连续查询 更新和追加查询 查询限制 表到流的转换 初步实现Flinksql 导入依赖 实现Flinksql 进一步实现Fl ...

  9. Flink从入门到精通100篇(二十四)-对Flink SQL Client 源码做深度解析

    前言 本文基于 Flink 1.12-SNAPSHOT,使用sql client命令行提交insert语句进行整个流程的分析. sql-client.sh embedded --update &quo ...

最新文章

  1. nginx配置访问图片路径(windows)
  2. 分享一个现代的,免费的,简单而有效的编辑器Vis
  3. 不能在 UTF8 和 UCS2 之间转换: failUTF8Conv
  4. STC89C52RC内部EEPROM编程
  5. 4、Kafka常见问题
  6. Java输出数字到文本文件FileWriter
  7. windows 的使用 —— 注册表(软件的安装和卸载)
  8. options请求_HTTP 协议 POST 请求,为什么会有一个 OPTION?
  9. 你为什么人到中年还是个普通员工?
  10. Flutter 移动端屏幕适配方案和制作
  11. 洛谷题解(持续更新)
  12. 【Java】:基础入门知识
  13. 1118 Birds in Forest (25分)——(并查集)
  14. 【博学谷学习记录】超强总结,用心分享 | 前端开发 前端基础超详细总结-上篇
  15. 用友U9sv服务打开时报错内存入口检查失败,因为可用内存(371662848 字节)少于总内存的 5%
  16. 深度学习小白入门教程(一):以英雄联盟为例,爬取你感兴趣图片,构建你自己的数据集
  17. Could not find parameter map com.itcast.mapper.userinfMapper.map
  18. MoviePy - 中文文档4-MoviePy实战案例-给MoviePy Logo做一个闪动的阴影效果
  19. nginx防火墙端口配置
  20. MathType在Word中功能异常的解决办法汇总(持续更新)

热门文章

  1. Web服务器基础详解
  2. Ubuntu安装:解决Unable to locate package *** 问题
  3. python图像转字符画_Python实现图片转字符画的示例
  4. .net core sorteddictionary 排序_#键盘排序——为什么我们的键盘字母不是按照ABCD的顺序排列?...
  5. 总觉得学习效率低,看了这篇瞬间清醒了!
  6. layer 退 回 点击变灰色
  7. java中properties类_Java中的Properties类详解
  8. ubuntu mysql下载64位下载_ubuntu mysql下载|
  9. 微型计算机的输入 输出设备PPT,(微型计算机系统模型).ppt
  10. 远程连不上mysql_解决MySQL远程连接不上的问题