# 28 | 如何设计创建好一个Beam Pipeline? 你好,我是蔡元楠。 今天我要与你分享的主题是“如何设计创建好一个Beam Pipeline”。 这一讲我们会用到[第7讲](https://time.geekbang.org/column/article/92928)中介绍过的四种常见设计模式——复制模式、过滤模式、分离模式和合并模式。这些设计模式就像是武功的基本套路一样,在实战中无处不在。今天,我们就一起来看看我们怎么用Beam的Pipeline来实现这些设计模式。 ## 设计Pipeline的基本考虑因素 在设计Pipeline时,你需要注意4条基本的考虑因素。 ### 1.输入数据存储在哪里? 输入数据是存储在云存储文件系统,还是存储在一个关系型数据库里?有多大的数据量?这些都会影响你的pipeline设计是如何读入数据的。上一讲已经讲到过,Pipeline的数据读入是使用Read这个特殊的Transform。而数据读入往往是一个Pipeline的第一个数据操作。 ### 2.输入数据是什么格式? 输入数据是纯文本文件?还是读取自关系型数据库的行?还是结构化好的特殊数据结构?这些都会影响你对于PCollection的选择。比如,如果输入数据是自带key/value的结构,那你用Beam的key/value为元素的PCollection能更好的表示数据。 ### 3.这个pipeline你打算对数据进行哪些操作? 提前想好要做哪些数据操作,可以帮助你设计好Transform。可能你也会使用一些Beam提供的Transform或者是你的团队共用的一些Transform。 ### 4.输出数据需要是什么样的格式,需要存储到哪里? 和输入数据相同,对于输出数据,我们也要提前判断好业务的需求。看看需要的数据格式是什么样的,是要存储到本地文本文件?还是存储到另一个数据库? 比如,你在跑一个本地批处理作业,就会需要先存到本地看一看。如果你在生成环境有永久性数据库,或者你有结构化的数据,可能更想存储到你的数据库里。 ## 复制模式的Pipeline设计 现在,我们就来看看在第7讲中提到的复制模式(Copier Pattern)的例子是怎么用Beam实现的。这里需要用到[第7讲](https://time.geekbang.org/column/article/92928)的YouTube视频平台的复制模式案例。这里就简单介绍一下,以便唤醒你的记忆。如果你完全忘记了,我建议你先去做个回顾。 如今的视频平台会提供不同分辨率的视频给不同网络带宽的用户。在YouTube视频平台中,将鼠标放在视频缩略图上时,它会自动播放一段已经生成好的动画缩略图。平台的自然语言理解(NLP)的数据处理模块可以分析视频数据,自动生成视频字幕。视频分析的数据处理模块也可以通过分析视频数据产生更好的内容推荐系统。这使用的就是复制模式。 要想在在Beam中采用复制模式,我们可以用一个PCollection来表示输入的Video data set。将每一种视频处理编写成Transform。最后,多重输出各自为一个PCollection。整个过程就如同下图所示。 ![](https://static001.geekbang.org/resource/image/b2/73/b226e637e8cba5f7c3ef938684526373.jpg) 你可以从图片中看到,在这个工作流系统中,每个数据处理模块的输入都是相同的,而下面的5个数据处理模块都可以单独并且同步地运行处理。 复制模式通常是将单个数据处理模块中的数据完整地复制到两个或更多的数据处理模块中,然后再由不同的数据处理模块进行处理。当我们在处理大规模数据时,需要对同一个数据集采取多种不同的数据处理转换,我们就可以优先考虑采用复制模式。 比如下面的代码,我们用5个不同的pipeline来表示,它们的作用分别是生成高画质视频、生成低画质视频、生成GIF动画、生成视频字幕、分析视频。 ``` PCollection