Flink代码之水位线,事件时间,定时器,侧输出流、标签(四)

本文详细介绍了Flink中的水位线概念,包括水位线的简单测试、如何在两条流连接中传播以及其底层实现。同时,讨论了事件时间和处理时间定时器的使用,并探讨了侧输出流的应用。
摘要由CSDN通过智能技术生成

一、水位线Watermark

1.水位线简单测试

import java.lang
import java.sql.Timestamp

import org.apache.flink.streaming.api.TimeCharacteristic
import org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.scala.function.ProcessWindowFunction
import org.apache.flink.streaming.api.windowing.time.Time
import org.apache.flink.streaming.api.windowing.windows.TimeWindow
import org.apache.flink.util.Collector

// nc -lk 9999
// 先使用默认的插入频率,200ms插入一次
// 将`env.getConfig.setAutoWatermarkInterval(60000)`注释掉
//a 1
//a 2
//a 15
//a 1
//a 2
//a 17
//a 12
//a 11
//a 12
//a 13
//a 25
// 添加`env.getConfig.setAutoWatermarkInterval(60000)`
//a 1
//a 2
//a 100
//a 5
//a 8
//a 3
//a 50
//a 51
//a 52
object WatermarkTest {
   
  def main(args: Array[String]): Unit = {
   
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    // 应用程序使用事件时间
    env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
    env.setParallelism(1)
    // 系统每隔一分钟的机器时间插入一次水位线
    env.getConfig.setAutoWatermarkInterval(60000)

    val stream = env
      .socketTextStream("hadoop103", 9999, '\n')
      .map(line => {
   
        val arr = line.split(" ")
        // 第二个元素是时间戳,必须转换成毫秒单位
        (arr(0), arr(1).toLong * 1000)
      })
      // 抽取时间戳和插入水位线
      // 插入水位线的操作一定要紧跟source算子
      .assignTimestampsAndWatermarks(
        // 最大延迟时间设置为5s
        new BoundedOutOfOrdernessTimestampExtractor[(String, Long)](Time.seconds(5)) {
   
          override def extractTimestamp(element: (String, Long)): Long = element._2
        }
      )
      .keyBy(_._1)
      // 10s的滚动窗口
      .timeWindow(Time.seconds(10))
      .process(new MyProcess)

    stream.print()

    env.execute()
  }

  class MyProcess extends ProcessWindowFunction[(String, Long), String, String, TimeWindow] {
   
    override def process(key: String, context: Context, elements: Iterable[(String, Long)], out: Collector[String]): Unit =
      out.collect("窗口结束时间为:" + new Timestamp(context.window.getEnd) + " 的窗口中共有 " + elements.size + " 条数据")
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值