Flink CDC实时从MySQL数据库获取多张表存入Kafka
1. 流程概述
下面是实现"flink cdc实时从mysql数据库获取多张表 存入kafka"的整体流程:
步骤 | 描述 |
---|---|
步骤一 | 使用Flink CDC连接MySQL数据库 |
步骤二 | 配置CDC数据源 |
步骤三 | 从CDC数据源读取变化数据 |
步骤四 | 将变化数据转换成JSON格式 |
步骤五 | 将JSON数据发送到Kafka |
下面将详细介绍每个步骤需要做什么,以及需要使用的代码。
2. 步骤一 - 使用Flink CDC连接MySQL数据库
首先,我们需要使用Flink CDC连接MySQL数据库。Flink CDC提供了一个MySQL CDC Connector来实现与MySQL数据库的连接。
import org.apache.flink.table.api.EnvironmentSettings
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment
import org.apache.flink.table.connector.ChangelogMode
import org.apache.flink.table.connector.format.DecodingFormat
import org.apache.flink.table.connector.source.ScanTableSource
import org.apache.flink.table.connector.source.abilities.SupportsReadingMetadata
import org.apache.flink.table.data.GenericRowData
import org.apache.flink.table.types.DataType
val settings = EnvironmentSettings.newInstance().useBlinkPlanner().inStreamingMode().build()
val tEnv = StreamTableEnvironment.create(env, settings)
val mysqlSourceDDL =
"""
|CREATE TABLE mysql_table (
| id INT,
| name STRING
|) WITH (
| 'connector' = 'mysql-cdc',
| 'hostname' = 'localhost',
| 'port' = '3306',
| 'username' = 'root',
| 'password' = 'password',
| 'database-name' = 'your_database_name',
| 'table-name' = 'your_table_name',
| 'debezium.snapshot.locking.mode' = 'none'
|)
|""".stripMargin
tEnv.executeSql(mysqlSourceDDL)
其中,mysql_table
是我们要从中读取数据的表。可以根据需要修改连接MySQL的相关配置。
3. 步骤二 - 配置CDC数据源
接下来,我们需要配置CDC数据源,指定要读取的表和每个表的变化模式(Insert、Update、Delete)。
val sourceName = "mysql_table"
val source = tEnv.from("mysql_table") // 数据源名称和前面创建的表名称一致
val changelogMode = ChangelogMode.newBuilder()
.addContainedKind(ChangelogMode.Insert)
.addContainedKind(ChangelogMode.UpdateBefore)
.addContainedKind(ChangelogMode.UpdateAfter)
.addContainedKind(ChangelogMode.Delete)
.build()
val decodingFormat = new DecodingFormat[ScanTableSource, ChangelogMode] {
override def createRuntimeDecoder(
runtimeProviderContext: DynamicTableSource.Context,
formatProperties: util.Map[String, String],
producedDataType: DataType): ScanTableSource.DecodingRuntimeProvider = {
new ScanTableSource.DecodingRuntimeProvider {
override def createRuntimeDecoder(
runtimeProviderContext: DynamicTableSource.Context,
formatProperties: util.Map[String, String],
producedDataType: DataType): ScanTableSource.RecordDecoder = {
new ScanTableSource.RecordDecoder {
override def decode(record: Any): GenericRowData = {
record.asInstanceOf[GenericRowData]
}
}
}
}
}
override def supportsNestedProjection(): Boolean = false
override def getChangelogMode: ChangelogMode = changelogMode
override def createRuntimeEncoder(
runtimeProviderContext: DynamicTableSource.Context,
formatProperties: util.Map[String, String],
consumedDataType: DataType): DynamicTableSource.DataStructureConverter = {
throw new UnsupportedOperationException()
}
}
tEnv.registerTableSource(sourceName, source)
tEnv.getConfig.getConfiguration.setBoolean("python.fn-execution.memory.managed", true)
4. 步骤三 - 从CDC数据源读取变化数据
接下来,我们需要从CDC数据源读取变化的数据。
val sourceDataStream = tEnv.toDataStream(source)
5. 步骤四 - 将变化数据转换成JSON格式
我们需要将变化的数据转换成JSON格式,以便后续发送到Kafka。可以使用Flink提供的JSON库来实现。
import org.apache.flink.api.common.serialization.SerializationSchema
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer
val kafkaProducer = new FlinkKafkaProducer[String](
"your_kafka_topic",
new Serialization