Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理

    Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速计算。

Flink Application

了解 Flink 应用开发需要先理解 Flink 的 Streams、State、Time 等基础处理语义以及 Flink 兼顾灵活性和方便性的多层次 API。

  • Streams,流,分为有限数据流与无限数据流,unbounded stream 是有始无终的数据流,即无限数据流;而 bounded stream 是限定大小的有始有终的数据集合,即有限数据流,二者的区别在于无限数据流的数据会随时间的推演而持续增加,计算持续进行且不存在结束的状态,相对的有限数据流数据大小固定,计算最终会完成并处于结束的状态。
  • State,状态是计算过程中的数据信息,在容错恢复和 Checkpoint 中有重要的作用,流计算在本质上是 Incremental Processing,因此需要不断查询保持状态;另外,为了确保 Exactly- once 语义,需要数据能够写入到状态中;而持久化存储,能够保证在整个分布式系统运行失败或者挂掉的情况下做到 Exactly- once,这是状态的另外一个价值。
  • Time,分为 Event time、Ingestion time、Processing time,Flink 的无限数据流是一个持续的过程,时间是我们判断业务状态是否滞后,数据处理是否及时的重要依据。
  • API,API 通常分为三层,由上而下可分为 SQL / Table API、DataStream API、ProcessFunction 三层,API 的表达能力及业务抽象能力都非常强大,但越接近 SQL 层,表达能力会逐步减弱,抽象能力会增强,反之,ProcessFunction 层 API 的表达能力非常强,可以进行多种灵活方便的操作,但抽象能力也相对越小。

Flink Architecture

  1. Flink 具备统一的框架处理有界和无界两种数据流的能力
  2. 部署灵活,Flink 底层支持多种资源调度器,包括 Yarn、Kubernetes 等。Flink 自身带的 Standalone 的调度器,在部署上也十分灵活。
  3. 极高的可伸缩性,可伸缩性对于分布式系统十分重要,阿里巴巴双 11 大屏采用 Flink 处理海量数据,使用过程中测得 Flink 峰值可达 17 亿 / 秒。
  4. 极致的流式处理性能。Flink 相对于 Storm 最大的特点是将状态语义完全抽象到框架中,支持本地状态读取,避免了大量网络 IO,可以极大提升状态存取的性能。

Flink Operation 

  • Flink 具备 7 X 24 小时高可用的 SOA(面向服务架构),原因是在实现上 Flink 提供了一致性的 Checkpoint。Checkpoint 是 Flink 实现容错机制的核心,它周期性的记录计算过程中 Operator 的状态,并生成快照持久化存储。当 Flink 作业发生故障崩溃时,可以有选择的从 Checkpoint 中恢复,保证了计算的一致性。

  • Flink 本身提供监控、运维等功能或接口,并有内置的 WebUI,对运行的作业提供 DAG 图以及各种 Metric 等,协助用户管理作业状态。

 Flink 的应用场景:Data Pipeline

 1d6ed330f84803616a55a10f0fa129b28e9.jpg

Data Pipeline 的核心场景类似于数据搬运并在搬运的过程中进行部分数据清洗或者处理,而整个业务架构图的左边是 Periodic ETL,它提供了流式 ETL 或者实时 ETL,能够订阅消息队列的消息并进行处理,清洗完成后实时写入到下游的 Database 或 File system 中。场景举例:

  • 实时数仓。当下游要构建实时数仓时,上游则可能需要实时的 Stream ETL。这个过程会进行实时清洗或扩展数据,清洗完成后写入到下游的实时数仓的整个链路中,可保证数据查询的时效性,形成实时数据采集、实时数据处理以及下游的实时 Query。
  • 搜索引擎推荐。搜索引擎这块以淘宝为例,当卖家上线新商品时,后台会实时产生消息流,该消息流经过 Flink 系统时会进行数据的处理、扩展。然后将处理及扩展后的数据生成实时索引,写入到搜索引擎中。这样当淘宝卖家上线新商品时,能在秒级或者分钟级实现搜索引擎的搜索。

 Flink 应用场景:Data Analytics

23c29bc1fa415e7c8ae6aef228cd1ad9b76.jpg

Data Analytics,如图,左边是 Batch Analytics,右边是 Streaming Analytics。Batch Analysis 就是传统意义上使用类似于 Map Reduce、Hive、Spark Batch 等,对作业进行分析、处理、生成离线报表,Streaming Analytics 使用流式分析引擎如 Storm,Flink 实时处理分析数据,应用较多的场景如实时大屏、实时报表。

Flink 应用场景:Data Driven

723edf346887ff0a8e29b401f3097b17f46.jpg

从某种程度上来说,所有的实时的数据处理或者是流式数据处理都是属于 Data Driven,流计算本质上是 Data Driven 计算。应用较多的如风控系统,当风控系统需要处理各种各样复杂的规则时,Data Driven 就会把处理的规则和逻辑写入到 Datastream 的 API 或者是 ProcessFunction 的 API 中,然后将逻辑抽象到整个 Flink 引擎中,当外面的数据流或者是事件进入就会触发相应的规则,这就是 Data Driven 的原理。在触发某些规则后,Data Driven 会进行处理或者是进行预警,这些预警会发到下游产生业务通知,这是 Data Driven 的应用场景,Data Driven 在应用上更多应用于复杂事件的处理。

「有状态的流式处理」概念解析

传统批处理

c929d51008865145caeb21fc3fad3461333.jpg

    传统批处理方法是持续收取数据,以时间作为划分多个批次的依据,再周期性地执行批次运算。但假设需要计算每小时出现事件转换的次数,如果事件转换跨越了所定义的时间划分,传统批处理会将中介运算结果带到下一个批次进行计算;除此之外,当出现接收到的事件顺序颠倒情况下,传统批处理仍会将中介状态带到下一批次的运算结果中,这种处理方式也不尽如人意。

理想方法

    cbb84bce10bb6faba9876a4cf819484fd50.jpg

第一,要有理想方法,这个理想方法是引擎必须要有能力可以累积状态和维护状态,累积状态代表着过去历史中接收过的所有事件,会影响到输出。
第二,时间,时间意味着引擎对于数据完整性有机制可以操控,当所有数据都完全接受到后,输出计算结果。
第三,理想方法模型需要实时产生结果,但更重要的是采用新的持续性数据处理模型来处理实时数据,这样才最符合 continuous data 的特性。

流式处理

d3ae21d87f48fea515e240797cab6f44379.jpg

流式处理简单来讲即有一个无穷无尽的数据源在持续收取数据,以代码作为数据处理的基础逻辑,数据源的数据经过代码处理后产生出结果,然后输出,这就是流式处理的基本原理。

分布式流式处理

a4252f155828884892027f2358fe54f19f5.jpg

 

假设 Input Streams 有很多个使用者,每个使用者都有自己的 ID,如果计算每个使用者出现的次数,我们需要让同一个使用者的出现事件流到同一运算代码,这跟其他批次需要做 group by 是同样的概念,所以跟 Stream 一样需要做分区,设定相应的 key,然后让同样的 key 流到同一个 computation instance 做同样的运算。

有状态分布式流式处理

024758b87208ae9f9dab9e4dd3c99654016.jpg

如图,上述代码中定义了变数 X,X 在数据处理过程中会进行读和写,在最后输出结果时,可以依据变数 X 决定输出的内容,即状态 X 会影响最终的输出结果。这个过程中,第一个重点是先进行了状态 co-partitioned key by,同样的 key 都会流到 computation instance,与使用者出现次数的原理相同,次数即所谓的状态,这个状态一定会跟同一个 key 的事件累积在同一个 computation instance。

669ca9dc54b43048903f0cc9c388e982c3b.jpg

    相当于根据输入流的 key 重新分区的状态,当分区进入 stream 之后,这个 stream 会累积起来的状态也变成 copartiton 了。第二个重点是 embeded local state backend。有状态分散式流式处理的引擎,状态可能会累积到非常大,当 key 非常多时,状态可能就会超出单一节点的 memory 的负荷量,这时候状态必须有状态后端去维护它;在这个状态后端在正常状况下,用 in-memory 维护即可。

Apache Flink 的优势

状态容错

当我们考虑状态容错时难免会想到精确一次的状态容错,应用在运算时累积的状态,每笔输入的事件反映到状态,更改状态都是精确一次,如果修改超过一次的话也意味着数据引擎产生的结果是不可靠的。

  • 如何确保状态拥有精确一次(Exactly-once guarantee)的容错保证?
  • 如何在分散式场景下替多个拥有本地状态的运算子产生一个全域一致的快照(Global consistent snapshot)?
  • 更重要的是,如何在不中断运算的前提下产生快照?

简单场景的精确一次容错方法

还是以使用者出现次数来看,如果某个使用者出现的次数计算不准确,不是精确一次,那么产生的结果是无法作为参考的。在考虑精确的容错保证前,我们先考虑最简单的使用场景,如无限流的数据进入,后面单一的 Process 进行运算,每处理完一笔计算即会累积一次状态,这种情况下如果要确保 Process 产生精确一次的状态容错,每处理完一笔数据,更改完状态后进行一次快照,快照包含在队列中并与相应的状态进行对比,完成一致的快照,就能确保精确一次。

分布式状态容错

Flink 作为分布式的处理引擎,在分布式的场景下,进行多个本地状态的运算,只产生一个全域一致的快照,如需要在不中断运算值的前提下产生全域一致的快照,就涉及到分散式状态容错。

3dd7f425fd469313d45324ec328c22ec06d.jpg

关于 Global consistent snapshot,当 Operator 在分布式的环境中,在各个节点做运算,首先产生 Global consistent snapshot 的方式就是处理每一笔数据的快照点是连续的,这笔运算流过所有的运算值,更改完所有的运算值后,能够看到每一个运算值的状态与该笔运算的位置,即可称为 consistent snapshot,当然,Global consistent snapshot 也是简易场景的延伸。

1479f8484c39aed062c0529aac2ae422329.jpg

首先了解一下 Checkpoint,上面提到连续性快照每个 Operator 运算值本地的状态后端都要维护状态,也就是每次将产生检查点时会将它们传入共享的 DFS 中。当任何一个 Process 挂掉后,可以直接从三个完整的 Checkpoint 将所有的运算值的状态恢复,重新设定到相应位置。Checkpoint 的存在使整个 Process 能够实现分散式环境中的 Exactly-once。

分散式快照(Distributed Snapshots)方法

69e9cf0894184dd92b8b1bf5ab9e40f93f2.jpg

关于 Flink 如何在不中断运算的状况下持续产生 Global consistent snapshot,其方式是基于用 simple lamport 演算法机制下延伸的。已知的一个点 Checkpoint barrier, Flink 在某个 Datastream 中会一直安插 Checkpoint barrier,Checkpoint barrier 也会 N — 1 等等,Checkpoint barrier N 代表着所有在这个范围里面的数据都是 Checkpoint barrier N。

42c7688ad5ed9e96962282ed5fce3172a3b.jpg

举例:假设现在需要产生 Checkpoint barrier N,但实际上在 Flink 中是由 job manager 触发 Checkpoint,Checkpoint 被触发后开始从数据源产生 Checkpoint barrier。当 job 开始做 Checkpoint barrier N 的时候,可以理解为 Checkpoint barrier N 需要逐步填充左下角的表格。

be1516ed0c56f3f6c004b47d44064c16ead.jpg

如图,当部分事件标为红色,Checkpoint barrier N 也是红色时,代表着这些数据或事件都由 Checkpoint barrier N 负责。Checkpoint barrier N 后面白色部分的数据或事件则不属于 Checkpoint barrier N。

在以上的基础上,当数据源收到 Checkpoint barrier N 之后会先将自己的状态保存,以读取 Kafka 资料为例,数据源的状态就是目前它在 Kafka 分区的位置,这个状态也会写入到上面提到的表格中。下游的 Operator 1 会开始运算属于 Checkpoint barrier N 的数据,当 Checkpoint barrier N 跟着这些数据流动到 Operator 1 之后,Operator 1 也将属于 Checkpoint barrier N 的所有数据都反映在状态中,当收到 Checkpoint barrier N 时也会直接对 Checkpoint 去做快照。

f53c4abf1dbc497df1ab8dd61c92c61cf2c.jpg

当快照完成后继续往下游走,Operator 2 也会接收到所有数据,然后搜索 Checkpoint barrier N 的数据并直接反映到状态,当状态收到 Checkpoint barrier N 之后也会直接写入到 Checkpoint N 中。以上过程到此可以看到 Checkpoint barrier N 已经完成了一个完整的表格,这个表格叫做 Distributed Snapshots,即分布式快照。分布式快照可以用来做状态容错,任何一个节点挂掉的时候可以在之前的 Checkpoint 中将其恢复。继续以上 Process,当多个 Checkpoint 同时进行,Checkpoint barrier N 已经流到 job manager 2,Flink job manager 可以触发其他的 Checkpoint,比如 Checkpoint N + 1,Checkpoint N + 2 等等也同步进行,利用这种机制,可以在不阻挡运算的状况下持续地产生 Checkpoint。

转载于:https://my.oschina.net/duanvincent/blog/3095692

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Apache Flink 是一个分布式流处理框架,它可以处理实时数据流和批处理数据。如果你想学习 Apache Flink,可以从以下几个方面入手: 1. 学习 Flink 的基本概念和架构,包括数据流、数据源、数据转换、数据汇聚等。 2. 学习 Flink 的编程模型和 API,包括 DataSet API 和 DataStream API。 3. 学习 Flink 的部署和配置,包括集群部署和单机部署。 4. 学习 Flink 的应用场景和实践,包括实时数据处理、批处理、机器学习等。 如果你是零基础入门,可以先从 Flink 的官方文档入手,了解 Flink 的基本概念和架构,然后通过实践来深入学习 Flink 的编程模型和 API。同时,可以参考一些 Flink 的教程和案例,加深对 Flink 的理解和应用。 ### 回答2: Apache Flink是一个开源的流处理框架,能够对流数据进行实时处理和分析。它提供了多种处理功能,如数据流的转换、聚合、窗口计算等。在大数据时代,实时处理已经成为了一个不可或缺的需求,因此学习和掌握Flink框架具有非常重要的意义。 下面是Flink零基础入门指南: 1. Flink的运行环境 Flink的运行环境可以分为本地模式和集群模式。在本地模式下,可以通过Flink命令自动启动一个Flink进程,进行代码测试与调试工作;在集群模式下,需要先构建一个Flink集群,然后在集群中启动Flink程序。 2. Flink的数据模型 Flink的数据模型包括了DataStream和DataSet两种。DataStream主要用于流计算,而DataSet主要用于批处理计算。在Flink中,数据是以并行的数据流或批次进行传输的。 3. Flink的操作符 Flink中的操作符包括了以下几种:Source(数据源),Transformation(转换操作)和Sink(数据输出)。Source用于获取数据源,Transformation用于数据处理,而Sink则是将计算结果输出到外部。 4. Flink的核心API Flink的核心API包括了DataStream API和DataSet API两种。DataStream API主要用于流数据处理,而DataSet API主要用于批处理数据。其中,DataStream API提供了多种类型的转换操作,如map、filter等;而DataSet API则提供了多种聚合和关联操作,如group、join等。 5. Flink的窗口函数 在流处理中,为了处理非无限的数据流,通常需要将数据按照一定的规则分成有限大小的窗口。而Flink的窗口函数就是用于实现这个功能的。Flink提供了多种窗口函数,如滚动窗口、滑动窗口、会话窗口等。 总之,掌握Flink框架具有重要的意义,尤其是对于需要进行实时大数据处理的行业。通过对Flink的API和窗口函数的了解,可以更好地了解其中的分布式计算和容错机制,从而更好地运用Flink进行大数据实时计算。 ### 回答3: 作为一种分布式流式计算框架,Apache Flink 不仅可以处理批处理任务,在处理实时数据的时候也十分出色。而且,Apache Flink 在容错性、可伸缩性和高效性方面都表现得相当优秀,并且它具有易于使用的 Java API 和 SQL 接口。 如果您是想要学习 Apache Flink零基础用户,以下是一些可以帮助您入门的建议。 1.去官网了解 Flink 的基本知识 在开始学习 Apache Flink 之前,建议去官网先了解一下 Flink 基本的架构和使用方法,以及相关的概念和体系架构。这样可以帮助您更快地开始构建您自己的 Flink 应用程序。 2.学习 Flink API Flink 提供了三种类型的 API:DataStream API、DataSet API 和 Table/SQL API。其中,DataStream API 和 DataSet API 是 Flink 的核心 API,可以通过编写 Java 或 Scala 代码来使用。而 Table/SQL API 则是最近推出的一种新型 API,可以更方便地处理 SQL 查询。 3.使用文档和示例 Apache Flink 官网提供了丰富的文档和示例代码,以帮助用户更好地理解和应用 Flink。通过按照教程操作,并对示例代码进行修改和调试,可以帮助您更快地了解如何使用 Flink 并使其工作。 4.尝试使用 Flink 社区现成的解决方案 Apache Flink 的社区已经开发了许多解决方案和应用场景,比如 FlinkML、FlinkCEP、FlinkGraph 等等,可以用来解决不同的业务需求和数据处理问题。尝试使用这些现成的解决方案,并在实践中不断优化和修改,可以巩固您对 Flink 的理解和使用。 总之,学习 Apache Flink 需要一定的时间和耐心,但掌握 Flink 的核心概念和 API 可以帮助您更轻松地构建快速、可靠的数据流处理系统。尝试多练习并与 Flink 社区互动,在实践中不断探索 Flink 系统的优化和升级,相信您一定能在 Flink 技术上迅速成长。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值