flinkflink

Flink 入门(一):Flink 背景、架构以及基本知识点

2019-12-02  本文已影响0人  alexlee666

今年 Flink 火的一塌糊涂,一些大厂比如阿里巴巴也都开始使用 Flink 构建实时数据仓库。

一、什么是 Flink ?

1.1 批处理和流处理

数据集分为有界数据集和无界数据集:

注意:流处理更复杂,因为需要考虑到数据的顺序错乱和系统容错等。

1.2 Flink

相对于传统的数据处理模式,流式数据处理有着更高的处理效率和成本控制能力。Flink 就是近年来在开源社区不断发展的具有优越的性能。Flink 可以描述为:


二、为什么使用 Flink ?

使用 Flink 的原因肯定是 Flink 较以往其他产品更有竞争力,这种竞争力主要体现在高性能的流式计算能力。要理清这种竞争力需要从数据架构的演变说起。

2.1 传统单体数据架构

传统单体数据架构

传统单体数据架构中,数据集中存储,架构分成计算层和存储层。这种架构初期效率很高,但是随着 业务种类越来越多系统越来越难以维护升级,此外 database 是唯一准确的数据源,每个 application 都需要访问 database 来获取对应的数据,一旦 database 发生改变或者出现问题,将会对整个业务系统产生影响

2.2 微服务架构

微服务架构
微服务架构的核心是:1个 application 由多个小的且相互独立的微型服务组成,各服务的开发和发布不存在依赖关系,这样整个系统相比于之前的传统单体数据架构就更加灵活

2.3 大数据 lambada 架构

大数据 lambada 架构

然而随着业务数据的迅速增长,传统的 RDBMS 已经不能够很好地支撑大规模数据集的存储和分析所需要的性能需求,越来越多企业开始寻求基于 Hadoop 构建其业绩大数据平台,比如数据湖。而且 Hive、Spark 等组件使得 SQL 在Hadoop 的应用变得简单而高效。
lambada 架构分两种处理途径,Speed layer 负责批处理(比如 Hadoop MapReduce),Batch layer 则负责流处理(比如 Storm)。这种架构存在问题:框架较多会导致平台复杂度高、运维成本高。虽说后面 Spark 框架能够同时支持批计算和流计算,但是Spark Streaming 的流计算本质上依旧是微批处理并非实时流计算。

2.4 Flink 优势

相比于 Spark Streaming的微批处理模式,Flink 通过 Google Dataflow 模型实现了实时流计算框架,将有界数据集转换成无界数据集统一进行流式处理。Flink 具有如下优势:


三、Flink应用场景

四、Flink 的架构

和大多数大数据处理框架类似,Flink 采用的也是主从架构(master/slaves),即1个 master 节点管理多个 (或1个)worker 节点,master 节点上跑着 jobmanager 服务,worker 节点上跑着 taskmanager 服务。客户端 client 则和 master 节点上的 JobManager 进行交互

4.1 架构概括

注意:

Flink 运行时架构

4.2 常见术语 Job、task、subtask、slot、operator、dataflow、streams he transformation 操作

slot: 负责管理分配资源的单位

4.3 操作链和共享任务槽

Flink 默认有策略对 Job 进行 operator chain 和 slot sharing 的控制。
一个 TaskManager 是一个JVM 进程,能够在不同线程中执行一个或者多个子任务。一个 worker 节点中包含至少一个任务槽 TaskSlot,其就是用来控制一个 worker 接受多少个任务

任务槽的特点:

任务槽共享的优点:
默认情况下,即使 subtasks 来自于不同 task 但是来自于同一个 job,则这些 subtasks 可以共享 slot。共享 slot 的好处:

操作链的特点:

禁用操作链
开启操作链

五、Flink 基本组件栈

Flink 基本组件栈

Flink 架构分为3层,即上层的 API & Libaries、中层的 Runtime 核心层、物理部署层。

5.1 API & Libaries

从 API 结构上看上去,和 Spark 类似,同样包括批处理、流处理、机器学习、图计算,也同样提供 Java、Scala、Python 接口。

5.2 Runtime 核心层

为上层的 API 调用提供接触服务。支持分布式 Stream 作业的执行、JobGraph 和 ExecutionGraph 的映射转换、任务调度等,将 DataStream 和 DataSet 转成统一且可执行的 Task Operator,以同时实现批处理和流处理。

5.3 物理部署层

Flink 的部署模式,可以是local、集群(Standalone、YARN)、云端(GCE/EC2)、K8s(最近比较火)。


六、任务提交和处理流程

Flink 的任务运行采用的是多线程方式,和 Spark 比较类似,和 Hadoop MapReduce 的多 JVM 进程的方式有较大区别,这使得 Flink 能够有效提高 CUP 使用效率,同时多个任务之间通过 TaskSlot 方式共享系统资源,每个 TaskManager 管理多个 TaskSlot 资源池以有效管理资源。


七、时间和窗口计算

7.1 时间概念

时间属性:流式数据处理最大特点是数据具有时间属性,比如 event 的时间包括:事件生成时间 event time、事件接入时间 ingestion time事件处理时间 process time,如图所示:

Flink 时间概念:事件生成时间、事件接入时间、事件处理时间

有时存在时间延迟等因素,可能会导致早生成的事件晚到 flink。Flink 默认采用 process time 事件概念,但是也可采用 event time 来处理事件以能够较好还原事件先后关系。

7.2 窗口计算

按照固定的时间或者长度将数据流(事件队列)切分成不同窗口,然后对各窗口中的数据做聚合计算,从而得到一定时间范围内的统计结果。比如统计某网站最近5分钟内的点击量,点击的数据会源源不断以事件队列的形式进入到 Flink,通过每隔5分钟切割队列得到有界数据,并在窗口内对有界数据进行聚合计算就可以得到最近5分钟的点击数。

7.3 WaterMark 水位线

有时由于网络延迟等因素,会导致事件数据不能及时传输到 Flink 中。Flink 创建一个基于时间的窗口 Window 来处理该事件的所有数据,必须先等待该事件的所有数据都到达该窗口才能开始处理,这时候就需要用到 WaterMark (表达数据到达完整性),满足 WaterMark 条件就会触发相应的窗口计算


八、Flink 状态管理和容错机制

8.1 有状态计算

定义:有状态计算是指,程序 存储计算的中间结果(缓存,比如 heap 内存或者 heap 外内存),并将其提供给后续 Function 或者 Operator 使用

8.1.1 有状态计算需求举例
8.1.2 有状态计算的优势

8.2 状态类型

区分依据:数据集 data set 是否按照 Key 进行分区,将状态分为:

相同点:keyed 和 Non-keyed 两种 state 都具有两种形式:

8.3 检查点 Checkpoints

Flink 中使用 Checkpoints 来实现容错,保证数据一致性Savepoints 是一种特殊的 Checkpoints,底层基于 Checkpoints实现。

8.3.1 Checkpoints 检查点机制
8.3.2 Checkpoints 举例

比如在 KafkaConsumer 算子中维护 Offset 状态,当系统出现问题无法从 kafka 消费数据时,可以将 Offset 记录在 state 中,当任务重新恢复时,就能够从指定的 Offset 开始消费数据。

8.3.3 Checkpoints 开启方法

默认 Checkpoints 机制不开启,可以在 application 代码中调用 enableCheckpointing(n) 来启用,其中 n 表示执行间隔(ms)。此外还有其他可配置参数:

env.enableCheckpointing(100);
// 设置模式
env.getCheckpointConfig().setCheckpointingMode(CheckpointingMode.EXACTLY_ONCE)

8.4 保存点 Savepoints

save points 需要手动命令行触发,主要用于在升级和维护 Flink 集群过程中保存系统中的状态数据到指定存储介质中。

类别 区别 备注
Checkpoints 默认不开启,一旦开启系统自动触发完成
Savepoints 用户手动命令行触发,系统升级维护中持久化状态数据 底层基于 Checkpoints
8.4.1 Operator ID 配置

配置 Operator ID 的原因:
升级时,需要停止整个 Flink application,虽说通过 Savepoints 可以将状态数据持久化磁盘然后恢复任务,但是有可能用户 application 的代码可能做了修改,因此可能导致无法从磁盘中恢复状态数据,因此就需要一个具有唯一性的标记算子 ID。

8.4.2 Savepoints 操作
# cd 到 ${flink_home}/libexec/bin
cd /usr/local/Cellar/apache-flink/1.9.1/libexec/bin
# 触发,jobid 和 targetDirectory 分别是对应的job id 和 持久化路径
flink savepoint :jobid :targetDirectory
# 指定 yarn appid 
flink savepoint :jobid :targetDirectory -yid :yarnappid
# 恢复任务
flink savepoint :jobid :savePointPath :runargs
# 取消任务并将中间结果持久化
flink cancel -s :targetDirectory :jobid
# 清除持久化数据
flink savepoint -d :savepointPath

# 配置默认的全局的 savepoints 持久化路径 -- 修改配置文件 flink-conf.yaml 中的配置项 state.savepoints.dir,比如
state.savepoints.dir: hdfs://flink/savepoints

8.5 状态管理器 StateBackend

StateBackend: 存储管理 Checkpoints 过程中的状态数据

8.5.1 StateBackend 类别
8.5.2 状态管理器配置

即指定 MemoryStateBackend、FsStateBackend、RocksDBStateBackend 中有谁来管理状态,默认是 MemoryStateBackend。配置包括两个层面:

Application 级别:

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setStateBackend(new FsStateBackend("hdfs://namenode:40010/flink/checkpoints/"))

如果是 RocksDBStateBackend 则需要在 pom.xml 中引入maven 依赖 rockdb:

        <dependency>
            <groupId>org.apache.flink</groupId>
            <artifactId>flink-statebackend-rocksdb_2.11</artifactId>
            <version>1.7.0</version>
        </dependency>

再将new FsStateBackend 修改为new RocksDBStateBackend

Cluster 级别:
修改配置文件 flink-conf.yaml 中的配置项 state.backendstate.checkpoint.dir,其中前者指明 StateBackend 类型,后者指明状态数据持久化存储路径,比如:

state.backend: filesystem
state.checkpoints.dir: hdfs://nameode:40010/flink/checkpoints/

如果是 RocksDBStateBackend,则需要在 flink-conf.yaml 中添加配置项:

# 指定同时可以操作 RocksDBStateBackend 的线程数,默认1
state.backend.rocksdb.checkpoint.transfer.thread.num: 1
# 指定 RocksDB 存储的本地路径
state.backend.rocksdb.localdir: /varrockdb/flink/checkpoints
# 指定定时器服务的工厂类实现类,默认 HEAP,也可为 RocksDB
state.backend.rocksdb.timer-service.factory: HEAP

8.6 可查询状态 Querable State

算子的状态 Operator State 是 Flink 中的核心概念,Flink 中基于状态统计出来的结果数据必须输出到外部系统中才能被其他系统使用,通常业务系统无法直接与 Flink 对接并获取中间状态的结果数据。Flink 提供了状态查询服务,业务系统可通过 Restful API 直接查询 Flink 系统内部的状态数据。查询服务包括三个主要组件:


九、Flink 的部署模式和高可用配置

9.1 Flink 的部署模式

Fink 部署模式包括多种,比较常见的是:Standalone 集群模式、YARN 集群模式、K8s 集群模式,其中:

9.2 Flink 的高可用

Flink 的高可用:主要强调的是JobManager 的高可用保证,因为 JobManager 作为 Flink 集群的管理节点没负责整个集群的任务调度和资源管理默认不开启高可用。目前高可用仅支持Standalone 集群YARN Session 集群

类别 方式 备注
Standalone JobManager 服务信息注册在 Zookeeper 中,通过 Zookeeper 完成 JobManager Leader 的选举,多个 JobManager 只有一个处于 active,其他处于 standby 如果没安装 Zookeeper 集群,Flink 也自带了 Zookeeper
YARN Session 重启 JobManager 来保证高可用 Flink JobManager 执行在 ApplicationMaster 所在容器中

十、Flink historyserver

Flink有一个历史记录服务器,可用于在关闭相应的Flink群集后查询已完成作业的统计信息。此外,它公开了一个REST API,它接受HTTP请求并使用JSON数据进行响应。


参考:
https://www.cnblogs.com/ronnieyuan/p/11853287.html
https://www.jianshu.com/p/0cd1db4282be
https://blog.csdn.net/zero__007/article/details/88201498

上一篇 下一篇

猜你喜欢

热点阅读