Flink流合并

流的联合虽然简单,不过受限于数据类型不能改变,灵活性不足,实践中较少使用。在实际应用中, 可能需要将不同来源的数据连接合并在一起处理, 也有可能需要将。最简单的合流操作, 就是直接将多条流合在一起,叫作流“联合”(单独的每一组“配对”数据了, 而是传入了可遍历的数据集合。基本的简单转换和聚合, 还是基于窗口的计算,都是针对一条流上的数据进行。求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,的思路就是针对一条流的每条数据,开辟出其时间戳前后的一段时间间隔,方法,就可以输出任意类型的数据了。
摘要由CSDN通过智能技术生成
  • 多流转换

    无论基本的简单转换和聚合, 还是基于窗口的计算,都是针对一条流上的数据进行 处理的。在实际应用中, 可能需要将不同来源的数据连接合并在一起处理, 也有可能需要将 一条流拆分开, 所以经常会有对多条流进行处理的场景。简单划分,多流转换可以分为“分流”和“合流”两大类。目前分流的操作一般是过侧输出流(side output) 来实现,而合流的算子比较丰富,根据不同的需求可以调用 unionconnectjoin 以及 coGroup 等接口进行连接合并操作。

  • 侧输出流
    简单来说,只需要调用上下文 ctxoutput()方法,就可以输出任意类型的数据了。而侧输出流的标记和提取, 都离不开一个“输出标签”(OutputTag),指定了侧输出流的 id 型。
    代码示例:

    package com.company.flink.demo;
    
    import com.company.flink.data.ClickSource;
    import com.company.flink.entity.Event;
    import org.apache.flink.api.java.tuple.Tuple3;
    import org.apache.flink.streaming.api.datastream.DataStream;
    import org.apache.flink.streaming.api.datastream.SingleOutputStreamOperator;
    import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
    import org.apache.flink.streaming.api.functions.ProcessFunction;
    import org.apache.flink.util.Collector;
    import org.apache.flink.util.OutputTag;
    
    
    public class SplitStreamDemo {
        // 定义侧输出流
        private static OutputTag<Tuple3<String, String, Long>> zhangsanTag = new OutputTag<Tuple3<String, String, Long>>("zhangsan-pv"){};
        private static OutputTag<Tuple3<String, String, Long>> lisiTag = new OutputTag<Tuple3<String, String, Long>>("lisi-pv"){};
    
        public static void main(String[] args) throws Exception {
            StreamExecutionEnvironment env =
                    StreamExecutionEnvironment.getExecutionEnvironment();
            SingleOutputStreamOperator<Event> stream = env
                    .addSource(new ClickSource());
    
            SingleOutputStreamOperator<Event> outPutStream = stream.process(
                    new ProcessFunction<Event, Event>() {
                               @Override
                               public void processElement(Event value, Context ctx, Collector<Event> out) {
                                   if (value.user.equals("zhangsan")) {
                                       ctx.output(zhangsanTag, new Tuple3<>(value.user, value.url, value.timestamp));
                                   } else if (value.user.equals("lisi")) {
                                       ctx.output(lisiTag, new Tuple3<>(value.user, value.url, value.timestamp));
                                   } else {
                                       out.collect(value);
                                   }
                               }
                           });
            DataStream<Tuple3<String, String, Long>> zhangsanSideOutput = outPutStream.getSideOutput(zhangsanTag);
            zhangsanSideOutput.print("zhangsan pv");
            DataStream<Tuple3<String, String, Long>> lisiSideOutput = outPutStream.getSideOutput(lisiTag);
            lisiSideOutput.print("lisi pv");
            outPutStream.print("else");
            env.execute();
        }
    }
  • 合流操作
    Flink  中合流的操作会更加普遍,对应的 API 也更加丰富。
    1)联合(
    Union)

         最简单的合流操作, 就是直接将多条流合在一起,叫作流“联合”(union)。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素, 数据类型不

    2)连接(Connect)
         流的联合虽然简单,不过受限于数据类型不能改变,灵活性不足,实践中较少使用。除了联合(union
    ),Flink 还提供了另外一种合流操作就是连接(connect)。这种操作就是直接把两条流像接线一样对接起来。
        
    为了处理更加灵活,连接操作允许流的数据类型不同。但一个 DataStream 中的数据类型是唯一的(所以需要co-process)转换操作)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]:离线还原MySQL数据经过上述步骤,即可将Binlog日志记录写入到HDFS的对应的分区中,接下来就需要根据增量的数据和存量的数据还原最新的数据。Hive 表保存在 HDFS 上,该文件系统不支持修改,因此我们需要一些额外工作来写入数据变更。常用的方式包括:JOIN、Hive 事务、或改用 HBase、kudu。如昨日的存量数据code_city,今日增量的数据为code_city_delta,可以通过 FULL OUTER JOIN,将存量和增量数据合并成一张最新的数据表,并作为明天的存量数据: 。 引用\[2\]:本文主要从Binlog式采集和基于Binlog的ODS数据还原两方面,介绍了通过Flink实现实时的ETL,此外还可以将binlog日志写入kudu、HBase等支持事务操作的NoSQL中,这样就可以省去数据表还原的步骤。本文是《基于Canal与Flink实现数据实时增量同步》的第二篇,关于canal解析Binlog日志写入kafka的实现步骤,参见《基于Canal与Flink实现数据实时增量同步一》。。 引用\[3\]:首先,采用Flink负责把Kafka上的Binlog数据拉取到HDFS上。然后,对每张ODS表,首先需要一次性制作快照(Snapshot),把MySQL里的存量数据读取到Hive上,这一过程底层采用直连MySQL去Select数据的方式,可以使用Sqoop进行一次性全量导入。最后,对每张ODS表,每天基于存量数据和当天增量产生的Binlog做Merge,从而还原出业务数据。Binlog是式产生的,通过对Binlog的实时采集,把部分数据处理需求由每天一次的批处理分摊到实时上。无论从性能上还是对MySQL的访问压力上,都会有明显地改善。Binlog本身记录了数据变更的类型(Insert/Update/Delete),通过一些语义方面的处理,完全能够做到精准的数据还原。 。 回答: 在Flink中实现数据增量的过程可以通过以下步骤来完成。首先,使用Flink将Kafka上的Binlog数据拉取到HDFS上。然后,对每张ODS表,需要先制作一次性快照(Snapshot),将MySQL中的存量数据读取到Hive上,可以使用Sqoop进行一次性全量导入。最后,对每张ODS表,每天基于存量数据和当天增量产生的Binlog进行Merge,从而还原出业务数据。通过实时采集Binlog,将部分数据处理需求从每天一次的批处理转移到实时上,从而改善性能和对MySQL的访问压力。Binlog本身记录了数据变更的类型(Insert/Update/Delete),通过一些语义方面的处理,可以实现精准的数据还原。\[3\] #### 引用[.reference_title] - *1* *2* *3* [基于Canal与Flink实现数据实时增量同步(二)](https://blog.csdn.net/weixin_39791225/article/details/113939521)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值