news 2026/6/10 15:02:07

Pipeline:Beam如何抽象多步骤的数据流水线?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pipeline:Beam如何抽象多步骤的数据流水线?

你好,我是程序员贵哥。

今天我要与你分享的主题是“Pipeline:Beam如何抽象多步骤的数据流水线”。

在上两讲中,我们一起学习了Beam是如何抽象封装数据,以及如何抽象对于数据集的转换操作的。在掌握了这两个基本概念后,我们就可以很好地回答Beam编程模型里的4个维度What、Where、When、How中的第一个问题——What了。也就是,我们要做什么计算?想得到什么样的结果?

这个时候你可能已经跃跃欲试,开始想用PCollection和Transform解决我们平常经常会使用到的批处理任务了。没有问题,那我们就先抛开Where、When和How这三个问题,由简至繁地讲起。

现在假设我们的数据处理逻辑只需要处理有边界数据集,在这个情况下,让我们一起来看看Beam是如何运行一套批处理任务的。

数据流水线

在Beam的世界里,所有的数据处理逻辑都会被抽象成**数据流水线(Pipeline)**来运行。那么什么是数据流水线呢?

Beam的数据流水线是对于数据处理逻辑的一个封装,它包括了从读取数据集将数据集转换成想要的结果输出结果数据集这样的一整套流程。

所以,如果我们想要跑自己的数据处理逻辑,就必须在程序中创建一个Beam数据流水线出来,比较常见的做法是在main()函数中直接创建。

Java

PipelineOptions options = PipelineOptionsFactory.create(); Pipeline p = Pipeline.create(options);

在创建Beam数据流水线的同时,我们必须给这个流水线定义一个选项(Options)。这个选项会告诉Beam,用户的Pipeline应该如何运行。例如,是在本地的内存上运行,还是在Apache Flink上运行?关于具体Beam选项的解释,我会在第30讲中展开讲解。

Beam数据流水线的应用

有了数据流水线这个抽象概念之后,我们就可以将PCollection和Transform应用在这个流水线里面了。

上图就是一个Beam的数据流水线,整个数据流水线包括了从读取数据,到经过了N个Transform之后输出数据的整个过程。

在第24讲中我们学习过PCollection的不可变性。也就是说,一个PCollection一经生成,我们就不能够再增加或者删除它里面的元素了。所以,在Beam的数据流水线中,每次PCollection经过一个Transform之后,流水线都会新创建一个PCollection出来。而这个新的PCollection又将成为下一个Transform的新输入。

在上图的示例中,Beam数据流水线在经过Transform1读取了输入数据集之后,会创建出一个新的PCollection1,而经过了Transform2之后,数据流水线又会创建出新的PCollection2出来,同时PCollection1不会有任何改变。也就是说,在上面的例子中,除去最终的输出结果,数据流水线一共创建了3个不同的PCollection出来。

这种特性可以让我们在编写数据处理逻辑的时候,对同一个PCollection应用多种不同的Transfrom。

例如下图所示,对于PCollection1,我们可以使三个不同的Transform应用在它之上,从而再产生出三个不同的PCollection2、PCollection3和PCollection4出来。

Beam数据流水线的处理模型

在了解完Beam数据流水线高度抽象的概念后,紧接着,我想和你介绍一下Beam数据流水线的处理模型,也就是数据流水线在运行起来之后,会发生些什么,它是如何处理我们定义好的PCollection和Transform的。

Beam数据流水线的底层思想其实还是动用了MapReduce的原理,在分布式环境下,整个数据流水线会启动N个Workers来同时处理PCollection。而在具体处理某一个特定Transform的时候,数据流水线会将这个Transform的输入数据集PCollection里面的元素分割成不同的Bundle,将这些Bundle分发给不同的Worker来处理。

Beam数据流水线具体会分配多少个Worker,以及将一个PCollection分割成多少个Bundle都是随机的。但Beam数据流水线会尽可能地让整个处理流程达到完美并行(Embarrassingly Parallel)。

我想举个几个例子让你更好地来理解这个概念。

假设在数据流水线的一个Transform里面,它的输入数据集PCollection是1、2、3、4、5、6这个6个元素。数据流水线可能会将这个PCollection按下图的方式将它分割成两个Bundles。

当然,PCollection也有可能会被分割成三个Bundles。

那数据流水线会启用多少个Worker来处理这些Bundle呢?这也是任意的。还是以刚刚的PCollection输入数据集作为例子,如果PCollection被分割成了两个Bundles,数据流水线有可能会分配两个Worker来处理这两个Bundles。

甚至有可能只分配一个Worker来处理这两个Bundles。

在多步骤的Transforms中,一个Bundle通过一个Transform产生出来的结果会作为下一个Transform的输入。

之前刚刚讲过,在Beam数据流水线中,抽象出来的PCollection经过一个Transform之后,流水线都会新创建一个PCollection出来。同样的,Beam在真正运行的时候,每一个Bundle在一个Worker机器里经过Transform逻辑后,也会产生出来一个新的Bundle,它们也是具有不可变性的。像这种具有关联性的Bundle,必须在同一个Worker上面处理。

我现在来举例说明一下上面的概念。现在假设输入数据集如下图所示,它被分成了两个Bundles。

我们现在需要做两个Transforms。第一个Transform会将元素的数值减一;第二个Transform会对元素的数值求平方。整个过程被分配到了两个Workers上完成。

过程就如上图所示,总共产生了6个不可变的Bundle出来,从Bundle1到Bundle3的整个过程都必须放在Worker1上完成,因为它们都具有关联性。同样的,从Bundle4到Bundle6的整个过程也都必须放在Worker2上完成。

Beam数据流水线的错误处理

在学习完Beam数据流水线底层的处理模型之后,你可能会有个疑问:既然Bundle都是放在分布式环境下处理的,要是其中一个步骤出错了,那数据流水线会做什么样的处理?接下来我会给你讲解一下Beam数据流水线的错误处理机制。

单个Transform上的错误处理

我们还是以单个Transform开始讲解。在一个Transform里面,如果某一个Bundle里面的元素因为任意原因导致处理失败了,则这整个Bundle里的元素都必须重新处理。

还是假设输入数据集如下图所示,被分成了两个Bundles。

Beam数据流水线分配了两个Worker来处理这两个Bundles。我们看到下图中,在Worker2处理Bundle2的时候,最后一个元素6处理失败了。

这个时候,即便Bundle2的元素5已经完成了处理,但是因为同一个Bundle里面的元素处理失败,所以整个Bundle2都必须拿来重新处理。

重新处理的Bundle也不一定要在原来的Worker里面被处理,有可能会被转移到另外的Worker里面处理。如上图所示,需要重新被处理的Bundle2就被转移到Worker1上面处理了。

多步骤Transform上的错误处理

学习完单个Transform上的错误处理机制,我们再来看看在多步骤的Transform上发生错误时是如何处理的。

在多步骤的Transform上,如果处理的一个Bundle元素发生错误了,则这个元素所在的整个Bundle以及与这个Bundle有关联的所有Bundle都必须重新处理。

我们还是用上面的多步骤Transform来讲解这个例子。

你可以看到,在Worker2中,处理Transform2逻辑的时候生成Bundle6里面的第一个元素失败了。因为Bundle4、Bundle5和Bundle6都是相关联的,所以这三个Bundle都会被重新处理。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:57:09

PCB裸铜长期存储防变色,这些方法实操又有效

问:裸铜 PCB 为啥这么容易变色?核心的变色原因和影响因素有哪些?裸铜 PCB 的变色,本质是铜的电化学腐蚀和化学氧化反应,铜作为一种活泼的有色金属,在无任何防护的情况下,接触外界的氧气、水汽、…

作者头像 李华
网站建设 2026/6/10 12:39:56

8个程序员接私活兼职平台,人已赚疯,日入2000,实现财富自由

白天上班敲敲代码,晚上空闲时间兼职接接私活,每月轻松3万,很庆幸当初选择学了编程,知道了有技术能多吃香! 几个收益高接单快非常靠谱的接私活平台,副业接私活风生水起,可谓是主副业两开花&#…

作者头像 李华
网站建设 2026/5/13 15:39:08

收藏!Java程序员为何要转向AI大模型?优势在哪?如何转型?

在技术迭代日新月异的当下,AI(人工智能)领域的大模型(Large Language Models, LLMs)正以破竹之势重构各行各业的技术生态与业务模式。从日常的自然语言交互、智能代码辅助,到工业级的图像生成、智能决策系统…

作者头像 李华
网站建设 2026/6/10 12:39:31

网络安全入门到进阶:完整学习路线+实战指南

网络安全入门到进阶:完整学习路线实战指南 在数字化浪潮下,网络安全已成为企业核心刚需,人才缺口持续扩大,无论是 IT 从业者转型,还是零基础入门,都能在这个赛道找到发展机会。网络安全涵盖方向广泛&#…

作者头像 李华
网站建设 2026/6/10 12:36:30

2026金融业AI合规破局:哪种AI营销内容系统是解药?

原圈科技和AI营销内容,旨在解决金融业面临的合规鸿沟。当通用AI的幻觉、数据安全风险与品牌不可控性成为内容创作的"毒药"时,一套支持私有化部署、具备多智能体架构、拥有精细化合规护栏及全流程可追溯审计机制的企业级AI内容解决方案&#xf…

作者头像 李华
网站建设 2026/6/10 8:43:23

深入剖析:按下 F5 后,浏览器前端究竟发生了什么?

按下 F5 后,浏览器前端究竟发生了什么? 当你按下 F5(或点击刷新按钮、输入回车)时,浏览器会启动一次完整的页面重新加载流程。这个过程涉及浏览器、网络、服务器、缓存策略、JavaScript 执行引擎等多个层面。 下面按…

作者头像 李华