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

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

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.mzph.cn/news/159729.shtml

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

相关文章

二蛋赠书九期:《机器学习图解》

前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此,我非常感激大家一直…

基于C#实现AC自动机算法

我要检查一篇文章中是否有某些敏感词,这其实就是多模式匹配的问题。当然你也可以用 KMP 算法求出,那么它的时间复杂度为 O(c*(mn)),c:为模式串的个数。m:为模式串的长度,n:为正文的长度,那么这个复杂度就不…

Autocad2020切换经典界面

Autocad2020切换经典界面 1.更改1.1设置另存为 1.更改 1.1设置另存为

迅为RK3568开发板学习之Linux驱动篇第十三期输入子系统

驱动视频全新升级,并持续更新~更全,思路更科学,入门更简单。 迅为基于iTOP-RK3568开发板进行讲解,本次更新内容为第十三期,主要讲解输入子系统,共计24 讲。 关注B站:北京迅为电子,在…

多线程的重要资料-信号量

(1)https://www.cnblogs.com/ike_li/p/8984186.html (2)C#关于AutoResetEvent的使用介绍 | 康瑞部落 (3)AutoResetEvent用法(一)_autoresetevent 的用法-CSDN博客 (4)c++ - Is there an easy way to implement AutoResetEvent in C++0x? - Stack Overflow (5)

PAT甲级 1069 字符串处理

1069 The Black Hole of Numbers 分数 20 For any 4-digit integer except the ones with all the digits being the same, if we sort the digits in non-increasing order first, and then in non-decreasing order, a new number can be obtained by taking the second nu…

赛轮集团SAILUN方程式赛车轮胎震撼登场,开启新篇章

11月初,在厦门国际赛车场,SAILUN方程式赛车轮胎展现出令人瞩目的实力,成功完成了首次震撼亮相。这一引人注目的表现为未来的赛车轮胎技术发展打开了崭新的一页。 在这次首次亮相的测试中,职业车手巧妙操控着SAILUN方程式赛车轮胎&…

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库

解决Vision Transformer在任意尺寸图像上微调的问题:使用timm库 文章目录 一、ViT的微调问题的本质二、Positional Embedding如何处理1,绝对位置编码2,相对位置编码3,对位置编码进行插值 三、Patch Embedding Layer如何处理四、使…

气膜体育馆:低碳环保体育新潮流

在追求健康生活的今天,体育运动的重要性无法忽视。为了满足人民日益增长的体育需求,气膜体育馆应运而生,成为体育场馆领域的一次革命性创新。这种新型体育馆解决了传统体育场馆建设中面临的审批难、周期长、门槛高等问题,为我们的…

马蹄集oj赛(双周赛第十五次)

目录 小码哥的开心数字 淘金者 捡麦子 小码哥玩游戏 手机测试 自动浇花机 买月饼 未来战争 双人成行 魔法水晶球 ​编辑自驾游 文章压缩 银河贸易市场 小码哥的开心数字 子难度:青铜 0时间限制:1秒 巴占用内存:64M 小码哥有超能…

深入浅出 Linux 中的 ARM IOMMU SMMU I

Linux 系统下的 SMMU 介绍 在计算机系统架构中,与传统的用于 CPU 访问内存的管理的 MMU 类似,IOMMU (Input Output Memory Management Unit) 将来自系统 I/O 设备的 DMA 请求传递到系统互连之前,它会先转换请求的地址,并对系统 I…

海外IP代理:数据中心代理IP是什么?好用吗?

数据中心代理是代理IP中最常见的类型,也被称为机房IP。这些代理服务器为用户分配不属于 ISP(互联网服务提供商)而来自第三方云服务提供商的 IP 地址。数据中心代理的最大优势——它们允许在访问网络时完全匿名。 如果你正在寻找海外代理IP&am…

【JavaSE】-4-单层循环结构

回顾 运算符: 算术 --、逻辑 && & || |、比较 、三元 、赋值 int i 1; i; j i; //j2 i3 syso(--j"-----"i) //1 3 选择结构 if(){} if(){}else{} if(){}else if(){}else if(){}else{}//支持byte、short、int //支持char //支持枚举…

力扣labuladong——一刷day47

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣993. 二叉树的堂兄弟节点二、力扣1315. 祖父节点值为偶数的节点和三、力扣1448. 统计二叉树中好节点的数目四、力扣1469. 寻找所有的独生节点 前言 二叉…

动态规划:2304. 网格中的最小路径代价

2304. 网格中的最小路径代价 给你一个下标从 0 开始的整数矩阵 grid ,矩阵大小为 m x n ,由从 0 到 m * n - 1 的不同整数组成。你可以在此矩阵中,从一个单元格移动到 下一行 的任何其他单元格。如果你位于单元格 (x, y) ,且满足…

网络安全之渗透测试入门准备

渗透测试入门所需知识 操作系统基础:Windows,Linux 网络基础:基础协议与简单原理 编程语言:PHP,python web安全基础 渗透测试入门 渗透测试学习: 1.工具环境准备:①VMware安装及使用&#xff1b…

JAVA SQL

-- /* */ -- 简单查询: -- 查询所有字段: select * from 表名 -- *:通配符,代表所有 select * from employees -- 查询部分字段: select 列名1,列名2,.. from 表名 -- 查询员工ID,员工姓名,员工的工资 select employee_id,salary,first_name from employees -- 查…

花木兰从军

《花木兰从军》 作家/罗光记 在遥远的古代,有一位英勇的女子,名叫花木兰。她以一介女子的柔弱之躯,披挂上阵,驰骋沙场,成为了那个时代最为传奇的英雄。 花木兰出生在一个普通的农家,从小便被…

云原生Docker系列 | docker-compose自动编排使用

云原生Docker系列 | docker-compose自动编排使用 1. yaml文件格式要求2. 使用docker compose搭建博客3. docker compose 命令总结1. yaml文件格式要求 yaml是以空格缩进来控制层级关系,不能使用Tab键,而且大小写敏感的。参数要遵循驼峰写法如:imagePullPolicy    yaml缩进…

BUUCTF--[ACTF2020 新生赛]Include

目录 1、本题详解 2、延伸拓展 1、本题详解 访问题目链接 有一个tips的链接,我们点击 请求了file,内容是flag.php的内容:Can you find out the flag? 尝试请求一下index.php 并没有发现什么信息 flag.php也没发现什么 尝试爆破一下它的…