Apache Beam指南

Apache Beam是Google贡献的用于数据流处理和批处理的编程模型,被誉为下一代大数据处理标准。它提供了一种统一的编程接口,使得程序可以在多种分布式计算引擎上运行。本文介绍了什么是Beam、其核心概念如数据、Beam Model,以及如何设计和运行pipeline,包括WordCount示例和移动游戏数据处理案例。
摘要由CSDN通过智能技术生成

Apache Beam

标签(空格分隔): Hadoop


1. What is Beam ?

前世今生:

诞生背景:
分布式数据处理发展迅猛 –> 新的分布式数据处理技术越来越多 –> Hadoop MapReduce,Apache Spark,Apache Storm,Apache Flink,Apache Apex –> 新技术高性能 , 受欢迎,人们喜新厌旧 –> 业务的迁移 –> 迁移条件: 学习新技术,重写业务逻辑 –> 懒 –> 怎么办 ??
Apache Beam 应运而生
贵族身份:
Apache Beam - 原名 Google DateFlow
2016年2月份成为Apache基金会孵化项目
2017年1月10日正式毕业成为顶级项目
继MapReduce,GFS和BigQuery之后,Google在大数据处理领域对开源社区的又一个超级大的贡献
目前最新版本: 1.0

业界影响:

被誉为进行数据流处理和批处理的最佳编程模型 !
被誉为下一代的大数据处理标准 !
Google的员工已经不再使用MapReduce了 ……

何方神圣:

Beam项目主要是对数据处理(有限的数据集,无限的数据流)的编程范式和接口进行了统一定义(Beam Model) 这样,基于Beam开发的数据处理程序可以执行在任意的分布式计算引擎上.

主要构成:
– Beam SDKs
Beam SDK定义了开发分布式数据处理任务业务逻辑的API接口,即提供一个统一的编程接口给到上层应用的开发者,开发者不需要了解底层的具体的大数据平台的开发接口是什么,直接通过Beam SDK的接口,就可以开发数据处理的加工流程,不管输入是用于批处理的有限数据集,还是流式的无限数据集。对于有限或无限的输入数据,Beam SDK都使用相同的类来表现,并且使用相同的转换操作进行处理。
– Beam Pipeline Runner
Runner 是将用户通过调用Beam SDK构成的program(pipeline)进行编译转换,当我们指定任意一个Runner时,program就会被转化为与该Runner相兼容的可直接运行的程序,所以,在运行Beam程序时,需要指明底层的正确Runner类型

Beam 架构:
image_1b9iniipq18sr4nd76p1g3iaqpm.png-282.4kB

用户通过Beam Model构建一个数据处理管道(pipeline),调用Beam SDK API实现管道里的逻辑,也就是”编程实现”,然后pipeline交给具体的Beam Runner编译,最后运行在分布式计算引擎上.
注: 流处理和批处理的未来在于 Apache Beam,而执行引擎的选择权在于用户。
ETL : 基于Beam开发的程序可以运行在多个分布式计算框架上,那么它可以用来将不同的数据源,或者多个数据存储媒体上的数据整合到一起,最终生成我们想要的数据

2. Beam Core

Data

Beam 能处理什么样的数据 ?
– 无限的时间乱序数据流

有限的数据集
无限的数据流

有限的数据集可以看做是无限的数据流的一种特例,从数据处理逻辑的角度,这两者并无不同之处
例如,假设微博数据包含时间戳和转发量,用户希望按照统计每小时的转发量总和,此业务逻辑应该可以同时在有限数据集和无限数据流上执行,并不应该因为数据源的不同而对业务逻辑的实现产生任何影响

数据进入分布式处理框架的时间(Process Time) VS 数据产生的时间(Event-Time)
这两个时间通常是不同的,例如,对于一个处理微博数据的流计算任务,一条2016-06-01-12:00:00发表的微博经过网络传输等延迟可能在2016-06-01-12:01:30才进入到流处理系统中。批处理任务通常进行全量的数据计算,较少关注数据的时间属性,但是对于流处理任务来说,由于数据流是无穷无尽的,无法进行全量的计算,通常是对某个窗口中得数据进行计算,对于大部分的流处理任务来说,按照时间进行窗口划分
对于流处理框架处理的数据流来说,其数据的到达顺序可能并不严格按照Event-Time的时间顺序。如果基于Process Time定义时间窗口,数据到达的顺序就是数据的顺序,因此不存在乱序问题。但是对于基于Event Time定义的时间窗口来说,可能存在时间靠前的消息在时间靠后的消息后到达的情况,这在分布式的数据源中可能非常常见。对于这种情况,如何确定迟到数据,以及对于迟到数据如何处理通常是很棘手的问题。

Beam Model

Beam Model从四个维度归纳了用户在进行数据处理的时候需要考虑的问题:
image_1b9ke88gn168212jb1pgh1refjlam.png-87.2kB
翻译过来:

  • What。如何对数据进行计算?例如,Sum,Join或是机器学习中训练学习模型等。在Beam SDK中由Pipeline中的操作符指定。
  • Where。数据在什么范围中计算?例如,基于Process-Time的时间窗口,基于Event-Time的时间窗口,滑动窗口等等。在BeamSDK中由Pipeline中的窗口指定。
  • When。何时将计算结果输出?例如,在1小时的Event-Time时间窗口中,每隔1分钟,将当前窗口计算结果输出。在Beam SDK中由Pipeline中的Watermark和触发器指定。
  • How。迟到数据如何处理?例如,将迟到数据计算增量结果输出,或是将迟到数据计算结果和窗口内数据计算结果合并成全量结果输出。在Beam SDK中由Accumulation指定。

3.How to Design a Pipeline

设计最简单的pipeline, 默认是最简单的维度,只需考虑下面四个问题:

  • Where is your input data stored?
  • What does your data look like?
  • What do you want to do with your data?
  • What does your output data look like, and where should it go?
    image_1b9kep5jp1j1gp671rte1sna1p791j.png-47.3kB

整个流程如何用代码实现 ?

—-create a driver program using the classes in one of the Beam SDKs.
理解几个概念:
* Pipeline
A Pipeline encapsulates your entire data processing task, from start to finish. This includes reading input data, transforming that data, and writing output data. All Beam driver programs must create a Pipeline. When you create the Pipeline, you must also specify the execution options that tell the Pipeline where and how to run.
说白了…跟SparkContext一样一样的,承接上下文环境
* PCollection
A PCollection represents a distributed data set that your Beam pipeline operates on. The data set can be bounded, meaning it comes from a fixed source like a file, or unbounded, meaning it comes from a continuously updating source via a subscription or other mechanism. Your pipeline typically creates an initial PCollection by reading data from an external data source, but you can also create a PCollection from in-memory data within your driver program. From there, PCollections are the inputs and outputs for each step in your pipeline.
说白了…跟RDD一样一样的,PCollections包含一个潜在的无限数据流。这些数据都来源于输入源,然后应用于转换。
* Transform
A Transform represents a data processing operation, or a step, in your pipeline. Every Transform takes one or more PCollection objects as input, perfroms a processing function that you provide on the elements of that PCollection, and produces one or more output PCollection objects.
一个操作PCollection处理步骤执行数据操作。典型的传递途径可能会在一个输入源有多个转换操作(例如,将一组日志条目传入的字符串转换成一个键/值对,关键是IP地址和值是日志消息)。它由BeamSDK附带的一系列标准聚合建成,当然,也可以定义根据自己的处理需求自定义。
* I/O Source and Sink
Beam provides Source and Sink APIs to represent reading and writing data, respectively. Source encapsulates the code necessary to read data into your Beam pipeline from some external source, such as cloud file storage or a subscription to a streaming data source. Sink likewise encapsulates the code necessary to write the elements of a PCollection to an external data sink.

So… 创建一个Driver Program的流程如下:

Create a Pipeline object –> set options –> initial PCollection (using the Source API to read data from an external source, or using a Create transform to build a PCollection from in-memory data.) –> Apply Transforms to each PCollection. –> Output the final, transformed PCollection(s)(Sink API ) –> Run the pipeline using the designated Pipeline Runner.

Coding:

Maven 依赖:

        <!-- Apache  Beam-->
        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-sdks-java-core</artifactId>
            <version>0.5.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.beam</groupId>
            <artifactId>beam-runners-direct-java</artifactId>
            <version>0.5.0</version>
            <scope>runtime</scope>
        </dependency>

Demo 解析:

public static void main(String[] args) {
    // Create the pipeline.
    PipelineOptions options = 
        PipelineOptionsFactory.fromArgs(args).create();
    Pipeline p = Pipeline.create(options);

    PCollection<String> lines = p.apply(
      "ReadMyFile", TextIO.Read.from("protocol://path/to/some/inputData.txt"));
}

当使用Beam时,Driver Program中必须先创建Pipeline类的一个实例(一般放在main方法中),而创建实例时,
需要创建 PipelineOptions对象来设置参数,最后将参数传递给 Pipeline.create();

创建PCollection的方法:
  • Reading from an external source
 PCollection<String> lines = p.apply(
      "ReadMyFile", TextIO.Read.from("protocol://path/to/some/inputData.txt"));
  • Creating a PCollection from in-memory data
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值