flink读kafka写入mysql_Flink 1.9 实战:使用 SQL 读取 Kafka 并写入 MySQL

本文介绍了如何使用 Flink SQL 1.9.0 读取 Kafka 数据并写入 MySQL,通过 SqlSubmit 工具提交 SQL 作业,涉及 Kafak 源表和 MySQL 结果表的 DDL 创建,以及实时 PVUV 计算。文章提供实战代码,帮助初学者理解 Flink SQL 的使用。

上周六在深圳分享了《Flink SQL 1.9.0 技术内幕和最佳实践》,会后许多小伙伴对最后演示环节的 Demo 代码非常感兴趣,迫不及待地想尝试下,所以写了这篇文章分享下这份代码。希望对于 Flink SQL 的初学者能有所帮助。完整分享可以观看 Meetup 视频回顾 :

https://developer.aliyun.com/live/1416

这份代码主要由两部分组成:1) 能用来提交 SQL 文件的 SqlSubmit 实现。2) 用于演示的 SQL 示例、Kafka 启动停止脚本、 一份测试数据集、Kafka 数据源生成器。

通过本实战,你将学到:

如何使用 Blink Planner

一个简单的 SqlSubmit 是如何实现的

如何用 DDL 创建一个 Kafka 源表和 MySQL 结果表

运行一个从 Kafka 读取数据,计算 PVUV,并写入 MySQL 的作业

设置调优参数,观察对作业的影响

SqlSubmit 的实现

笔者一开始是想用 SQL Client 来贯穿整个演示环节,但可惜 1.9 版本 SQL CLI 还不支持处理 CREATE TABLE 语句。所以笔者就只好自己写了个简单的提交脚本。后来想想,也挺好的,可以让听众同时了解如何通过 SQL 的方式,和编程的方式使用 Flink SQL。

SqlSubmit 的主要任务是执行和提交一个 SQL 文件,实现非常简单,就是通过正则表达式匹配每个语句块。如果是 CREATE TABLE 或 INSERT INTO 开头,则会调用 tEnv.sqlUpdate(...)。如果是 SET 开头,则会将配置设置到 TableConfig 上。其核心代码主要如下所示:

EnvironmentSettings settings = EnvironmentSettings.newInstance()

.useBlinkPlanner()

.inStreamingMode()

.build();

// 创建一个使用 Blink Planner 的 TableEnvironment, 并工作在流模式

TableEnvironment tEnv = TableEnvironment.create(settings);

// 读取 SQL 文件

List sql = Files.readAllLines(path);

// 通过正则表达式匹配前缀,来区分不同的 SQL 语句

List calls = SqlCommandParser.parse(sql);

// 根据不同的 SQL 语句,调用 TableEnvironment 执行

for (SqlCommandCall call : calls) {

switch (call.command) {

case SET:

String key = call.operands[0];

String value = call.operands[1];

// 设置参数

tEnv.getConfig().getConfiguration().setString(key, value);

break;

case CREATE_TABLE:

String&nbs

### 使用 FlinkKafka 消费消息存储至 MySQL 为了实现使用 Apache FlinkKafka读取消息将这些消息持久化到 MySQL 数据库的功能,通常会遵循如下设计模式。此过程不仅涉及到了解如何配置 Flink 来作为消费者订阅 Kafka 主题,还需要掌握怎样设置合适的 Sink 函数来确保数据能够被可靠地写入目标数据库。 #### 配置环境依赖项 首先,在构建项目之前,需确认已引入必要的 Maven 或 Gradle 依赖以支持 Flink-Kafka 连接器以及 JDBC Connector: 对于 Maven 用户来说,`pom.xml` 文件应包含以下条目[^2]: ```xml <dependencies> <!-- Flink dependencies --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-streaming-java_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- Kafka connector dependency --> <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.12</artifactId> <version>${flink.version}</version> </dependency> <!-- MySQL JDBC driver --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!-- Other necessary dependencies... --> </dependencies> ``` #### 创建 Flink 应用程序逻辑 接下来展示一段 Python 实现的伪代码用于说明整个流程;请注意实际开发中应当采用 Java 或 Scala 编程语言编写生产级别的应用程序。 ```python from pyflink.datastream import StreamExecutionEnvironment from pyflink.table import StreamTableEnvironment, EnvironmentSettings import json env = StreamExecutionEnvironment.get_execution_environment() settings = EnvironmentSettings.new_instance().in_streaming_mode().use_blink_planner().build() t_env = StreamTableEnvironment.create(env, environment_settings=settings) # Define source from Kafka topic using DDL statement or Table API t_env.execute_sql(""" CREATE TABLE kafka_source ( id BIGINT, message STRING ) WITH ( &#39;connector&#39; = &#39;kafka&#39;, &#39;topic&#39; = &#39;your_topic_name&#39;, &#39;properties.bootstrap.servers&#39; = &#39;localhost:9092&#39;, &#39;format&#39; = &#39;json&#39; ) """) # Transformations can be applied here as needed... # Define sink to MySQL table via JdbcCatalog or SQL INSERT INTO syntax t_env.execute_sql(f""" INSERT INTO mysql_sink (id, content) SELECT id, message FROM kafka_source; """) ``` 上述脚本展示了创建一个简单的管道,该管道可以从指定的主题名称处获取 JSON 格式的记录,将其插入名为 `mysql_sink` 的关系型表内。这里假设已经预先建立了对应的物理表结构[^3]。 值得注意的是,当涉及到高可用性和一致性保障时,官方文档提到过利用 TwoPhaseCommitSinkFunction 类可帮助达成跨系统的 Exactly-once 语义[^1]。然而具体实施细节取决于业务需求和技术栈的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值