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 模型的重要性将愈发凸显,它将继续为开发者和企业提供高效、可靠的数据处理解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arduino 入门学习笔记(五):KEY实验

Arduino 入门学习笔记(五):KEY实验 开发板:正点原子ESP32S3 例程源码在文章顶部可免费下载(审核中…) 1. GPIO 输入功能使用 1.1 GPIO 输入模式介绍 在上一文章中提及到 pinMode 函数, 要对…

Centos9安装docker

1. 卸载docker 查看是否安装了docker yum list | grep docker卸载老版本docker,拷贝自官网 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine卸载新版本…

Pgvector+R2R搭建RAG知识库

背景 R2R是一个采用Python编写的开源AI RAG框架项目,与PostgreSQL技术栈集成度高,运行需求资源少(主要是本人的Macbook air m1内存只有8G)的特点,对部署本地私有化化AI RAG应用友好。 Resource Recommendations Whe…

go中redis使用的简单介绍

目录 一、Redis 简介 二、Go中Redis的使用 1. 安装Go Redis包 2. 单机模式 连接示例 3. 哨兵模式 依赖 连接示例 三、Redis集群 1. 集群模式 集群部署 部署结构 使用redis-cli创建集群 连接示例 四、常用数据结构与操作 1. 字符串(String&#xff0…

北京工业大学25计专上岸经验分享

1.个人情况介绍 本科就读于河北双非,专业为计算机科学与技术,四级三次498,六级两次460,拿过几次校级奖学金,竞赛经历有蓝桥杯国三、数学竞赛省二。本科成绩排名靠前,保研保7排8,遗憾选择考研继…

在 Ubuntu 24.04 系统上安装和管理 Nginx

1、安装Nginx 在Ubuntu 24.04系统上安装Nginx,可以按照下面的步骤进行: 1.1、 更新系统软件包列表 在安装新软件之前,需要先更新系统的软件包列表,确保获取到最新的软件包信息。打开终端,执行以下命令: …

HarmonyOS4+NEXT星河版入门与项目实战(26)-----版本控制与代码托管

引言 随着移动应用开发技术的不断进步,华为推出的鸿蒙操作系统(HarmonyOS)以及其配套的集成开发环境DevEco Studio逐渐成为开发者关注的焦点。对于新手开发者来说,掌握版本控制和代码托管不仅是提高工作效率的关键,也是团队协作的重要基础。本文将介绍如何在使用DevEco S…

利用Arcgis自己绘制shp文件

1.选择自己想要创建的shp文件的位置 我是直接创建在连接文件夹中 2.右键-新建-shp 3.设置名称、要素类型、空间参考 4、点击创建要素 5、右侧选择图层、创建面 6、开始绘制,双击任意位置结束绘制 之后可以改一下shp文件的名字

【C/C++】深入理解指针(六)

文章目录 深入理解指针(六)1.sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对⽐ 2.数组和指针笔试题解析2.1 ⼀维数组2.2 字符数组代码1:代码2:代码3:代码4:代码5:代码6: 2.3 ⼆维数组 3.…

探索大语言模型(LLM):语言模型从海量文本中无师自通

文章目录 引言:当语言模型学会“自己教自己”一、自监督学习:从“无标签”中挖掘“有监督”信号二、语言模型的自监督训练范式:两大经典路径1. 掩码语言模型(Masked Language Modeling, MLM)——以BERT为例2. 自回归语…

2025.5.4机器学习笔记:PINN文献阅读

2025.5.4周报 文献阅读题目信息摘要创新点网络架构实验结论不足以及展望 文献阅读 题目信息 题目: Physics-Informed Neural Network Approach for Solving the One-Dimensional Unsteady Shallow-Water Equations in Riverine Systems期刊: Journal o…

Unity Post Processing 小记 【使用泛光实现灯光亮度效果】

一、前言 本篇适用于Unity 2018 - 2019及以上版本,以默认渲染管线为例。文章内容源于个人研究尝试与网络资料收集,可能存在不准确之处。初衷是因新版本制作时老的Bloom插件失效,经研究后分享开启Bloom效果的方法。若在项目中使用Post Proces…

牟乃夏《ArcGIS Engine地理信息系统开发教程》学习笔记3-地图基本操作与实战案例

目录 一、开发环境与框架搭建 二、地图数据加载与文档管理 1. 加载地图文档(MXD) 2. 动态添加数据源 三、地图浏览与交互操作 1. 基础导航功能 2. 书签管理 3. 量测功能 四、要素选择与属性查询 1. 属性查询 2. 空间查询 五、视图同步与鹰眼…

Qt指ModbusTcp协议的使用

Modbus 是一套通信“语言”(协议),而 RS485 / RS232 / TCP 是通信“管道”(物理接口)。 编写modubusTcp程序,避免不了调试,首先用到的两个工具助手 poll是主机,slave是从机。主机也就是发送数据…

探索大语言模型(LLM):自监督学习——从数据内在规律中解锁AI的“自学”密码

文章目录 自监督学习:从数据内在规律中解锁AI的“自学”密码一、自监督学习的技术内核:用数据“自问自答”1. 语言建模:预测下一个单词2. 掩码语言模型(MLM):填补文本空缺3. 句子顺序预测(SOP&a…

CentOS7.9安装Python 3.10.11并包含OpenSSL1.1.1t

1. 安装编译 Python 所需的依赖包 yum -y install gcc make zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel wget2. 安装 OpenSSL 1.1.1 或更新版本 (自定义路径安装的 OpenSSL 1.1.1 不会影响系统原有的…

qt事件过滤与传递机制

当点击 QLabel 时,正常情况下并不会直接触发 MyWidget 的 mousePressEvent 函数,原因在于事件的传递机制和事件过滤器的存在。下面详细分析这个过程: 事件传递机制 在 Qt 里,事件的传递是从子控件往父控件冒泡的。不过&#xff…

ubuntu 安装ollama后,如何让外网访问?

官网下载linux版本:https://ollama.com/download/linux 1、一键安装和运行 curl -fsSL https://ollama.com/install.sh | sh 2、下载和启动deepseek-r1大模型 ollama run deepseek-r1 这种方式的ollama是systemd形式的服务,会随即启动。默认开启了 …

kotlin与MVVM结合使用总结(三)

1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM(Model - View - ViewModel)架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层,实现了视图和数据的分离,提高了代码的可维护性和可测试性…

A系统使用iframe嵌套B系统时登录跨域问题!

我这边两个项目都是独立的,问题是做了跨域配置之后点击登录接口调用成功但是页面没有跳转进去 显示以下报错 这个错误明确指出了问题的核心原因:由于跨站点Cookie设置未正确声明SameSiteNone,导致浏览器拦截了Cookie。这是现代浏览器&#x…