Beam数据流水线——Pipeline

目录

Beam简介

基本概念

数据流水线

Beam数据流水线的应用

Beam数据流水线的处理模型

Beam数据流水线的错误处理

单Transform错误处理

多步骤Transform错误处理

 


Beam简介

 Apache Beam 是Google 开源的一个统一编程框架,它本身不是一个流式处理平台,而是提供了统一的编程模型,帮助用户创建自己的数据处理流水线,实现可以运行在任意执行引擎之上批处理和流式处理任务。它包含:

  • 一个可以涵盖批处理和流处理的统一编程模型
  • Beam SDK,支持 Java 和 Python以及Go
  • 一系列Runner,让其编程模型运行在不同底层处理引擎(Google Cloud Dataflow,Spark,Flink,Apex等)

基本概念

PCollections

抽象表示潜在分布的多元素数据集。 也可以将PCollection视为“管道”数据; Beam变换使用PCollection对象作为输入和输出。 因此,如果要处理管道中的数据,则必须采用PCollection的形式。

   PCollection的特点:

  1. 不可变性:PCollection不能被修改
  2. 不可随机读取:PCollection只能顺序读取,且只能读取1次。
  3. 时间戳:PCollection的数据,每一条都带有时间。

Transforms

Transforms是管道中的操作,并提供通用的处理框架。您以函数对象的形式提供处理逻辑(通俗地称为“用户代码”),并且您的用户代码应用于输入PCollection(或多个PCollection)的每个元素。根据您选择的管道运行程序和后端,群集中的许多不同工作程序可以并行执行用户代码的实例。在每个worker上运行的用户代码生成输出元素,这些元素最终被添加到转换产生的最终输出PCollection中。

Beam SDK包含许多不同的变换,您可以将这些变换应用于管道的PCollections。这些包括通用核心转换,例如ParDo或Combine。 SDK中还包含预先编写的复合变换,它们以一种有用的处理模式组合一个或多个核心变换,例如计算或组合集合中的元素。您还可以定义自己更复杂的复合变换,以适应管道的确切用例。

数据流水线

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

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

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

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

在创建Beam流水线的同时,还必须给流水线定义一个选项(Options)。这个选项会告诉Beam,用户的Pipeline应该如何运行。eg:是在本地的内存上运行,还是在Apache Flink上运行。

Beam数据流水线的应用

有了数据流水线这个抽象感念以后,我们就可以将PCollection和Transform应用在这个流水里面了。下图就是一个Beam的流水线,整个数据流水线包括了从读取数据,到经过N个Transform之后输出数据的整个过程

由于PCollection是不可变的,也就是说,一个PCollection一经生成,就不能够再增加或者删除它里面的元素了。所以,在Beam的数据流水线中,每次PCollection经过一个Transform之后,流水线都会新创建一个PCollection出来。而这个新的PCollection又将成为下个Transform的新的输入。在上图中,Beam数据流水线在经过Transform1读取了输入数据集之后,会创建出一个新的PCollection1,而经过了Transform2之后,数据流水线又会创建出新的PCollection2,同时PCollection1不会有任何改变。也就说,在上面的例子中,除去最终的输出结果,数据流水线一共创建了3个不同的PCollection出来。

这种特性可以在编写数据处理逻辑的时候,对同一个PCollection可以应用多个不同的Transform。如下图所示,对于PCollection1,我们可以使用三个不同的Transform应用,从而产生出三个不同的PCollection出来。

Beam数据流水线的处理模型

Beam数据流水线模型就是数据流水线在运行起来以后,会发生什么,他是如何处理我们定义好的PCollection和Transform的。Beam数据流水线的底层思想其实还是动用了MapReduce的原理,在分布式环境下,整个数据流水线会启动N个Workers来同时处理PColletion。而在具体处理某个特定的Transform的时候,数据流水线会将这个Transform的输入数据集PCollection里面的元素分割成不同的Bundle,将这些Bundle分别给不同的Worker来处理。

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

为加深理解,举一个简单例子,eg:

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

当然PCollection也有可能被分割成三个Bundle。

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

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

在多步骤的Transform中,一个Bundle通过一个Transform产生出来的结果作为下一个Transform的输入。在Beam数据流水线中,抽象出来的PCollection经过一个Transform之后,流水线都会新建一个PCollection。同样的,Beam在真正运行的时候,每个Bundle在一个Worker机器里经过Transform逻辑后,也会产生出来一个新的Bundle,它们也是具有不可变性的。像这样具有关联性的Bundle,必须在同一个Worker上处理。

为加深理解,举例说明一下,eg:假设输入数据集被分成两个Bundle.

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

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

Beam数据流水线的错误处理

Beam的Bundle都是在分布式环境下处理的,要是其中一个步骤出错了,那数据流水线会做怎么样的处理呢?下面我们探讨一下Beam数据流水线的错误处理机制。

单Transform错误处理

在一个Transform里面,如果某个Bundle里的元素因为任意原因导致处理失败了,则这整个Bundle里的元素都必须重新处理。eg:

假设输入数据集被分成了两个Bundle,Beam数据流水线分配了两个Worker来处理这两个Bundle,如果Worker2在处理Bundle2的时候,最后一个元素6处理失败了。

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

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

多步骤Transform错误处理

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值