Flink SideOutput 数据分流处理

大数据学习之路

不积跬步,无以至千里。不积小流,无以成江海。------荀子

为什么要数据分流

通常数据流中包含多种类型数据,每种类型数据需要进行不同的分析。因此我们不得不对数据进行分流。

传统的方式我们可能需要对数据流进行多次遍历或者复制,本文学习Flink如何对数据流进行分流处理,这就是文章主角SideOutput

从一个简单例子讲起

下面代码例子,将原始的Integer 数据流 分流为奇数、偶数; 通过getSideOutput 得到两个数据流,一个只包含奇数的数据流,一个只包含偶数的数据流,然后对分流后的数据流进行打印。

  • 1.定义不同分流的OutputTag

    OutputTag evenTag = new OutputTag("even"){};
    OutputTag oddTag = new OutputTag("odd"){};

  • 2.根据不同的条件将数据输出到不同的 side output

    if(value % 2 == 0){
    ctx.output(evenTag,value);
    }else {
    ctx.output(oddTag,value);
    }

  • 3.使用 SingleOutputStreamOperator#getSideOutput(OutputTagsideOutputTag)方法获取对应的数据流

    SideOutputDataStream evenStream = passThroughtStream.getSideOutput(evenTag);

    SideOutputDataStream oddStream = passThroughtStream.getSideOutput(oddTag);

  • 4.对不同数据流进行处理 本案例只是简单的打印

    evenStream.print("Even Numbers: ");
    // 打印奇数流
    oddStream.print("Odd Numbers: ");

完整的代码

java 复制代码
 public static void main(String[] args) throws Exception {
        // 设置执行环境
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 创建一个简单的整数数据流
        DataStream<Integer> dataStream = env.fromElements(1, 2, 3, 4, 5, 6);

        OutputTag<Integer> evenTag = new OutputTag<Integer>("even"){};
        OutputTag<Integer> oddTag = new OutputTag<Integer>("odd"){};

        SingleOutputStreamOperator<Integer> passThroughtStream = dataStream.process(new ProcessFunction<Integer, Integer>() {
            @Override
            public void processElement(Integer value, ProcessFunction<Integer, Integer>.Context ctx, Collector<Integer> out) throws Exception {

                if(value % 2 == 0){
                    ctx.output(evenTag,value);
                }else {
                    ctx.output(oddTag,value);
                }

            }
        });


        SideOutputDataStream<Integer> evenStream = passThroughtStream.getSideOutput(evenTag);

        SideOutputDataStream<Integer> oddStream = passThroughtStream.getSideOutput(oddTag);
        // 打印偶数流
        evenStream.print("Even Numbers: ");
        // 打印奇数流
        oddStream.print("Odd Numbers: ");

        // 执行任务
        env.execute();
    }

总结

  • 分流处理

    对于一个复杂的数据流可能包含多种属性,我们需要对这个数据流进行多维度分析,因此我们可能需要根据数据的某些属性将其分流到不同的处理路径。

    例如,一个数字流我们可以按照 正数、负数、奇数、偶数、质数等进行分流处理。

    使用Side Output可以轻松实现这种分流,而无需多次复制数据流,从而提高处理效率。

  • 异常值捕获:实际的业务数据中通常包含一些不合法的数据(如空值、数据过大的异常值等)。使用Side Output可以将这些异常数据分流,然后对异常数据进行处理分析。

    前面文章中 Watermark对延迟数据处理,其中一种方式就是输出到Side Output 。

Flink 分流机制避免了多次复制数据流,从而减少系统的资源消耗,提高了处理效率。

相关推荐
Raas10014 小时前
MAIGateway,魔芋企业级AI网关的安全基建化设计
大数据·人工智能·网关·网络安全·api网关·mai gateway·魔芋
Anita-lee14 小时前
泛娱乐出海 APP 运营研究:用户量下滑成因与多语种客服数据化运营解决方案
大数据·产品运营·服务发现·娱乐
笨鸟先飞,勤能补拙14 小时前
AI Agent应用领域深度解析:从概念到落地的全维度审视
大数据·人工智能·python·物联网·安全·网络安全·github
Francek Chen14 小时前
【大数据处理与分析】数据仓库Hive:02 数据湖
大数据·数据仓库·hive·hadoop·分布式·数据分析
IT小白杨14 小时前
从Chromium重构到真实ARM云手机:多账号隔离方案的技术演进
大数据·经验分享·智能手机·重构·安全架构·指纹浏览器
躺柒15 小时前
读数据可视化01可视化简史
大数据·信息可视化·数据分析·数据可视化·视觉
Elastic 中国社区官方博客15 小时前
用两行 JSON 替换你的 ILM 策略:数据流生命周期新增冻结层支持
大数据·运维·elasticsearch·搜索引擎·架构·全文检索
头茬韭菜15 小时前
第 4 篇:「Fluss + Flink 集成实战」—— Catalog、Source 与 Sink
大数据·python·flink·fluss
天天爱吃肉821815 小时前
【工程师硬件学习笔记:串口‑总线体系与三电试验室异构系统集成深度实战】
大数据·笔记·python·嵌入式硬件·学习·汽车
starzy199015 小时前
Spark 核心之二次排序、分组取 TopN 优化分析
大数据·分布式·spark