Flink简单教学4-编程模型

2023-10-27

编程模型

此章编程模型是重点,理解Flink是如何工作的。虽然不涉及代码但非常有必要花时间阅读(2-4)节为重点

1 层次抽象(Levels of Abstraction)

模型

从底向上,抽象程都由低到高,以下说明了解以下即可。

  • 最低层次的抽象仅仅提供了有状态的流。它通过流程函数嵌入到DataStream API中。它允许用户自由处理来自一个或多个流的事件,并使用一致的容错状态。此外,用户可以注册事件时间和处理时间回调,允许程序实现复杂的计算。

  • 第二层核心层。实际上,大多数应用程序不需要上层的抽象描述,而是根据核心API (DataStream API(有界/无界流)和DataSet API(有界数据集)进行编程。这些连贯api为数据处理提供了常见的构建块,比如用户指定的各种形式的转换、连接、聚合、窗口、状态等。在这些api中处理的数据类型用各自的编程语言表示为类。
    低层流程功能与DataStream
    API集成,使得仅对某些操作进行低层抽象成为可能。DataSet API在有界数据集上提供了额外的原语,比如循环/迭代。

  • 再上一层Table API是一个以表为中心的声明性DSL,可以动态地更改表(在表示流时)。表API遵循(扩展的)关系模型:表有一个附加的模式(类似于关系数据库中的表),而API提供了类似的操作,如select、project、join、group-by、aggregate等。表API程序声明性地定义应该执行什么逻辑操作,而不是确切地指定操作代码的外观。虽然表API可以通过各种类型的用户定义函数进行扩展,但是它的表达能力不如核心API,但是使用起来更简洁(需要编写的代码更少)。
    此外Table API程序在执行前还需要经过一个应用规则优化器。可以在表和DataStream/DataSet之间进行无缝转换,允许程序混合Table API和DataStream和DataSet API。

  • Flink提供的最高抽象级别是SQL。这种抽象在语义和表达方面与Table API类似,用SQL代替table API编程方式。SQL抽象与Table API密切交互,SQL查询可以在Table API定义的表上执行。

2 程序和数据流(Programs and Dataflows)

Flink程序的基本构建块是streamstransformations。(在Flink的DataSet API中使用的数据集也是内部流的——稍后详细介绍)。从概念上讲,流是(无界)一个不间断的数据流,转换是将一个或多个流作为输入,并产生一个或多个输出的操作。
在运行时,Flink程序由流和操作符组成,并被映射到数据流(streaming dataflows)上。每个数据流可以由多个源(source),最后汇聚(sink)到一个或多个结果上。数据流类似于任意形状的有向无环图(DAGs)。虽然也可以通过迭代构造特殊形式的循环,但为了简单起见,我们在大多数情况下会忽略这一点。

code

通常,程序中的转换与数据流中的操作符之间是一对一的对应关系。但有时一个转换可能包含多个转换操作符。

source和sink被记录在流连接器和批连接器文档中。Transformations通过++DataStream operate++ 和 ++DataSet transformations++来描述。

3 并行数据流 (Parallel Dataflows)

Flink是并行分布式的程序。在执行期间,一个流有一个或多个分区(stream partitions),每个operate有一个或多个operate子任务。operate子任务彼此独立,并在不同的线程中执行,也可能在不同的机器或容器中执行。

operator subtasks的数量就是这个operate的真实并行度。不同的的操作(operate)会有不同的不同的并行度。

parallelism
Streams可以在两个operator之间一对一的发送数据,也可以对数据进行重新分区:

  • One-to-one stream(上图中的source和map()操作)保留了元素的分区和顺序。也就是说map()操作的subtask[1]会看到和source操作subtask[1]生成的顺序相同的数据。

  • Redistributing stream (在上图上面的map()和keyBy/window之间,以及keyBy/window和sink之间)根据所用的操作会改变流的分区,每个operator subtasks将数据发送到不同的target subtasks。例如keyBy()(会根据key重新分区)、broadcast()或rebalance() (随机重新分区)。在重分区中,只能保证每对发送和接收子任务(subtask)之间保持有序(例如map()的subtask[1]和keyBy/window的subtask[2])++补充解释:map()接收到的和输出的顺序是一致的,keyBy/window顺序是一致的。但由map()输入,从keyBy/window输出就不能保证数据顺序一致++。因此在本例中,保留了每个键的顺序,但是并行性确实引入了不同键的聚合结果到达接收器的顺序的不确定性。

窗口(Windows)

窗口在流计算中是一个很重要的概念。聚合操作(sum,count)在流和批上的工作方式不同,在流计算中流是无限的,无法等数据全部到齐了之后再触发聚合操作。所以必须通过窗口(window)来限定数据的范围,比如计算五分钟内的事件数量,或者100个元素的总和。

Windows可以是时间驱动(例如:每30秒)或数据驱动(例如:每100个元素)。人们通常会区分不同类型的窗口,比如翻滚窗口(tumbling windows)(没有重叠)、滑动窗口(sliding window)(有重叠)和会话窗口(session windows)(未接收到数据的的时间间隔)。

windows

时间(Time)

在Stream的程序中提到的时间可以有不同的意义:

  • **事件时间(Event Time)**是创建事件的时间。它通常由事件中的时间戳来描述,例如由生产传感器或生产服务附加的时间戳。Flink通过时间戳分配程序访问事件时间戳。

  • **接收时间(Ingestion time)**是事件在source进入Flink数据流的时间。在平时开发的时候很少会用到。

  • **处理时间(Processing Time)**是每个operator的本地时间。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBJn7eUm-1573656040722)(https://ci.apache.org/projects/flink/flink-docs-release-1.9/fig/event_ingestion_processing_time.svg)]

有状态的操作 Stateful Operations

虽然数据流中大多数只操作事件本身(单条处理)(如事件解析),但有些操作需要记录多个事件的信息(例如窗口操作)。这些操作称为有状态的。

使用一个嵌入式的key/value存储对象来存储状态。状态是分区和分布式的并且跟有状态的操作绑定。因此,只有在keyBy()函数之后才能访问key/value状态,并且只能访问与当前事件的键相关的值。将流的键和状态对齐,可以确保所有状态更新都是本地操作,从而保证一致性而不增加事务开销。这种对齐还允许Flink重新分配状态并透明地调整流分区。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rlac5vOk-1573656040725)(https://ci.apache.org/projects/flink/flink-docs-release-1.9/fig/state_partitioning.svg)]

检查点和容错(Checkpoints for Fault Tolerance)

Flink使用流回放和checkpoint的组合实现容错。checkpoint与每个输入流中的特定点以及每个操作符的对应状态相关。数据流可以从检查点恢复,同时通过恢复操作符的状态并从检查点重播事件来保持一致性(exactly-once)。

检查点间隔是一种用恢复时间(需要重播的事件数量)来平衡执行期间的容错开销的方法。

Batch on Streaming

批处理作为Flink流程序的特殊情况,其中流是有界的(元素的有限数量)(可以理解成为一个有限个元素的大窗口)。数据集在内部被视为数据流。因此,可以将批数据当做流数据来处理,只有少数例外:

  • 批处理程序的容错不使用检查点。恢复是通过完全重放流来实现的。这是可能的,因为输入是有界的。这将使成本更接近于恢复,但使常规处理更便宜,因为它避免了检查点。

  • DataSet API中的有状态操作使用简化的n-memory/out-of-core 数据结构,而不是key/value索引。

  • DataSet API引入了特殊的同步(superstep-based)迭代,这只可能在有界的流上实现。

关注我的公众号

了解我的最新动向
qrcode_for_gh_eac3d4651e58_344

收藏我的个人博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flink简单教学4-编程模型 的相关文章

  • 西米支付:微信服务商支付的介绍

    服务商申请条件 1 微信支付服务商面向企业 政府机关 事业单位 社会组织类型主体开放申请 2 申请资料准备 1 业务联系人信息 包含联系人姓名 联系手机 联系邮箱 若联系人非法定代表人 还需提交有效证件照片 2 主体身份信息 营业执照 登记

随机推荐

  • (纯c)数据结构之------>链表(详解)

    目录 一 链表的定义 1 链表的结构 2 为啥要存在链表及链表的优势 二 无头单向链表的常用接口 1 头插 尾插 2 头删 尾删 3 销毁链表 打印链表 4 在pos位置后插入一个值 5 消除pos位置后的值 6 查找链表中的值并且返回它的
  • 【Nginx】解决在Nginx+Vue部署多个前端项目,二级目录不能访问、访问空白的问题

    一 前言 需求 设置访问 www ai com 访问时打开前端代码 tmp zhsf 设置访问 www ai com case search 时 访问时打开另一个前端代码 tmp template 二 实现过程 1 根目录访问 部署使用ng
  • uni-cloud云函数管理公共模块依赖

    1 右键函数文件夹 选中依赖模块 更新依赖 2 完成后
  • Keras中的fit函数训练集,验证集和测试集

    Keras中的fit函数训练集 验证集和测试集 1 Keras fit函数history对象包含两个重要属性 epoch 训练的轮数 history 它是一个字典 包含val loss val acc loss acc四个key 2 关于训
  • 第十三届蓝桥杯大赛软件赛省赛 Python 大学 C 组

    试题 A 排列字母 本题总分 5 分 问题描述 小蓝要把一个字符串中的字母按其在字母表中的顺序排列 例如 LANQIAO 排列后为 AAILNOQ 又如 GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPST
  • 拥抱ChatGPT,开启结对咨询模式!

    ChatGPT刮起了一阵旋风 ChatGPT到底能做什么 做到什么程度 真的会让咨询顾问失业吗 带着这样的疑问 我费尽周折 注册了ChatGPT账号 我先从一个大众化的话题开启了与ChatGPT的对话 如何提高软件开发的质量 如果是我回答这
  • 网页文字复制的几种方法

    1 开启网页阅读模式 这种方法适用于Microsoft Edge浏览器中 它有网页阅读功能可以使用 在网址的最前面加上 read 就会进入网页阅读界面 然后选中文字就可以直接进行复制了 2 直接拖拽 一种简单直接的方法 不用进行任何其他操作
  • 如何在服务器上跑python程序

    购买服务器 首先你需要一个服务器 阿里云云翼计划有一个9 9云服务器ECS服务 你怎么买我不管 反正你最后给我搞到一个云服务器 购买的配置界面 由于阿里云现在限量购买 所以这里只是截个图说明而已 主要说明一点公共镜像选择ubuntu14 0
  • 【软件测试】理论知识基础第一章

    前言 骗取自己的救赎 直到和染尘斑驳的玫瑰一起坠入深渊 软件测试 理论知识基础第一章 一 认识软件测试 1 什么是软件测试 二 常见的测试分类 1 阶段划分 2 代码可见度划分 3 扩展 总结 三 模型 1 质量模型 2 W模型 四 软件测
  • Webservice接口的生成及调用

    最近项目上要对接一个Webservice形式的接口 因为以前一直没有对接过这种类型的 所以这次专门查了一些资料学习下 一 Webservice的简单介绍 WebService是一种跨编程语言和跨操作系统平台的远程调用技术 它通过标准通信协议
  • AAA协议tacacs认证简单实验

    实验名称 AAA的tacacs验证 实验目的 在AAA认证服务器上认证客户端telnet登陆路由器 实验拓扑图 主要实验步骤 Router上的配置 Router gt en Router conf t Router config inter
  • 内存超频时序怎么调_超频技术之内存“时序”重要参数设置解说

    超频技术之内存 时序 重要参数设置解说 来源 华强电子网 作者 华仔 浏览 432 时间 2017 05 10 21 48 标签 摘要 相信大多数超频帖子里都会提到内存时序调整 也就是我们经常看到的5 5 5 15 1T 4 5 4 12
  • python爬虫requests源码链家_Python 爬虫 链家二手房(自行输入城市爬取)

    因同事想在沈阳买房 对比分析沈阳各区的房价 让我帮忙爬取一下链家网相关数据 然后打 算记下笔记 用于总结学到的东西 用到的东西 一 爬虫需要会什么 学习东西 首先你要知道它是干嘛的 爬虫 顾名思义就是爬取你所看到的网页内容 小说 新闻 信息
  • 当可变形注意力机制引入Vision Transformer

    GiantPandaCV导语 通过在Transformer基础上引入Deformable CNN中的可变性能力 在降低模型参数量的同时提升获取大感受野的能力 文内附代码解读 引言 Transformer由于其更大的感受野能够让其拥有更强的模
  • 你的键盘多久没测试过了?看看有没有失灵

    键盘是电脑外置设备中易损坏的一种 也是必不可少的电脑配件 特别是程序员每天都需要频繁地使用键盘 键盘常会出现故障 例如失灵或某些字母 数字无法正常输入 这样既浪费时间又令人烦恼 为此 我们在这里提供一个在线测试工具 方便您测试键盘按键是否正
  • 疫情期间科研记录(1)——异步电机矢量控制

    2020年二月至三月 受疫情影响 居家隔离 受毕业以及找工作压力 居家而未敢忘科研 两个月成果如下 在此期间 参考大量文献和往上的代码 基本完善了开题时硕士毕业论文的电机控制系统概念 实现了基于概念的仿真模型 记此文档以备忘 异步电机矢量控
  • 【ARIMA-WOA-LSTM】合差分自回归移动平均方法-鲸鱼优化-长短期记忆神经网络研究(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 1 1 ARIMA模型 1 2 鲸鱼优化算法 1 3 LSTM 模型 2 运行结果 3 参考文献 4 Py
  • js数组对象取出指定元素相同的对象组成新数组

    要处理的数组 name 小明 age 18 address 天上 name 小红 age 19 address 地里 name 小明 age 20 address 叙利亚 name 小明 age 5 address 娘胎 想处理成 name
  • C++编译知识笔记(二)——Linux ELF文件解析

    目录 一 ELF格式概述 二 常见段及对应用途 三 目标文件内容解析 3 1 代码段 text 3 2 只读数据段 rodata 3 3 数据段 data 3 4 bss段 3 5 重定位表 Reloacation Table 相关段 re
  • Flink简单教学4-编程模型

    编程模型 此章编程模型是重点 理解Flink是如何工作的 虽然不涉及代码但非常有必要花时间阅读 2 4 节为重点 1 层次抽象 Levels of Abstraction 从底向上 抽象程都由低到高 以下说明了解以下即可 最低层次的抽象仅仅