Flink从Kafka读取数据存入MySQL

本文介绍如何使用Flink从Kafka读取数据,并将其存入MySQL数据库。涉及的环境包括win10操作系统,Flink 1.6.2,Kafka 0.9.0.0和MySQL 5.6.21。文章详细说明了Zookeeper和Kafka的启动过程,数据格式,以及MySQL表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Flink从Kafka读取数据存入MySQL

运行环境

    os Version:win10
    Flink Version:1.6.2
    Kafka Version:0.9.0.0
    MySQL Version:5.6.21

数据格式

1.74.103.143 2018-12-20 18:12:00 “GET /class/130.html HTTP/1.1” 404 https://search.yahoo.com/search?p=Flink实战

zookeeper

启动zookeeper

命令行输入zkserver(设置好环境变量)

> zkserver

kafka

启动kafka

kafka 安装目录

.\bin\windows\kafka-server-start.bat .\config\server.properties

创建topic

.\bin\windows\ 目录下

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test001

打开生产者

kafka-console-producer.bat --broker-list localhost:9092 --topic test

打开消费者

kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test001 --from-beginning

mysql 建表

create table log_info(
ID INT NOT NULL AUTO_INCREMENT,
IP VARCHAR(50),
TIME VARCHAR(50),
CourseID VARCHAR(10),
Status_Code VARCHAR(10),
Referer VARCHAR(100),
PRIMARY KEY ( ID )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

查看表数据

select count(*) from log_info;

kafka,zookeeper安装

flink清洗数据

Apache Flink 1.15.4版本中使用DataStream API与数据库交互通常需要使用Flink SQL或表API。以下是使用Table API与MySQL连接并读取数据的一个简单示例,同时通过Kafka作为事件源更新内存中的数据: ```java import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.streaming.api.datastream.DataStream; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.table.api.bridge.java.StreamTableEnvironment; import org.apache.flink.table.api.Table; import org.apache.flink.table.api.TableConfig; import org.apache.flink.table.api.TableSchema; import org.apache.flink.table.api.Types; import org.apache.flink.table.api.ValidationException; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; public class FlinkMySQLKafkaExample { public static void main(String[] args) throws Exception { // 初始化流处理环境 final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); // 创建TableEnvironment final TableConfig tableConfig = new TableConfig(); tableConfig.set("format", "json"); // 如果MySQL数据是JSON格式 tableConfig.addConnectionProvider("jdbc", new JdbcConnectionProvider()); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, tableConfig); // 定义表连接MySQL String mysqlUrl = "jdbc:mysql://localhost:3306/mydatabase"; String tableName = "my_table"; TableSchema schema = TableSchema.builder() .field("id", Types.BIGINT) .field("name", Types.STRING) .build(); try { Table mysqlTable = tEnv.fromDatabase("default", tableName, schema, mysqlUrl); } catch (ValidationException e) { System.err.println("Error connecting to MySQL: " + e.getMessage()); return; } // 从Kafka消费更新数据 Properties kafkaProps = new Properties(); kafkaProps.setProperty("bootstrap.servers", "localhost:9092"); kafkaProps.setProperty("group.id", "test-group"); FlinkKafkaConsumer<String> kafkaSource = new FlinkKafkaConsumer<>("my-topic", new SimpleStringMapper(), kafkaProps); DataStream<String> kafkaStream = env.addSource(kafkaSource); // 将Kafka的消息映射到表结构并更新内存 DataStream<Row> updatedTable = kafkaStream.map(new MapFunction<String, Row>() { @Override public Row map(String value) throws Exception { // 解析Kafka消息并转换成Row对象 Map<String, Object> rowMap = JSON.parseToObject(value, new TypeReference<Map<String, Object>>() {}); return Row.of(rowMap.get("id"), rowMap.get("name")); } }).toTable(tEnv, schema); // 更新MySQL表 Table updatedMySqlTable = updatedTable.update(mysqlTable); // 运行流处理任务 updatedMySqlTable.executeInsert("default").await(); // 关闭资源 env.execute("Flink MySQL Kafka Example"); } private static class SimpleStringMapper implements MapFunction<String, String> { @Override public String map(String value) { // 实现字符串解析逻辑 return value; } } } // 相关问题:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值