Flink介绍

Flink 实际应用场景

Flink 自从 2019 年初开源以来,迅速成为大数据实时计算领域炙手可热的技术框架。作为 Flink 的主要贡献者阿里巴巴率先将其在全集团进行推广使用,另外由于 Flink 天然的流式特性,更为领先的架构设计,使得 Flink 一出现便在各大公司掀起了应用的热潮。

阿里巴巴、腾讯、百度、字节跳动、滴滴、华为等众多互联网公司已经将 Flink 作为未来技术重要的发力点,迫切地在各自公司内部进行技术升级和推广使用。同时,Flink 已经成为 Apache 基金会和 GitHub 社区最为活跃的项目之一。

传统的分析方式通常是利用批查询,或将事件(生产上一般是消息)记录下来并基于此形成有限数据集(表)构建应用来完成。为了得到最新数据的计算结果,必须先将它们写入表中并重新执行 SQL 查询,然后将结果写入存储系统比如 MySQL 中,再生成报告。

Apache Flink 同时支持流式及批量分析应用,这就是我们所说的批流一体。Flink 在上述的需求场景中承担了数据的实时采集、实时计算和下游发送。

实时数据仓库和 ETL

ETL(Extract-Transform-Load)的目的是将业务系统的数据经过抽取、清洗转换之后加载到数据仓库的过程。
在这里插入图片描述
传统的离线数据仓库将业务数据集中进行存储后,以固定的计算逻辑定时进行 ETL 和其他建模后产出报表等应用。离线数据仓库主要是构建 T+1 的离线数据,通过定时任务每天拉取增量数据,然后创建各个业务相关的主题维度数据,对外提供 T+1 的数据查询接口。

上图展示了离线数据仓库 ETL 和实时数据仓库的差异,可以看到离线数据仓库的计算和数据的实时性均较差。数据本身的价值随着时间的流逝会逐步减弱,因此数据发生后必须尽快的达到用户的手中,实时数仓的构建需求也应运而生。

实时数据仓库的建设是“数据智能 BI”必不可少的一环,也是大规模数据应用中必然面临的挑战。

Flink 在实时数仓和实时 ETL 中有天然的优势:

  • 状态管理,实时数仓里面会进行很多的聚合计算,这些都需要对于状态进行访问和管理,Flink 支持强大的状态管理;
  • 丰富的 API,Flink 提供极为丰富的多层次 API,包括 Stream API、Table API 及 Flink SQL;
  • 生态完善,实时数仓的用途广泛,Flink 支持多种存储(HDFS、ES 等);
  • 批流一体,Flink 已经在将流计算和批计算的 API 进行统一。
    在这里插入图片描述
Flink 的以下特性完美的支持了事件驱动型应用:
  • 高效的状态管理,Flink 自带的 State Backend 可以很好的存储中间状态信息;
  • 丰富的窗口支持,Flink 支持包含滚动窗口、滑动窗口及其他窗口;
  • 多种时间语义,Flink 支持 Event Time、Processing Time 和 Ingestion Time;
  • 不同级别的容错,Flink 支持 At Least Once 或 Exactly Once 容错级别 Flink的主要特性包括:批流一体、Exactly-Once、强大的状态管理等。同时,Flink 还支持运行在包括 YARN、Mesos、Kubernetes 在内的多种资源管理框架上。阿里巴巴已经率先将 Flink 在全集团进行推广使用,事实证明,Flink已经可以扩展到数千核心,其状态可以达到 TB 级别,且仍能保持高吞吐、低延迟的特性。

因此,Flink 已经成为我们在实时计算的领域的第一选择。

Flink 的架构模型,Flink 的分层模型

在这里插入图片描述
Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,上图描述了 Flink 支持的 4 种不同级别的抽象

对于我们开发者来说,大多数应用程序不需要上图中的最低级别的 Low-level 抽象,而是针对 Core API 编程, 比如 DataStream API(有界/无界流)和 DataSet API (有界数据集)。这些流畅的 API 提供了用于数据处理的通用构建块,比如各种形式用户指定的转换、连接、聚合、窗口、状态等。

Table API 和 SQL 是 Flink 提供的更为高级的 API 操作,Flink SQL 是 Flink 实时计算为简化计算模型,降低用户使用实时计算门槛而设计的一套符合标准 SQL 语义的开发语言。

Flink 的数据流模型

Flink 程序的基础构建模块是流(Streams)与转换(Transformations),每一个数据流起始于一个或多个 Source,并终止于一个或多个 Sink。数据流类似于有向无环图(DAG)。

WordCount 计数程序举例:
在这里插入图片描述
在上图中,程序消费 Kafka 数据,这便是我们的 Source 部分。

然后经过 Map、Keyby、TimeWindow 等方法进行逻辑计算,该部分就是我们的 Transformation 转换部分,而其中的 Map、Keyby、TimeWindow 等方法被称为算子。通常,程序中的转换与数据流中的算子之间存在对应关系,有时一个转换可能包含多个转换算子。

最后,经过计算的数据会被写入到我们执行的文件中,这便是我们的 Sink 部分。

实际上面对复杂的生产环境,Flink 任务大都是并行进行和分布在各个计算节点上。在 Flink 任务执行期间,每一个数据流都会有多个分区,并且每个算子都有多个算子任务并行进行。算子子任务的数量是该特定算子的并行度(Parallelism),对并行度的设置是 Flink 任务进行调优的重要手段

在这里插入图片描述
从上图中可以看到,在上面的 map 和 keyBy/window 之间,以及 keyBy/window 和 Sink 之间,因为并行度的差异,数据流都进行了重新分配。

Flink 中的窗口和时间

窗口和时间是 Flink 中的核心概念之一。在实际成产环境中,对数据流上的聚合需要由窗口来划定范围,比如“计算过去的 5 分钟”或者“最后 100 个元素的和”。

Flink 支持了多种窗口模型比如滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)及会话窗口(Session Window)等。

Flink 支持的多种窗口模型:
在这里插入图片描述
同时,Flink 支持了事件时间(Event Time)、摄取时间(Ingestion Time)和处理时间(Processing Time)三种时间语义用来满足实际生产中对于时间的特殊需求。
在这里插入图片描述

### Flink CDC 的概念 Flink CDC (Change Data Capture) 是一种用于实时捕获数据库变更的技术,能够将这些变更加入到流处理框架中进行进一步的处理和分析[^1]。具体来说,Flink CDC 可以监听 MySQL 或其他支持的日志记录系统中的变化事件,并将其转换成可以被 Apache Flink 处理的数据流。 这种机制允许开发者构建低延迟的应用程序来响应最新的业务活动,而无需等待批量加载过程完成。它特别适用于需要及时反映最新状态更新场景下的应用开发工作。 ### 使用教程 #### 准备环境 为了使 Flink 能够读取来自 MySQL 数据库的变化日志,在配置 MySQL 实例时需确保已启用 binlog 功能并设置相应的参数: ```bash vim /etc/my.cnf ---------------------------------- [mysqld] # 开启 binlog 并指定二进制日志文件前缀 log-bin=mysql-bin # 集群备份恢复需要每台机器有唯一的 ID server-id=1 # 执行哪些库开启 binlog【库名DATABASE_NAME】 binlog-do-db=flink_cdc ---------------------------------- systemctl restart mysqld ``` 上述命令会修改 MySQL 的配置文件 `/etc/my.cnf` 来启动 binlog 日志功能,并针对特定数据库 `flink_cdc` 启用此特性[^4]。 #### 创建项目依赖 接下来创建一个新的 Maven 工程并将必要的依赖项加入 pom.xml 文件内: ```xml <dependencies> <!-- Flink dependencies --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Flink CDC Connectors dependency --> <dependency> <groupId>com.ververica</groupId> <artifactId>flink-connector-mysql-cdc</artifactId> <version>${cdc.connector.version}</version> </dependency> ... </dependencies> ``` 这里引入了两个主要组件:一个是核心的 Flink 流处理 API;另一个则是专门用来连接 MySQL 进行 CDC 操作的插件。 #### 编写代码实现逻辑 下面是一段简单的 Java 代码片段展示如何利用 Flink CDC Connector 对 MySQL 表执行变更捕捉操作: ```java import com.alibaba.ververica.cdc.connectors.mysql.MySqlSource; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; public class MysqlCdcExample { public static void main(String[] args) throws Exception { StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); MySqlSource<String> mySqlSource = MySqlSource.<String>builder() .hostname("localhost") .port(3306) .databaseList("flink_cdc") // 监听哪个数据库 .tableList("flink_cdc.inventory.products") // 监听哪张表 .username("root") .password("your_password_here") .deserializer(new JsonDeserializationSchema()) // 自定义反序列化器 .build(); env.fromSource(mySqlSource, WatermarkStrategy.noWatermarks(), "MySQL Source") .print(); // 输出结果至控制台 env.execute("FlinkCDC Example"); } } ``` 这段代码展示了怎样建立一个基本的任务流程,其中包含了从 MySQL 中获取增量数据并通过打印的方式输出给用户查看的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值