Flink多sink输出

本文介绍了Flink如何实现多sink输出。首先讲解了Flink单一流如何使用OutputTag侧输出多个计算结果,虽然同一对象无法多次输出。接着阐述了Flink多阶段sink的策略,通过OutputTag侧输出先进行一次sink,然后主流继续计算,最终再进行最后一次sink操作。

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

Flink多sink

Flink单一流多sink

通过OutputTag侧输出多个计算结果(同一结果对象需要进行copy再设置至侧输出流, 暂不支持同对象多次输出)进行sink

Flink多阶段sink

通过OutputTag侧输出第一次计算结果进行sink
主流继续计算, 最后再sink

package com.gin.demo;

import lombok.*;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.common.typeinfo.TypeInformation;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.streaming.api.functions.sink.PrintSinkFunction;
import org.apache.flink.util.Collector;
import org.apache.flink.util.OutputTag;

import java.io.IOException;

/**
 * 场景:
 * 先以IP维度计算IP关联次数, 再以userId维度计算userId关联次数
 * 
### Flink CDC Sink 的使用指南 Flink CDC 提供了强大的功能用于处理数据流中的变更捕获和同步操作。Sink 是指将数据从 Flink 流写入目标存储系统的组件,常见的目标系统包括 TiDB、MySQL、PostgreSQL、HBase 和 Kafka 等[^1]。 #### 配置 Flink CDC Sink 为了配置 Flink CDC 的 Sink 功能,通常需要指定目标连接器以及相应的参数。以下是一个典型的 MySQL 数据库作为目标的示例: ```sql CREATE TABLE sink_table ( id INT, name STRING, price DOUBLE, ts BIGINT, dt STRING, PRIMARY KEY (id) NOT ENFORCED ) WITH ( 'connector' = 'jdbc', 'url' = 'jdbc:mysql://localhost:3306/sink_db?useSSL=false&serverTimezone=UTC', 'table-name' = 'sink_table', 'username' = 'root', 'password' = 'root-password' ); ``` 此 SQL 脚本创建了一个名为 `sink_table` 的表,并将其与 JDBC 连接器绑定。JDBC URL 指定了目标数据库的位置和其他必要的属性[^3]。 #### 常见问题及其解决方案 1. **无法找到合适的 JAR 文件** 如果在运行过程中遇到错误提示找不到特定的数据源或目标连接器,则可能是因为缺少所需的依赖项。解决方法是从 Maven 中央仓库下载正确的 JAR 文件并加载到作业环境中[^1]。 2. **主键冲突** 当尝试向目标表插入重复主键时会发生异常。可以通过设置唯一约束或者调整业务逻辑避免此类情况发生[^3]。 3. **性能优化** 对于大规模数据传输场景,建议启用批量模式以提高吞吐量。例如,在 JDBC 输出端可通过如下方式开启批处理: ```sql 'sink.buffer-flush.max-rows'='1000', 'sink.buffer-flush.interval'='1s' ``` 这些参数控制每次提交前缓冲的最大行数及时长间隔[^2]。 --- ### 示例代码:完整的 Flink CDC Pipeline 下面展示如何构建一个简单的 ETL 流程,其中包含 Source 和 Sink 表定义及查询语句。 ```sql -- 创建 Source 表 CREATE TABLE source_table ( id INT PRIMARY KEY NOT ENFORCED, name STRING, price DOUBLE ) WITH ( 'connector' = 'mysql-cdc', 'hostname' = 'source-host', 'port' = '3306', 'username' = 'user', 'password' = 'pass', 'database-name' = 'db_name', 'table-name' = 'tbl_name' ); -- 创建 Sink 表 CREATE TABLE sink_table ( id INT, name STRING, price DOUBLE, PRIMARY KEY(id) NOT ENFORCED ) WITH ( 'connector' = 'kafka', 'topic' = 'output_topic', 'properties.bootstrap.servers' = 'broker:9092', 'format' = 'json' ); -- 插入数据至 Sink INSERT INTO sink_table SELECT * FROM source_table; ``` 以上脚本展示了如何利用 MySQL-CDC 读取变化事件并通过 Kafka 发送出去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值