Flink教程(02)- Flink入门(下)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
简介: Flink教程(02)- Flink入门(下)

06 Flink的优势

6.1 选择Flink的原因

主要原因:

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

6.2 支持高吞吐、低延迟、高性能

Flink同时支持高吞吐、低延迟、高性能:

  • Flink 是目前开源社区中唯一一套集高吞吐、低延迟、高性能三者于一身的分布式流式数据处理框架;
  • Spark 只能兼顾高吞吐和高性能特性,无法做到低延迟保障,因为Spark是用批处理来做流处理;
  • Storm 只能支持低延时和高性能特性,无法满足高吞吐的要求。

下图显示了 Apache FlinkApache Storm 在完成流数据清洗的分布式任务的性能对比:

6.3 支持事件时间(Event Time)概念

在流式计算领域中,窗口计算的地位举足轻重,但目前大多数框架窗口计算采用的都是系统时间(Process Time),也就是事件传输到计算框架处理时,系统主机的当前时间。

Flink能够支持基于事件时间(Event Time)语义进行窗口计算:这种基于事件驱动的机制使得事件即使乱序到达甚至延迟到达,流系统也能够计算出精确的结果,保持了事件原本产生时的时序性,尽可能避免网络传输或硬件系统的影响。

6.4 支持有状态计算

Flink1.4开始支持有状态计算:所谓状态就是在流式计算过程中将算子的中间结果保存在内存或者文件系统中,等下一个事件进入算子后可以从之前的状态中获取中间结果,计算当前的结果,从而无须每次都基于全部的原始数据来统计结果,极大的提升了系统性能,状态化意味着应用可以维护随着时间推移已经产生的数据聚合。

6.5 支持高度灵活的窗口(Window)操作

Flink 将窗口划分为基于 TimeCountSession以及Data-Driven等类型的窗口操作,窗口可以用灵活的触发条件定制化来达到对复杂的流传输模式的支持,用户可以定义不同的窗口触发机制来满足不同的需求。

6.6 基于轻量级分布式快照(Snapshot/Checkpoints)的容错机制

Flink 能够分布运行在上千个节点上,通过基于分布式快照技术的Checkpoints,将执行过程中的状态信息进行持久化存储,一旦任务出现异常停止,Flink能够从 Checkpoints中进行任务的自动恢复,以确保数据处理过程中的一致性。

Flink 的容错能力是轻量级的,允许系统保持高并发,同时在相同时间内提供强一致性保证。

6.7 基于 JVM 实现的独立的内存管理

Flink 实现了自身管理内存的机制,通过使用散列,索引,缓存和排序有效地进行内存管理,通过序列化/反序列化机制将所有的数据对象转换成二进制在内存中存储,降低数据存储大小的同时,更加有效的利用空间。使其独立于 Java 的默认垃圾收集器,尽可能减少JVM GC对系统的影响。

6.8 SavePoints 保存点

对于 7 * 24 小时运行的流式应用,数据源源不断的流入,在一段时间内应用的终止有可能导致数据的丢失或者计算结果的不准确,比如集群版本的升级,停机运维操作等。

值得一提的是,Flink 通过SavePoints 技术将任务执行的快照保存在存储介质上,当任务重启的时候,可以从事先保存的 SavePoints 恢复原有的计算状态,使得任务继续按照停机之前的状态运行。

Flink保存点提供了一个状态化的版本机制,使得能以无丢失状态和最短停机时间的方式更新应用或者回退历史数据。

6.9 灵活的部署方式,支持大规模集群

Flink 被设计成能用上千个点在大规模集群上运行,除了支持独立集群部署外,Flink 还支持YARNMesos 方式部署。

6.10 Flink 的程序内在是并行和分布式的

数据流可以被分区成 stream partitionsoperators被划分为operator subtasks,这些 subtasks在不同的机器或容器中分不同的线程独立运行,operator subtasks的数量就是operator的并行计算数,不同的operator阶段可能有不同的并行数;

如下图所示,source operator 的并行数为 2,但最后的sink operator 为1;

6.11 丰富的库

Flink 拥有丰富的库来进行机器学习,图形处理,关系数据处理等。

7 批流统一

在前面,我们知道了 “批流统一” 是Flink的优势之一,在了解批流统一之前,很有必要了解大数据框架的发展史。

7.1 大数据计算引擎发展史

在国外一些社区,有很多人将大数据的计算引擎分成了 4 代,如下图:

这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有 HadoopStorm,以及后来的 Spark,他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河,也以内存为赌注,赢得了内存计算的飞速发展。Spark 的火热或多或少的掩盖了其他分布式计算的系统身影。就像Flink,也就在这个时候默默的发展着。

7.1.1 第1代 : Hadoop MapReduce

首先第一代的计算引擎,无疑就是 Hadoop 承载的 MapReduce。它将计算分为两个阶段,分别为 MapReduce。对于上层应用来说,就不得不想方设法去拆分算法,甚至于不得不在上层应用实现多个 Job 的串联,以完成一个完整的算法,例如迭代计算。

  • 批处理
  • Mapper、Reducer

7.1.2 第2代 : DAG框架(Tez) + MapReduce

由于这样的弊端,催生了支持 DAG 框架的产生,因此,支持 DAG 的框架被划分为第二代计算引擎,如Tez以及更上层的Oozie。这里我们不去细究各种 DAG 实现之间的区别,不过对于当时的 TezOozie来说,大多还是批处理的任务。

  • 批处理
  • 1个Tez = MR(1) + MR(2) + ... + MR(n)
  • 相比MR效率有所提升

7.1.3 第3代 : Spark

接下来就是以 Spark 为代表的第三代的计算引擎。第三代计算引擎的特点主要是 Job 内部的 DAG 支持(不跨越 Job),以及强调的实时计算。

在这里,很多人也会认为第三代计算引擎也能够很好的运行批处理的 Job

  • 批处理、流处理、SQL高层API支持
  • 自带DAG
  • 内存迭代计算、性能较之前大幅提升

7.1.4 第4代 : Flink

随着第三代计算引擎的出现,促进了上层应用快速发展,例如各种迭代计算的性能以及对流计算和 SQL 等的支持。Flink 的诞生就被归在了第四代。这应该主要表现在 Flink 对流计算的支持,以及更一步的实时性上面。当然Flink也可以支持 Batch的任务,以及DAG 的运算。

  • 批处理、流处理、SQL高层API支持;
  • 自带DAG
  • 流式计算性能更高、可靠性更高。

7.2 流处理vs批处理

7.2.1 数据的时效性

日常工作中,我们一般会先把数据存储在,然后对表的数据进行加工、分析。既然先存储在表中,那就会涉及到时效性概念。

如果我们处理以年,月为单位的级别的数据处理,进行统计分析,个性化推荐,那么数据的的最新日期离当前有几个甚至上月都没有问题。但是如果我们处理的是以天为级别,或者一小时甚至更小粒度的数据处理,那么就要求数据的时效性更高了。比如:

  • 对网站的实时监控
  • 对异常日志的监控

这些场景需要工作人员立即响应,这样的场景下,传统的统一收集数据,再存到数据库中,再取出来进行分析就无法满足高时效性的需求了。

7.2.1 流式计算和批量计算

概念:

  • 批量计算(Batch Analytics):,右边是 Streaming Analytics, 统一收集数据->存储到DB->对数据进行批量处理,就是传统意义上使用类似于 Map ReduceHiveSpark Batch等,对作业进行分析、处理、生成离线报表
  • 流式计算(Streaming Analytics) : 顾名思义,就是对数据流进行处理,如使用流式分析引擎如 StormFlink实时处理分析数据,应用较多的场景如实时大屏、实时报表。

它们的主要区别:

  • 与批量计算那样慢慢积累数据不同,流式计算立刻计算,数据持续流动,计算完之后就丢弃。
  • 批量计算是维护一张表,对表进行实施各种计算逻辑。流式计算相反,是必须先定义好计算逻辑,提交到流式计算系统,这个计算作业逻辑在整个运行期间是不可更改的。
  • 计算结果上,批量计算对全部数据进行计算后传输结果,流式计算是每次小批量计算后,结果可以立刻实时化展现。

7.3 批流统一

在大数据处理领域,批处理任务与流处理任务一般被认为是两种不同的任务,一个大数据框架一般会被设计为只能处理其中一种任务:

  • MapReduce只支持批处理任务;
  • Storm只支持流处理任务;
  • Spark Streaming采用micro-batch架构,本质上还是基于Spark批处理对流式数据进行处理

Flink通过灵活的执行引擎,能够同时支持批处理任务与流处理任务

在执行引擎这一层,流处理系统与批处理系统最大不同在于节点间的数据传输方式

  1. 对于一个流处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,然后立刻通过网络传输到下一个节点,由下一个节点继续处理
  2. 对于一个批处理系统,其节点间数据传输的标准模型是:当一条数据被处理完成后,序列化到缓存中,并不会立刻通过网络传输到下一个节点,当缓存写满,就持久化到本地硬盘上,当所有数据都被处理完成后,才开始将处理后的数据通过网络传输到下一个节点。

这两种数据传输模式是两个极端,对应的是流处理系统对低延迟的要求批处理系统对高吞吐量的要求

Flink的执行引擎采用了一种十分灵活的方式,同时支持了这两种数据传输模型:

  • Flink以固定的缓存块为单位进行网络数据传输,用户可以通过设置缓存块超时值指定缓存块的传输时机。
  • 如果缓存块的超时值为0,则Flink的数据传输方式类似上文所提到流处理系统的标准模型,此时系统可以获得最低的处理延迟
  • 如果缓存块的超时值为无限大/-1,则Flink的数据传输方式类似上文所提到批处理系统的标准模型,此时系统可以获得最高的吞吐量
  • 同时缓存块的超时值也可以设置为0到无限大之间的任意值。缓存块的超时阈值越小,则Flink流处理执行引擎的数据处理延迟越低,但吞吐量也会降低,反之亦然。通过调整缓存块的超时阈值,用户可根据需求灵活地权衡系统延迟和吞吐量
  • 默认情况下,流中的元素并不会一个一个的在网络中传输,而是缓存起来伺机一起发送(默认为32KB,通过taskmanager.memory.segment-size设置),这样可以避免导致频繁的网络传输,提高吞吐量,但如果数据源输入不够快的话会导致后续的数据处理延迟,所以可以使用env.setBufferTimeout(默认100ms),来为缓存填入设置一个最大等待时间。等待时间到了之后,即使缓存还未填满,缓存中的数据也会自动发送。
  • timeoutMillis > 0 表示最长等待 timeoutMillis 时间,就会flush
  • timeoutMillis = 0 表示每条数据都会触发 flush,直接将数据发送到下游,相当于没有Buffer了(避免设置为0,可能导致性能下降)
  • timeoutMillis = -1 表示只有等到 buffer满了或 CheckPoint的时候,才会flush。相当于取消了 timeout 策略

总结:Flink以缓存块为单位进行网络数据传输,用户可以设置缓存块超时时间和缓存块大小来控制缓冲块传输时机,从而控制Flink的延迟性和吞吐量。

08 脑图总结

下面整理了一张脑图,方便大家回顾本文:

本文主要讲解Flink的一些入门知识,谢谢大家的阅读,本文完!

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
2月前
|
Java 流计算
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
【极数系列】Flink搭建入门项目Demo & 秒懂Flink开发运行原理(05)
|
4月前
|
流计算
JD Flink教程
JD Flink教程
21 0
|
4月前
|
SQL 运维 API
Apache Flink 学习教程----持续更新
Apache Flink 学习教程----持续更新
238 0
|
4月前
|
Apache 流计算
Apache Flink教程
Apache Flink教程
211 0
|
1月前
|
分布式计算 监控 API
flink 入门编程day02
flink 入门编程day02
36 5
|
3月前
|
SQL 关系型数据库 Apache
Apache Doris 整合 FLINK CDC 、Paimon 构建实时湖仓一体的联邦查询入门
Apache Doris 整合 FLINK CDC 、Paimon 构建实时湖仓一体的联邦查询入门
676 1
|
4月前
|
Apache 流计算
Apache Flink教程----2.本地开发
Apache Flink教程----2.本地开发
43 0
|
4月前
|
SQL 分布式计算 Java
2021年最新最全Flink系列教程__Flink综合案例(九)
2021年最新最全Flink系列教程__Flink综合案例(九)
37 0
|
4月前
|
消息中间件 NoSQL 数据挖掘
2021年最新最全Flink系列教程__Flink高级特性和新特性(八)
2021年最新最全Flink系列教程__Flink高级特性和新特性(八)
28 0
|
4月前
|
消息中间件 SQL Kafka
2021年最新最全Flink系列教程__FlinkTable&SQL(六、七)
2021年最新最全Flink系列教程__FlinkTable&SQL(六、七)
39 0