ApacheFlinkでのストリーム処理のウィンドウの詳細な説明。

1.ウィンドウについて

1.1ウィンドウの概要

Windowsは、無限ストリームの処理の中心です。Windowsは、ストリームを有限サイズの「バケット」に分割し、その上に計算を適用できます。

公式ウェブサイトの翻訳から、それは意味しますウィンドウは無限のストリームを扱うコアです。Windowsは、ストリームを制限されたサイズの「バケット」に分割します。これは、計算に適用できます。

1.2ウィンドウタイプ

ウィンドウについては、次の2つのカテゴリに分類でき
ます。1。CountWindow:時間に関係なく、指定されたデータ数に従ってウィンドウを生成します。
2. TimeWindow:時間に従ってウィンドウを生成します。
TimeWindowの場合、ウィンドウの実装の原則に応じて、タンブリングウィンドウ、スライディングウィンドウ、セッションウィンドウの3つのカテゴリに分類できます。

1.2.1タイムウィンドウの詳細な説明

1.ローリングウィンドウ:データは固定ウィンドウ長に従ってスライスされます(本質的に、それは特別なスライディングウィンドウです)。
特徴:タイムアラインメント、固定ウィンドウ長、オーバーラップなし

ここに画像の説明を挿入

2.スライディングウィンドウ:スライディングウィンドウは、固定ウィンドウのより一般的な形式です。スライディングウィンドウは、固定ウィンドウの長さとスライディング間隔(つまり、スライディングステップ長)で構成されます。

特徴:タイムアラインメント、固定ウィンドウ長、重なり合うことができます

ここに画像の説明を挿入

3.セッションウィンドウ:Webアプリケーションセッションと同様に、指定された時間のタイムアウトギャップと組み合わされた一連のイベントで構成されます。つまり、一定期間新しいデータが受信されない場合、新しいウィンドウが生成されます。時間の。

特徴:時間が調整されていません

ここに画像の説明を挿入

1.2.2ウィンドウフリンクプログラムについて

1.keyed-stream:

stream
       .keyBy(...)               <-  keyed versus non-keyed windows
       .window(...)              <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

2.キーストリームなし:

stream
       .windowAll(...)           <-  required: "assigner"
      [.trigger(...)]            <-  optional: "trigger" (else default trigger)
      [.evictor(...)]            <-  optional: "evictor" (else no evictor)
      [.allowedLateness(...)]    <-  optional: "lateness" (else zero)
      [.sideOutputLateData(...)] <-  optional: "output tag" (else no side output for late data)
       .reduce/aggregate/fold/apply()      <-  required: "function"
      [.getSideOutput(...)]      <-  optional: "output tag"

通常の状況では、対応する計算でDataStreamをKeyedStreamに変換し、keyed-streamが比較的まれに使用されることはないことに注意してください

1.3WindowAPIテスト

要件:60秒ごとに各温度計の最低温度を計算し、最新のタイムスタンプを出力します

package com.mo.apiTest

import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.assigners.{
    
    EventTimeSessionWindows, SlidingEventTimeWindows, TumblingEventTimeWindows}
import org.apache.flink.streaming.api.windowing.time.Time


case class thermometer(id : String ,time :String,Temp : Double)
//温度计样例类
object Time_window {
    
    
  def main(args: Array[String]): Unit = {
    
    

    val env = StreamExecutionEnvironment.getExecutionEnvironment
    env.setParallelism(1)
    //从socket文本流中读取数据
    val inputStream = env.socketTextStream("hadoop102",7777)

    // 先转换成样例类类型
    val dataStream = inputStream
      .map( data => {
    
    
        val arr = data.split(",")
        thermometer(arr(0), arr(1), arr(2).toDouble)
      } )

    val res = dataStream
      .map(data => (data.id,data.Temp,data.time))
      .keyBy(_._1)   //按照id进行分组
//      .window(TumblingEventTimeWindows.of(Time.seconds(15)))  底层滚动窗口的实现
//      .window(SlidingEventTimeWindows.of(Time.seconds(15),Time.milliseconds(3))) //底层滑动窗口的实现
//      .window(EventTimeSessionWindows.withGap(Time.seconds(15)))  会话窗口
//      .countWindow(10)  滚动计数窗口
//      .countWindow(10,2) 滑动计数窗口
      .timeWindow(Time.seconds(60))  //使用Flink为我们封装好的滑动或者滚动窗口的实现方法
      .reduce((currdata,newdata)=>(currdata._1,currdata._2.min(newdata._2),newdata._3))  //每60s求出当前时间下各个温度计的最小值,并更新当前最新的时间戳

    res.print()
    env.execute("Tumblingwindow test")

  }
}

スクリーンショットを実行します。

ここに画像の説明を挿入

ここに画像の説明を挿入
このときの出力は、60秒ごとの各温度計の最低温度値と現在の最新のタイムスタンプであることがわかります。

おすすめ

転載: blog.csdn.net/weixin_44080445/article/details/112156744