0、引言
在 Flink 中,"旁侧流"(Side Output)是一种特殊的输出流,它可以从同一个操作中分离出不同的数据流,从而实现数据的多路复用。
一、应用场景
旁侧流在 Flink 中有多种应用场景,以下是一些常见的例子:
- 数据分流:在某些业务场景中,可能需要将数据根据特定条件分流到不同的输出,例如,将正常数据和异常数据分别发送到不同的主题或存储系统中。
- 特征工程:在机器学习或数据分析中,可能需要从原始数据流中提取不同的特征集,用于不同的模型训练或分析。
- 实时监控:在处理数据流时,可能需要实时监控数据的某些指标,如流量大小、异常率等,并将监控结果输出到监控系统。
- 数据备份:为了保证数据的安全性,可能需要将处理过程中的数据备份到不同的存储系统中,以便于数据恢复
- 迟到数据处理:在流处理系统中,对于晚于预期到达的数据,通过特定的机制(如水印和窗口)来识别并进行特殊处理,以确保数据的准确性和时效性,同时减少对整体处理流程的影响
二、代码实现
2.1 数据分流
描述:将数据根据特定条件分流到不同的输出,例如,将正常数据和异常数据分别发送到不同的主题或存储系统。
代码示例:
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.output.SideOutput;
import org.apache.flink.streaming.api.output.SideOutputMode;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
public class DataDivertingExample {
public static void main(String[] args) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 定义两个旁侧输出标签
final OutputTag<String> normalOutputTag = new OutputTag<String>("normal-output"){};
final OutputTag<String> errorOutputTag = new OutputTag<String>("error-output"){};
DataStream<String> input = env.fromElements("data1", "errorData", "data2", "data3");
DataStream<String> normalDataStream = input
.filter(new FilterFunction<String>() {
@Override
public boolean filter(String value) throws Exception {
return !value.contains("error");
}
})
.map(new MapFunction<String, String>()