【Flink】旁侧流的应用场景及代码实战

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>()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值