Flink 侧输出流(SideOutput)

🌸在平时大部分的 DataStream API 的算子的输出是单一输出,也就是某一种或者说某一类数据流,流向相同的地方。

🌸**在处理不同的流中,除了 split 算子,可以将一条流分成多条流,这些流的数据类型也都相同。**ProcessFunction 的 side outputs 功能可以产生多条流,并且这些流的数据类型可以不一样。一个 side output 可以定义为 OutputTag[X]对象,X 是输出流的数据类型。process function 可以通过 Context 对象发射一个事件到一个或者多个 side outputs。

当使用旁路输出时,首先需要定义一个OutputTag来标识一个旁路输出流

Scala 复制代码
val OutPut=OutputTag[String]("side-output")

注意:OutputTag是如何根据旁路输出流包含的元素类型typed的

✨可以通过以下几种函数发射数据到旁路输出

ProcessFunction

CoProcessFunction

ProcessWindowFunction

ProcessAllWindowFunction

Scala 复制代码
//将含有特殊字符串的流区分开,数据由两个定义好的工具类向Kafka灌入不同内容的数据,
//然后通过侧输出流(SideOutput)将不同的流进行分离,得到不同的输出

import com.alibaba.fastjson.JSON
import com.tech.bean.Person_t
import com.tech.util.KafkaSourceUtil
import org.apache.flink.configuration.Configuration
import org.apache.flink.streaming.api.datastream.DataStream
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment
import org.apache.flink.streaming.api.functions.ProcessFunction
import org.apache.flink.streaming.api.scala._
import org.apache.flink.util.Collector

object sideOutputPerson_t {
  def main(args: Array[String]): Unit = {
    // UI地址访问:http://localhost:8081/#/job/running
    val env = StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new Configuration())

    val ksu = new KafkaSourceUtil("person_t", "test-consumer-group")
    val dstream = env.addSource(ksu.getSouceInfo())

    // 首先需要定义一个OutputTag来标识一个旁路输出流
    val outputTag = new OutputTag[String]("person_t_side-output")

    val mainDataStream = dstream
      .map(line => {
        JSON.parseObject(line, classOf[Person_t])
      })

    val sideOutput = mainDataStream.process(new ProcessFunction[Person_t, String] {
      override def processElement(
                                   value: Person_t,
                                   ctx: ProcessFunction[Person_t, String]#Context,
                                   out: Collector[String]): Unit = {
        if (!value.getName.contains("_side")) {
          out.collect(value.toString)
        } else {
          // 测输出流输出的部分
          ctx.output(outputTag, "sideOutput-> 带有_side标识的数据名称" + value.getName)
        }
      }
    })

    val sideOutputStream: DataStream[String] = sideOutput.getSideOutput(outputTag)

    // 测输出流处理
    sideOutputStream.print("测输出流")

    // 常规数据处理
    sideOutput.print("常规数据")

    env.execute("outSideput")
  }
}
相关推荐
Edingbrugh.南空11 分钟前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink
小新学习屋2 小时前
Spark从入门到熟悉(篇三)
大数据·分布式·spark
rui锐rui2 小时前
大数据学习2:HIve
大数据·hive·学习
G皮T3 小时前
【Elasticsearch】检索高亮
大数据·elasticsearch·搜索引擎·全文检索·kibana·检索·高亮
zskj_zhyl7 小时前
智慧养老丨从依赖式养老到自主式养老:如何重构晚年生活新范式
大数据·人工智能·物联网
哲科软件8 小时前
从“电话催维修“到“手机看进度“——售后服务系统开发如何重构客户体验
大数据·智能手机·重构
zzywxc7878 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring
专注API从业者8 小时前
构建淘宝评论监控系统:API 接口开发与实时数据采集教程
大数据·前端·数据库·oracle
一瓣橙子9 小时前
缺少关键的 MapReduce 框架文件
大数据·mapreduce
永洪科技16 小时前
永洪科技荣获商业智能品牌影响力奖,全力打造”AI+决策”引擎
大数据·人工智能·科技·数据分析·数据可视化·bi