flink测流输出

flink测流输出

目的
给数据打上标签,我们支取其中的某一个或者几个标签作为支流输出,其他的所有的主流可以另外输出,
还能获取迟到的数据

package com._51doit.flink.day06;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.java.tuple.Tuple3;
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.ProcessFunction;
import org.apache.flink.util.Collector;
import org.apache.flink.util.OutputTag;
/**
 * 1.将数据整理成Tuple3
 * 2.然后使用侧流输出将数据分类
 */
public class SideOutputsDemo2 {

    public static void main(String[] args) throws Exception {

        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

//        view,pid,2020-03-09 11:42:30
//        activity,a10,2020-03-09 11:42:38
//        order,o345,2020-03-09 11:42:38
        DataStreamSource<String> lines = env.socketTextStream("localhost", 8888);

        OutputTag<Tuple3<String, String, String>> viewTag = new OutputTag<Tuple3<String, String, String>>("view-tag") {
        };
        OutputTag<Tuple3<String, String, String>> activityTag = new OutputTag<Tuple3<String, String, String>>("activity-tag") {
        };
        OutputTag<Tuple3<String, String, String>> orderTag = new OutputTag<Tuple3<String, String, String>>("order-tag") {
        };

        //直接调用process方法
        SingleOutputStreamOperator<Tuple3<String, String, String>> tpDataStream = lines.process(new ProcessFunction<String, Tuple3<String, String, String>>() {

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
            }

            @Override
            public void processElement(String input, Context ctx, Collector<Tuple3<String, String, String>> out) throws Exception {

                //1.将字符串转成Tuple2
                String[] fields = input.split(",");
                String type = fields[0];
                String id = fields[1];
                String time = fields[2];
                Tuple3<String, String, String> tp = Tuple3.of(type, id, time);

                //2.对数据打标签
                //将数据打上标签
                if (type.equals("view")) {
                    //输出数据,将数据和标签关联
                    ctx.output(viewTag, tp);  //ctx.output  输出侧流的
                } else if (type.equals("activity")) {
                    ctx.output(activityTag, tp);
                } else {
                    ctx.output(orderTag, tp);
                }
                //输出主流的数据
                out.collect(tp);
            }
        });


        //输出的测流只能通过getSideOutput
        DataStream<Tuple3<String, String, String>> viewDataStream = tpDataStream.getSideOutput(viewTag);

        //分别处理各种类型的数据。
        viewDataStream.print();

        env.execute();

    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink的侧输出(Side Output)是一种将数据分发到多个输出的机制。通常情况下,Flink的数据会经过一系列的变换操作后输出到一个或多个目标,但有时候我们需要根据特定的条件将数据发送到额外的输出通道,这时就可以使用侧输出。 具体来说,侧输出是通过调用`ProcessFunction`中的`OutputTag`来实现的。`OutputTag`是一个标识符,用于标记侧输出。在`ProcessFunction`中,我们可以使用`OutputTag`将符合特定条件的数据发送到侧输出中,而不是从主输出中发送。 使用侧输出可以实现一些常见的场景,例如异常数据的处理、低优先级数据的分等。通过将数据发送到侧输出,我们可以在后续处理中对这些数据进行特定的操作,例如保存到外部存储、发送到消息队列等。 在Flink中使用侧输出的示例代码如下所示: ```java OutputTag<String> outputTag = new OutputTag<String>("side-output") {}; DataStream<String> mainStream = ... SingleOutputStreamOperator<String> outputStream = mainStream.process(new ProcessFunction<String, String>() { @Override public void processElement(String value, Context ctx, Collector<String> out) throws Exception { // 根据特定条件判断是否发送到侧输出 if (condition) { ctx.output(outputTag, value); } else { out.collect(value); } } }); DataStream<String> sideOutputStream = outputStream.getSideOutput(outputTag); ``` 上述代码中,我们创建了一个`OutputTag`用于标记侧输出,并在`ProcessFunction`的`processElement`方法中根据特定条件判断是否发送到侧输出。最后,我们可以通过`getSideOutput`方法获取侧输出的数据。 需要注意的是,侧输出的处理逻辑是在同一个算子中完成的,因此在使用侧输出时需要考虑算子的并行度和资源分配等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值