大图书馆 #9 《流计算系统图解》书评

news2024/7/2 4:00:23

上周,我收到清华大学出版社编辑寄来的新书《流计算系统图解》。趁着周末的功夫,我快速浏览了本书的主要内容。一句话评价:值得一读,尤其是对开始开发流计算任务或系统一到两年,初步实现过一些功能或作业,但是还没有对流式系统建立起系统认识的开发者。

2cba84f9d53374e058145d7c7f224559.jpeg

本书作者是两位 Apache Heron (incubating) 项目的 PMC 成员,Heron 是源自 Twitter 的计划取代 Storm 的流计算系统。据称,两位原本是打算写一本 Heron 的系统介绍,但是考虑到绑定具体系统,很难公平地介绍清楚流计算的基础概念和实现方向,最终选择以图解的方式讲解流式系统的设计重点和难点。

巧合的是,Heron 项目社群后续发展不顺利,已于今年一月放弃孵化[1]。本书不局限于特定项目的定位,反而使得它能够在今天仍然有足够的价值被翻译。

本书译者是傅宇、黄鹏程和张晨。这几位都是流计算系统的专家。如果有读者关注数据处理系统的出版,可能还会知道他们合作翻译过另一本著作《Presto 实战》。应该说,这几位译者在 Data Infra 领域的经验和外文著作翻译的经验都是值得信赖的。

回到这本《流计算系统图解》上来。

本书一大特点就是书名点出的以图解方式介绍流计算系统。流计算作业通常包括多个阶段,每个阶段可以设置并行度,不同阶段之间可以用多种方式连接。一旦流计算作业运行起来,其不同阶段的算子通常会长时间运行,从而形成一个长期在线的流计算执行拓扑图。事件如何产生,如何在不同算子之间流转,连续事件处理的顺序和跨越算子不同扇入扇出时的分发机制,不画图可能还真说不清楚。

本书的另一大特点是提供了各个章节系统讲解的在线参考代码[2]。两位作者删繁就简,设计实现了一个简单的流计算参考系统,并在概念讲解中穿插基于这个系统的实例演示。我在浏览过程中针对一些有趣的主题测试过这份在线代码,应该说,两位作者是用心设计的,读者可以阅读代码理解流计算系统的基础结构,也可以做一些 HACKING 验证书中提出的一些发散的问题和想法。

下面介绍一下本书各个章节的关注点,并附上我写过的文章或者相关章节参考资料。

第一章和第二章是对数据处理系统和流计算系统的简介和 Hello World 示例。

第三章介绍了流计算中的数据并行和任务并行。

这个主题非常重要。因为流计算要想在大数据量下取得良好的延迟和吞吐体验,合理的并行设计是必不可少的。并行的策略会影响数据分发的形式,事件处理的顺序和算子状态的管理。

第四章讨论了流计算作业的拓扑结构。主要介绍的是 DAG 的形式,以及不同算子对应的扇入扇出及其性质。

DAG 也是流计算系统主要支持的作业拓扑结构,目前最热门的流计算系统 Flink 实现的也是 DAG 拓扑结构的作业调度。除此之外,可以补充阅读 Naiad[3] 论文。这篇论文里介绍了用于流图上迭代计算的环结构,其开源实现是 Timely Dataflow[4] 库,被用在流数据库 Materialize 上。不过上次看的时候,Materialize 并未利用上 Timely Dataflow 的迭代计算能力,现如今也不标榜自己是流数据库了,令人唏嘘。

第五章讨论了流计算作业的事件送达语义,即经典的至多一次(At-Most Once)、至少一次(At-Least Once)和恰好一次(Exactly Once)。

书中点出了恰好一次根本是实际一次(Effectively Once),即是通过重试和幂等实现的,而不是真的只投递一次消息并能确保下游收到。这个认识对理解恰好一次语义是至关重要的。

关于流式系统中的恰好一次语义,我也写过一篇文章 Exactly Once[5] 做讨论。其他参考材料如下:

  • An Overview of End-to-End Exactly-Once Processing in Apache Flink[6]

  • 《流式系统》[7]第五章 Exactly-Once and Side Effects

第六章是对前面几章的总结和开启第二部分进阶话题的序章。

第七章讨论了流式系统中的窗口计算。窗口其实可以理解成流计算中的攒批计算,跟批处理中的微批模式形成某种对偶。不过,窗口计算有着语义上的需求,而微批模式主要是性能上的需求。

关于窗口计算和水位线,我写过 Window[8] 和 Watermark 两篇文章。其他参考材料如下:

  • The Dataflow Model[9]

  • 《流式系统》第三章和第四章

其中,The Dataflow Model 是 Google 流计算的经典论文,Dataflow 模型的开山之作。这篇论文当中,主要讨论的就是如何设计和实现一个带窗口计算的流计算系统。

第八章讨论了 JOIN 操作,主要涉及到流和表的共轭关系或者说数据的流表二象性。

本书从算子扇入扇出切入,把 JOIN 作为一种特殊的扇入方式引进,还是比较自然的。现实世界中,最复杂的流计算就是涉及双流 JOIN 或维表 JOIN 的计算。书中先从表是流的物化视图引进,接着讨论不同类型的 JOIN 对应的效率和数据完整性考量。

这部分内容涉及《流式系统》整个第二部分,足以见其复杂

第九章讨论了反压。前面提到,流计算系统通常是长期在线运行的系统,因此它需要应对潜在的在线流量洪峰。

反压实际上是一个在线系统实现层面的细节,并不完全跟流计算系统相绑定。关于反压的问题,我推荐 Flink China 社群早年录制的一个教程《Flink 网络流控与反压剖析》[10]

第十章讨论了有状态计算。实际上,在前面讨论送达语义、窗口计算和 JOIN 操作的时候,或多或少都涉及到了流式系统中的状态管理。

领我入门流计算领域的施晓罡博士说过,Flink 的创造性价值,不在于流计算,而在于实现了带状态的流计算。把状态管理内化到流计算系统的设计当中,解决了 Storm 等系统依赖外部状态存储导致的数据一致性很难保证的问题。直到今天,Flink 官网上巨大的 Slogan 仍然是:数据流上的有状态计算。

951032ee6b8d718373262b996c45aacf.png

关于这个主题,我写过一篇文章 State[11] 讨论。其他参考资料如下:

  • Lightweight Asynchronous Snapshots for Distributed Dataflows[12]

  • From Aligned to Unaligned Checkpoints[13]

第十一章终章是对前面章节的总结和展望。

关于其他流式系统的参考资料,我写过一份书单《流式系统阅读指南》。

最后,我想引用《流计算系统图解》最后一节的内容,给有志于深入学习和实践流计算系统的读者分享一些参与方向:

挑选一个开源项目来学习,甚至直接参与到开源项目当中。

开源运动让我们平等地接触到业内领先的流计算系统。它们的代码实现和设计文档,甚至设计过程的讨论和用户使用的反馈都唾手可得。学习流计算从来没有一个时候像现在这样简单。

  • Apache Flink[14] 无可争议的顶级开源流计算系统。

  • Apache Spark[15] 无论如何,Spark Streaming 的用户基数还是很大的,并且它也确实适合一些流计算的场景。

  • Apache Beam[16] Dataflow 的开源实现。

  • RisingWave[17] 译者之一傅宇参与的开源项目。虽然项目还很年轻,缺乏生产案例,但是这也意味着巨大的技术实践空间。我推荐它主要是因为项目设计文档丰富详实,以及核心开发者们乐于分享和交流。

  • Materialize[18] 这个并不是开源软件,但是源码可以自由阅读。同时代码仓库中也有非常丰富的设计讨论和文档。

开始写博客,传授你所学的知识。

上面的参考资料中包括了不少我自己写的博客。在流计算的国内传播上,云邪的博客[19]起到了很大的作用,不少人第一次深入了解流计算就是从阅读他的博客开始的。另外,林小铂的博客[20]也值得一读。当然,还有 Flink 的博客[21]。主动分享和交流是开源开发者技术进步的阶梯。

参加聚会和会议。

Flink Forward 大会几乎每年都会在中国举办。此外,随着 RisingWave 和一系列 MQ 社群的崛起,流计算相关的聚会和会议只会越来越多。

永不放弃。原文写到:

要实现任何卓越的目标,都需要经历一次又一次的失败。接受失败,这将使你变得更优秀。

参考资料

[1]

今年一月放弃孵化: https://lists.apache.org/thread/374rqg8s5j532qs6tcdw6zjc9c11p55w

[2]

在线参考代码: https://github.com/nwangtw/GrokkingStreamingSystems

[3]

Naiad: https://sigops.org/s/conferences/sosp/2013/papers/p439-murray.pdf

[4]

Timely Dataflow: https://github.com/timelyDataflow/timely-dataflow/

[5]

Exactly Once: https://zhuanlan.zhihu.com/p/102607983

[6]

An Overview of End-to-End Exactly-Once Processing in Apache Flink: https://flink.apache.org/2018/02/28/an-overview-of-end-to-end-exactly-once-processing-in-apache-flink-with-apache-kafka-too/

[7]

《流式系统》: https://book.douban.com/subject/34439870/

[8]

Window: https://zhuanlan.zhihu.com/p/103890281

[9]

The Dataflow Model: https://research.google/pubs/pub43864/

[10]

《Flink 网络流控与反压剖析》: https://www.bilibili.com/video/BV124411P7V9

[11]

State: https://zhuanlan.zhihu.com/p/119305376

[12]

Lightweight Asynchronous Snapshots for Distributed Dataflows: https://arxiv.org/abs/1506.08603

[13]

From Aligned to Unaligned Checkpoints: https://flink.apache.org/2020/10/15/from-aligned-to-unaligned-checkpoints-part-1-checkpoints-alignment-and-backpressure/

[14]

Apache Flink: https://github.com/apache/flink

[15]

Apache Spark: https://github.com/apache/spark

[16]

Apache Beam: https://github.com/apache/beam

[17]

RisingWave: https://github.com/risingwavelabs/risingwave

[18]

Materialize: https://github.com/MaterializeInc/materialize

[19]

云邪的博客: https://wuchong.me/

[20]

林小铂的博客: https://www.whitewood.me/

[21]

Flink 的博客: https://flink.apache.org/posts/

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

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

相关文章

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路: class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值,除数是1,返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

Java注解(Annotation)的基本知识

Java注解(Annotation)的基本知识 此文的目的只在于了解的注解的基本知识,知道注解的一些概念,使能够看懂注解的使用。 注解概述 Java 注解(Annotation)又称 Java 标注,使 JDK5.0 引入的一种注释机制。Java 语言中的…

ChatGPT 也并非万能,品牌如何搭上 AIGC「快班车」

内容即产品的时代,所见即所得,所得甚至超越所见。 无论是在公域的电商平台、社交媒体,还是品牌私域的官网、社群、小程序,品牌如果想与用户发生连接,内容永远是最前置的第一要素。 01 当内容被消费过,就…

PC访问华为昇腾开发板的摸索过程

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 最近要折腾华为昇腾开发板(官方名称叫:Atlas 200I DK)。先是按照官方教程折腾:Atlas200DK环境部署。我发现…

【bug 回顾】上传图片超时

测试 bug 问题分析 - 上传图片超时 最近在测试上遇到一个莫名奇妙的问题,最后也没有得到具体是哪块的原因,看各位大佬有没有思路?? 一 、背景 现在我们有三台服务器,用来布两套环境。其中另外一台服务器3配置的 tom…

邦永PM2项目管理系统 SQL注入漏洞复现

0x01 产品简介 邦永PM2项目管理系统科学地将项目管理思想和方法和谐、统一,使得长期以来困扰项目管理工作者的工期、进度、投资和成本情况无法整体动态管理的问题得到了全面而彻底的解决。 0x02 漏洞概述 邦永科技PM2项目管理平台Global_UserLogin.aspx接口处未对用…

打不开clickonce问题解决过程

1.用户电脑user文件夹下有xx和xx.1两个账户,原先安装在xx账户下,后修了电脑原数据保留在xx.1,新创建XX,之后clickonce就打不开了表现为没有反应,,删除注册表和appdata都只能正常安装,但是不能打开,没有任何报错,发现在我的电脑下打开有这样的提示,,在用户电脑上没有 尝试通过修…

解决ESP32内部RAM内存不足的问题

一,为什么需要外部RAM ESP32有520kB的内部RAM空间可以使用,这对于一般的情况是够用的,但是如果设备需要涉及音频或者显示图像等处理时,需要更大的内存空间来处理这些数据。ESP32支持扩展外部RAM,其实乐鑫已经在其ESP32…

FPGA设计时序约束九、others类约束之Group Path

目录 一、序言 二、Group Path 2.1 基本概念 2.2 设置界面 2.3 命令语法 2.4 命令示例 三、工程示例 四、参考文件 一、序言 在Vivado的时序约束窗口中,存在一类特殊的约束,划分在others目录下,可用于设置忽略或修改默认的时序路径分…

轻量级压测工具Apache Bench实战

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

【考研数学】数学一“背诵”手册(一)| 高数部分(2)

文章目录 引言一、高数级数空间解析几何球坐标变换公式零碎公式 写在最后 引言 高数一篇文章还是写不太下,再分一些到这里来吧 一、高数 级数 阿贝尔定理:若级数 ∑ a n x n \sum a_nx^n ∑an​xn 当 x x 0 xx_0 xx0​ 时收敛,则适合不…

HCIA-Datacom跟官方路线学习

通过两次更换策略。最后找到最终的学习方案,华为ICT官网有对这个路线的学习,hcia基础有这个学习路线,hcip也有目录路线。所以,最后制定学习路线,是根据这个认证的路线进行学习了: 官网课程:课程…

马斯克震撼演讲:我想创立一个新世界

目录 1拼多多杀入大模型领域:年薪百万招聘人才 2马斯克震撼演讲:我想创立一个新世界 3文心4.0上线首交答卷:百度2023Q3成色如何 1拼多多杀入大模型领域:年薪百万招聘人才 快科技11月22日消息,据国内媒体报道&#x…

阿里云跨账号建立局域网

最近有活动,和好友一并薅了下阿里云的羊毛。琢磨着两台机器组一个局域网,于是有了这个需求,把步骤记录一下: 假设两台机器叫A和B,我们开始进行建立和组网 1. 建立ECS 把A机器公共环境装好,然后使用《实例与…

OceanBase:集群常见操作

目录 1.查看 OBD 管理的集群列表 2.查看某个集群状态 3.启动 OceanBase 集群 4.连接 OceanBase 集群 5.停止运行中的集群 6.销毁已部署的集群 7.查看集群配置项 8.修改集群配置项 1.查看 OBD 管理的集群列表 obd cluster list 2.查看某个集群状态 obd cluster displa…

【喜报】云贝学员顺利通过OceanBase 数据库上机实验,OBCP证书到手了!!!

恭喜LIU同学历经2月,经过郭老师考前辅导顺利拿下OBCP证书! 考试形式 OBCP V3.0考试分为笔试考试和实验考试两部分。 笔试考试: 考试形式:线下考点考试(官网预约) 考试时长: 90分钟 题目一共66道题(从题库中随机抽取&#xff…

Instant Web API .Net Core Crack

Instant Web API .Net Core 是立即构建即时数据库 Web API,无需编码。在几分钟内生成您的 Web API,以更快地构建应用程序。使用 VS 2022 和 Entity Framework Core 为任何 MS SQL 数据库生成 Web API。 新功能 - 使用 Visual Studio 2022 为 PostgreSQL …

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一:方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二:(大佬讲解) 不同路径 //机器人不同的路径进入到指定的地点 publ…

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法,求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径(即列出从根节点到该叶子节点的节点序列),若这样…

【JavaEE】Spring更简单的存储和获取对象(类注解、方法注解、属性注入、Setter注入、构造方法注入)

一、存储Bean对象 在这篇文章中我介绍了Spring最简单的创建和使用:Spring的创建和使用 其中存储Bean对象是这样的: 1.1 配置扫描路径 想要成功把对象存到Spring中,我们需要配置对象的扫描包路径 这样的话,就只有被配置了的包…