Flink介绍——实时计算核心论文之Dataflow论文总结
数据流处理的演变与 Dataflow 模型的革新
在大数据处理领域,流式数据处理系统的发展历程充满了创新与变革。从早期的 S4 到 Storm,再到 MillWheel,每一个系统都以其独特的方式推动了技术的进步。S4 以其无中心架构和 PE(Processing Element)为核心,实现了分布式数据处理的基本框架。Storm 则通过中心化的架构,定义了 Spout 和 Bolt 的角色,使得数据流的发送与处理更加清晰和高效。而 MillWheel 在此基础上更进一步,引入了 Computation、Stream、Key 等概念,并通过 Timer 和 State 来处理持久化状态和时钟差异问题。
这些系统虽然在实现和接口上各有不同,但它们共同采用了有向无环图(DAG)模型来构建数据处理流程。在这样的架构下,数据以流的形式在各个处理节点之间传递,每个节点负责特定的处理任务。然而,这些系统更多地是从具体实现的角度出发,定义了各自的逻辑和处理方式,而缺乏一个统一的、抽象的模型来指导流式数据处理的设计与实现。
Dataflow 模型的提出
2015 年,Google 发表了《The Dataflow Model: A Practical Approach to Balancing Correctness, Latency, and Cost in Massive-Scale, Unbounded, Out-of-Order Data Processing》论文,提出了 Dataflow 模型,旨在从抽象层面重新定义流式数据处理。这一模型不仅融合了批处理和流处理的特点,还通过引入新的时间和窗口概念,为处理大规模、无边界、乱序数据集提供了强大的理论基础和实践指导。
Dataflow 模型的核心在于其基础计算模型,该模型仅包含两个关键概念:ParDo 和 GroupByKey。ParDo(Parallel Do)相当于 MapReduce 中的 Map 阶段,负责对输入数据进行并行处理。每个输入数据项都会被一个称为 DoFn 的处理函数处理,且这些处理过程会在多台机器上并行执行。GroupByKey 则类似于 MapReduce 中的 Shuffle 操作,它将所有具有相同 Key 的数据汇总到一起,以便后续处理。在 Dataflow 中,数据被抽象为 key-value 对,ParDo 的输入和输出都是 key-value 对,而 GroupByKey 则将相同 Key 的数据分组,为后续的 ParDo 处理提供基础。
通过 ParDo 和 GroupByKey 的组合使用,Dataflow 能够构建多层数据处理流程,类似于将多个 MapReduce 过程串联在一起。例如,在统计广告展示次数超过 100 万次的广告时,可以先通过 ParDo 解析日志并输出(广告 ID,1)这样的 key-value 对,再通过 GroupByKey 将相同广告 ID 的数据分组,接着利用 ParDo 统计每个广告 ID 的展示次数,最后再次使用 ParDo 过滤掉展示次数不足的广告。
流批一体的实现
Dataflow 模型的一个显著优势在于其对流批一体的支持。在传统的数据处理观念中,批处理和流处理被看作两种截然不同的处理方式。批处理针对有边界的数据集,而流处理针对无边界的数据流。然而,Dataflow 模型指出,这种区分并非绝对,批处理可以被视为流处理的一种特殊情况。
在 Dataflow 中,输入数据集可以是无边界的,随着时间的推移不断有新的数据加入。这种设计使得 Dataflow 能够处理持续增长的实时数据,同时也能够处理预先确定的有边界数据。例如,一份固定大小的日志文件可以被放置在 Kafka 中,通过重放的方式交给 Storm 的 Topology 来处理,这实际上是使用流处理的方式处理有边界的数据。反之,对于不断增长的实时数据,也可以通过定时执行 MapReduce 任务或使用类似 Spark Streaming 的微批处理方式来处理。
Dataflow 模型通过引入时间维度,将批处理和流处理统一起来。在这种模型下,当批处理的记录数被限制为每批一条时,它就转变成了流处理。同样,MapReduce 中的有边界数据集也可以被视为 Dataflow 中的无边界数据集的特例。这一思想的提出,为数据处理领域带来了新的视角,使得开发者能够以更加统一的方式构建数据处理管道,而不必在批处理和流处理之间做出严格的区分。
时间窗口的分配与合并
在流式数据处理中,时间窗口是一个关键的概念。Dataflow 模型通过引入固定窗口、滑动窗口和会话窗口等不同的窗口类型,为数据统计提供了灵活的时间维度支持。
固定窗口将数据按照固定的时间间隔划分,例如每小时统计一次广告展示数量。滑动窗口则随着时间的推移而滑动,例如统计过去 2 分钟的广告展示数量,其窗口大小为 2 分钟,滑动周期可以是 1 分钟。会话窗口则用于统计用户的会话,通过设置两次事件之间的超时时间来定义会话的开始和结束。
Dataflow 模型通过 AssignWindows 和 MergeWindows 两个关键函数来实现时间窗口的分配与合并。在业务处理函数之前,每个原始事件都被表示为(key, value, event_time)三元组。AssignWindows 函数将这些三元组转换为(key, value, event_time, window)四元组,为每个事件分配一个或多个时间窗口。例如,一个广告在 12:01 展示给用户,该事件可能会被分配到 [12:00, 12:02) 和 [12:01, 12:03) 两个时间窗口中。
MergeWindows 函数则负责合并具有重叠部分的时间窗口。以客服聊天系统为例,如果用户和客服之间超过 30 分钟没有互动,则认为会话结束。对于同一用户下的多个事件,如果它们的窗口之间有重叠部分,就会被合并成一个更大的时间窗口。这种窗口分配与合并机制使得 Dataflow 能够处理乱序数据,确保计算结果的准确性,并且能够将计算过程中的中间结果作为状态持久化,以便后续的增量计算。
触发器和增量数据处理
在流式数据处理中,确定何时输出计算结果是一个关键问题。MillWheel 通过低水位(Low Watermark)来判断是否所有应处理的事件都已经处理完毕,从而决定是否向下游发送计算结果。然而,这种方法在实践中面临两个主要问题:一是水位标记后仍有新日志到达,导致已发送的计算结果不准确;二是水位标记可能因个体延迟日志而过低,导致计算结果无法及时发送。
Dataflow 模型通过引入触发器(Trigger)机制解决了这些问题。触发器借鉴了 Lambda 架构的核心思想,允许系统尽快输出初步计算结果,并在后续根据新数据不断修正结果。与 MillWheel 中仅基于定时器的触发方式不同,Dataflow 的触发器可以基于多种参数组合,如处理时间、记录数等,并且支持用户自定义触发器逻辑。
触发器还支持三种输出策略:抛弃(Discarding)、累积(Accumulating)和累积并撤回(Accumulating & Retracting)。
- 抛弃策略在触发后丢弃窗口内的数据,适合对存储空间要求较高的场景;
- 累积策略则保留窗口数据,允许后续数据到达时重新计算并更新结果;
- 累积并撤回策略不仅更新结果,还撤回之前的计算结果,确保计算的正确性,但在实现上更具挑战性。
例如,在客服会话场景中,如果后续接收到新的日志导致会话窗口合并,系统需要撤回之前发送的错误会话窗口,并发送新的正确会话窗口。
Dataflow 模型的优势与局限性
Dataflow 模型通过抽象时间和窗口概念,为流式数据处理提供了强大的理论基础和实践指导。它将批处理和流处理统一起来,支持乱序数据处理,并通过触发器和增量处理机制提高了数据处理的灵活性和效率。Dataflow 模型不仅适用于 Google 内部的大规模数据处理需求,还推动了 Apache Beam 等开源项目的发展,促进了流处理技术的标准化和普及。
然而,Dataflow 模型并非完美无缺。例如,其复杂性可能对某些简单应用场景造成过度设计,增加了开发和维护成本。此外,模型对底层存储和计算资源的依赖可能会限制其在某些环境中的适用性。在实际应用中,开发者需要根据具体的业务需求和技术条件权衡模型的选择和实现方式。
Dataflow 模型的实际应用与影响
Dataflow 模型的实际应用已经证明了其在处理大规模数据集方面的优势。Google 的 Cloud Dataflow 服务就是基于这一模型构建的,它允许用户以统一的方式处理批和流数据。Cloud Dataflow 提供了高度的灵活性和可扩展性,使得企业能够快速构建和部署数据处理管道,满足实时数据分析的需求。
此外,Dataflow 模型对开源社区也产生了深远的影响。Apache Beam 项目就是其中一个典型的例子。Apache Beam 提供了一个统一的编程模型,使得开发者可以在不同的执行引擎上运行 Dataflow 程序。这种统一性减少了开发者的负担,使得他们能够专注于业务逻辑的实现,而不必担心底层技术细节。
Dataflow 模型的未来展望
随着大数据技术的不断发展,Dataflow 模型有望在以下几个方面得到进一步的发展和应用:
更强的实时性支持
未来,Dataflow 模型可能会进一步优化其触发器机制,以支持更低延迟的实时数据处理。这将使得系统能够更快地响应数据变化,满足对实时性要求更高的应用场景。
更丰富的窗口类型与时间语义
虽然 Dataflow 模型已经支持多种窗口类型,但随着业务需求的多样化,未来可能会引入更多的时间语义和窗口类型,以满足复杂的业务场景要求。
更高效的数据处理引擎
为了应对大规模数据处理的挑战,未来可能会出现更高效的数据处理引擎,这些引擎将在资源利用率和处理速度上取得更大的突破,进一步推动 Dataflow 模型的应用。
更广泛的行业应用
Dataflow 模型的应用将不仅限于互联网行业,还将在金融、医疗、物联网等多个领域得到广泛应用。这些行业的数据处理需求将持续推动模型的演进和完善。
结论
随着技术的不断发展,Google 基于其提出的 Dataflow 编程模型,成功孵化了 Apache Beam 项目。这一项目具有里程碑意义,它不仅推动了流处理技术的标准化,还为开发者提供了一个统一的编程模型,以便在不同的执行引擎上进行数据处理。Dataflow 模型的提出,标志着 Google 在大数据处理领域的又一次创新尝试,它将大数据流式处理抽象为三个核心概念:能够处理乱序数据并按事件发生时间计算时间窗口的模型、根据多维度特征决定计算结果输出时机的触发器模型,以及将数据更新和撤回与前述模型相集成的增量处理策略。这一模型的出现,为处理无边界的大数据集提供了全新的视角和方法。
Dataflow 论文的发表,体现了 Google 在大数据处理领域的深度思考和前瞻性。与传统的关注具体系统实现的论文不同,Dataflow 更侧重于从模型的角度探讨如何对无边界的大数据处理进行有效抽象。它不仅为流式数据处理提供了一个高度抽象的框架,还启发了后续众多数据处理系统的设计与实现。
Dataflow 模型的影响力不仅限于理论层面,更在实际应用中得到了广泛的验证和推广。Google Cloud Dataflow 服务就是该模型的一个成功应用,它允许用户以统一的方式处理批和流数据,提供了高度的灵活性和可扩展性。此外,Apache Beam 项目也在开源社区中引起了广泛关注,它实现了 Dataflow 的接口,使得开发者可以在不同的执行引擎上运行 Dataflow 程序,极大地降低了开发者的负担,提高了开发效率。
Dataflow 模型的提出,与 MapReduce 模型有着异曲同工之妙。正如 MapReduce 作为一个抽象的计算模型,其影响力远超 Google 的原版 C++ 实现,Hadoop 等开源项目对 MapReduce 的实现和推广功不可没。同样,Dataflow 模型不仅提供了一个全新的计算框架,还通过推动 Apache Beam 项目,促进了流式数据处理接口的统一。这意味着,无论底层实现如何,只要遵循 Dataflow 的语义并实现相应的接口,开发者就能够编写出能够在不同系统上运行的代码,实现相同的计算结果。这种跨系统的兼容性和可移植性,为大数据处理技术的发展带来了新的活力。
总的来说,Dataflow 模型不仅是一个创新的计算模型,更是 Google 在大数据处理领域多年经验的结晶。它为流式数据处理提供了一个强大的理论基础和实践指南,推动了整个行业的发展和技术进步。随着数据规模的不断增长和业务需求的日益复杂,Dataflow 模型的重要性将愈发凸显,它将继续为开发者和企业提供高效、可靠的数据处理解决方案。
相关文章:
Flink介绍——实时计算核心论文之Dataflow论文总结
数据流处理的演变与 Dataflow 模型的革新 在大数据处理领域,流式数据处理系统的发展历程充满了创新与变革。从早期的 S4 到 Storm,再到 MillWheel,每一个系统都以其独特的方式推动了技术的进步。S4 以其无中心架构和 PE(Processi…...
Next.js 编译并运行
next build 是用于构建 Next.js 应用的命令,而运行构建后的应用则通过 next start。这里是一个简明的流程说明: ✅ 构建 Next.js 应用 next build这个命令会: 编译项目中的 TypeScript 和 JavaScript 代码;优化静态资源…...
星火燎原:Spark技术如何重塑大数据处理格局
在数字化浪潮席卷全球的今天,数据已成为企业发展与社会进步的核心驱动力。面对海量且复杂的数据,传统的数据处理技术逐渐显得力不从心。而Apache Spark作为大数据领域的明星框架,凭借其卓越的性能与强大的功能,如同一束璀璨的星火…...
LeetCode 2563.统计公平数对的数目:排序 + 二分查找
【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…...
2025深圳中兴通讯安卓开发社招面经
2月27号 中兴通讯一面 30多分钟 自我介绍 聊项目 我的优缺点,跟同事相比,有什么突出的地方 Handler机制,如何判断是哪个消息比较耗时 设计模式:模板模式 线程的状态 线程的开启方式 线程池原理 活动的启动模式 Service和Activity…...
【Redis】redis主从哨兵
Redis 主从复制 在访问量极高的场景下,单台 Redis 已难以承载所有请求,且单点故障风险高。通过主从复制,可以实现读写分离、数据备份与高可用。 概念 主节点(Master):负责写操作,将数据变更同…...
windows docker desktop 无法访问容器端口映射
为什么使用docker desktop访问映射的端口失败,而其端口对应的服务是正常的? 常见问题,容器的防火墙没有关闭!!! 以centos7为例,默认情况下防火墙处于开启状态: 这下访问就OK了...
OpenRAN 6G网络:架构、用例和开放问题
英文标题: Open RAN for 6G Networks: Architecture, Use Cases and Open Issues 作者信息 Bharat Agarwal:2016年毕业于Galgotias University,获得电气与电子工程学士学位;2023年在爱尔兰都柏林城市大学获得电子工程博士学位。2…...
《TCP/IP详解 卷1:协议》之第四、五章:ARP RARP
目录 一、ARP && RARP 报文结构 1、ARP请求报文示例 2、ARP响应报文示例 3、RARP请求报文示例 4、RARP响应报文示例 5、关于 padding 6、免费ARP 二、tcpdump 的使用 1、基本语法 2、常用选项 3、常用过滤条件 三、arp 命令的使用 1、基本语法 2、常用选…...
ttsfrd的使用
ttsfrd的作用: 文本标准化,将数字转成大写等预处理,例:数字处理123 → 一百二十三, 日期处理2023-12-25 → 2023年12月25日,特殊符号 40¥→40元。从而适合TTS朗读。 SDK模型下载 from modelsc…...
实战华为1:1方式1 to 1 VLAN映射
本文摘自笔者于2024年出版,并得到广泛读者认可,已多次重印的《华为HCIP-Datacom路由交换学习指南》。 华为设备的1 to 1 VLAN映射有1:1和N :1两种方式。1:1方式是将指定的一个用户私网VLAN标签映射为一个公网VLAN标签,是一种一对一的映射关系…...
NLP 梳理03 — 停用词删除和规范化
一、说明 前文我们介绍了标点符号删除、文本的大小写统一,本文介绍英文文章的另一些删除内容,停用词删除。还有规范化处理。 二、什么是停用词,为什么删除它们? 2.1 停用词的定义 停用词是语言中的常用词,通常语义…...
使用若依二次开发商城系统-1:搭建若依运行环境
前言 若依框架有很多版本,这里使用的是springboot3vue3这样的一个前后端分离的版本。 一.操作步骤 1 下载springboot3版本的后端代码 后端springboot3的代码路径,https://gitee.com/y_project/RuoYi-Vue 需要注意我们要的是springboot3分支。 先用g…...
HarmonyOS-ArkUI: 组件内转场(transition)
什么是组件内转场 组件内转场指的是组件在触发转场的时机所具备的动画效果。转场的时机指的是,组件元素发生变化的时候,具体为: 组件被添加组件被删除组件可见性发生变化-Visibility这些场景有时候单纯的让其消失,出现,平移有时候视觉效果会比较突兀。我们可以利用组件内…...
MVVM框架详解:原理、实现与框架对比
文章目录 1. 引言2. MVVM的基本概念3. MVVM的原理与实现3.1 数据绑定原理3.2 命令模式实现 4. MVVM的优势与局限性4.1 优势4.2 局限性 5. 常见MVVM框架对比5.1 MVVM Light5.2 Prism5.3 Caliburn.Micro5.4 MvvmCross5.5 ReactiveUI 6. 实际应用示例7. 最佳实践与注意事项7.1 MVV…...
opencv--图像处理
这里所说的图像处理并不是专业术语,而是值开发人员对图像的处理技术方法。 教程 菜鸟教程 书籍推介--<opencv4.5 计算机视觉开发实践 基于vc>.朱文伟 获取图像数据 三种方式: cv::VideoCapture: OpenCV 提供的视频捕获类࿰…...
达梦官方管理工具 SQLark——全面支持达梦、Oracle、MySQL、PostgreSQL 数据库!
SQLark 是一款面向信创应用开发者的数据库开发和管理工具,用于快速查询、创建和管理不同类型的数据库系统,已支持达梦、Oracle、MySQL数据库;在最新的 V3.4 版本中,SQLark 新增了对 PostgreSQL 的支持,兼容 PostgreSQL…...
解读大型语言模型:从Transformer架构到模型量化技术
一、生成式人工智能概述 生成式人工智能(Generative Artificial Intelligence)是一种先进的技术,能够生成多种类型的内容,包括文本、图像、音频以及合成数据等。其用户界面的便捷性极大地推动了其广泛应用,用户仅需在…...
理解计算机系统_网络编程(1)
前言 以<深入理解计算机系统>(以下称“本书”)内容为基础,对程序的整个过程进行梳理。本书内容对整个计算机系统做了系统性导引,每部分内容都是单独的一门课.学习深度根据自己需要来定 引入 网络是计算机科学中非常重要的部分,笔者过去看过相关的内…...
前端面试场景题
目录 1.项目第一次加载太慢优化 / vue 首屏加载过慢如何优化 2.说说了解的es6-es10的东西有哪些 ES6(ES2015)之后,JavaScript 新增了许多实用的数组和对象方法,下面为你详细介绍: 3.常见前端安全性问题 XSS&#…...
Unity使用Rider的常用快捷键
最近换了IDE,改用Rider进行Unity的代码编写 Rider提供了几个快捷键方案供选择,默认的是Visual Studio的快捷键方案。我索性直接选择了Rider的快捷键方案,一则这2年搞H5没用Visual Studio,快捷键已经忘的差不多了;二则…...
Spring Boot + MyBatis 动态字段更新方法
在Spring Boot和MyBatis中,实现动态更新不固定字段的步骤如下: 方法一:使用MyBatis动态SQL(适合字段允许为null的场景) 定义实体类 包含所有可能被更新的字段。 Mapper接口 定义更新方法,参数为实体对象&…...
Unity多线程渲染指令队列设计与集成技术详解
一、多线程渲染架构设计背景 1. 传统渲染管线瓶颈分析 阶段单线程耗时占比可并行化潜力场景遍历与排序35%★★★★☆材质属性更新20%★★★★★GPU指令提交25%★★☆☆☆资源上传20%★★★★☆ 2. 多线程渲染优势 CPU核心利用率:从单线程到全核心并行 指令缓冲优…...
栈和队列学习记录
一、栈 1.栈的概念 操作受限的线性表-----栈:栈只允许在表的一端进行插入和删除操作,这一端被称为栈顶(Top),另一端则是栈底(Bottom)。这种受限的操作方式使得栈遵循后进先出(LIFO…...
位运算练习:起床困难综合征(贪心,位运算)【算法竞赛进阶指南学习笔记】
目录 前情提要起床困难综合征(贪心,位运算) 前情提要 一些基础运算操作用法看看上一篇; 起床困难综合征(贪心,位运算) 题目原文 [P2114 NOI2014] 起床困难综合症 - 洛谷 思路分析 题目很长…...
ubuntu24设置拼音输入法,解决chrome不能输入中文
## 推荐方案:使用 Fcitx5 Fcitx5 是当前在 Wayland 环境下兼容性最好的输入法框架。 ### 1. 安装 Fcitx5 bash sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk3 fcitx5-frontend-gtk4 fcitx5-frontend-qt5 fcitx5-module-c…...
React SSR + Redux 导致的 Hydration 报错踩坑记录与修复方案
一条“Hydration failed”的错误,让我损失了半天时间 背景 我在用 Next.js App Router Redux 开发一个任务管理应用,一切顺利,直到打开了 SSR(服务端渲染),突然看到这个令人头皮发麻的报错: …...
轻量级景好鼠标录制器
景好鼠标录制器(详情请戳 官网)是一款免费无广的键鼠动作录制/循环回放工具,轻松自动化应对一些重复繁琐的操作任务,如来回切换窗口、文档同一相对位置的复制粘贴等场景,兼容Win XP - 11 。毕竟此款本身主打简约类型&a…...
leetcode--两数之和 三数之和
1.两数之和 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 < index1 < index2 …...
FFMPEG-视频解码-支持rtsp|rtmp|音视频文件(低延迟)
本人亲测解码显示对比延迟达到7到20毫秒之间浮动兼容播放音视频文件、拉流RTSP、RTMP等网络流 基于 Qt 和 FFmpeg 的视频解码播放器类,继承自 QThread,实现了视频流的解码、播放控制、帧同步和错误恢复等功能 工作流程初始化阶段: 用户设置URL和显示尺寸 调用play()启动线程解…...
