2.4 ApacheのFLINK時間与ウィンドウ

1.タイム

以下に示すようにFLINKをストリーミングで、コンセプトは、異なる時間を必要とします:

時間の図FLINKコンセプト

  • イベント時間:イベント時間が作成されます。これは、一般に、例えば、イベントのタイムスタンプで記述され、その生成時間を記録する各ログで取得したログデータを、タイムスタンプディスペンサーFLINKアクセスイベントによってタイムスタンプ。

  • 摂取時間:データがFLINK時間を入力します。

  • 処理時間は:マシンに関連付けられた動作時間のローカルシステム時刻に基づいて、各オペレータのために行われ、デフォルトの属性は時間の処理時間です。

00:00.123、到着ウィンドウ2018-11-1210のシステム時間:00:たとえば、ログ時間はFLINK 2018-11-1210入力され01.234、ログは、以下:
2018年11月2日18時37分:RM2にオーバー15.624 INFO失敗

ビジネスのために、1分にログの数をカウントする障害は、最も重要な何時ですか? - イベント時刻、我々は時間のログに基づいて統計を生成したいので。

2.ウィンドウ

2.1ウィンドウの概要

ストリーミングフローを計算すると、データ処理エンジン無制限のデータセットを処理するように設計され、データセットは無限にますます魅力本質的に無制限のデータセットであり、切除窓は、有限無限のデータブロックであります治療を意味します。

無制限のデータ・ストリームが処理されるウィンドウのコアは、ウィンドウは「バケット」バケット限られたサイズの無限のストリームに分割されます、我々はこれらのバケットに計算処理を行うことができます。

2.2ウィンドウタイプ

ウィンドウは2つのカテゴリに分けることができます。

  • CountWindow:時間の独立したデータ片の数に応じて指定されたウィンドウを生成します。
  • TimeWindow:時間ウィンドウで生成します。

会話ウィンドウ(セッションウィンドウ)に加えてローリングウィンドウ(タンブリングウィンドウ)、スライディングウィンドウ(スライディングウィンドウ):TimeWindowとCountWindowため、ウィンドウはに異なる原理に従って実現することができます。

(1)ローリング・ウィンドウ(タンブリングWindowsの場合)

固定されたウィンドウのデータ長に基づいて、データスライス。

機能:時間アライメントは、ウィンドウの長さが固定され、重なりません。

各ローリング・ウィンドウ分配要素がウィンドウの指定されたウィンドウサイズに割り当てられ、ウィンドウをスクロールする固定サイズを有し、重なりません。たとえば:あなたは、ウィンドウを作成するために、5分のスクロールウィンドウのサイズを指定した場合、以下のように:

図スクロールウィンドウ

アプリケーションシナリオ:BIの適切な統計(各期間について計算重合)。

(2)スライディングウィンドウ(Windowsのスライディング)

スライディングウィンドウは固定窓のより一般的な形、スライディングウィンドウと摺動スペーサ組成物の固定窓の長さです。

機能:時間アライメントは、ウィンドウの長さが固定され、重複があります。

スライディングウィンドウ分配要素は、固定長のウィンドウに割り当てられている、スクロール・ウィンドウと同様に、周波数の他のスライディングウィンドウ制御パラメータで構成ウィンドウサイズパラメータにウィンドウサイズは、ウィンドウをスライド開始します。ウィンドウパラメータをスライディングスライドウィンドウサイズよりも小さい場合従って、ウィンドウ要素が複数のウィンドウに割り当てされる場合には、重複することができます。

たとえば、ウィンドウをスライド5分、10分、以下に示すように、生成されたデータの最後の10分間で5分間ウィンドウを含む各ウィンドウを有します。

図スライディングウィンドウ

該当するシーン:時間の最も最近の期間(最近警報するかどうかを決定するためのインタフェースの5分を求めて故障率)の統計情報。

(3)セッション・ウィンドウ(セッションWindowsの場合)

新しいデータが受信されないセッションのWebアプリケーションと同様タイムアウトイベントの直列結合時間ギャップ組成物の特定の長さは、時間の、すなわち周期で新しいウィンドウを生成します。

特長:いいえ整列。

session窗口分配器通过session活动来对元素进行分组,session窗口跟滚动窗口和滑动窗口相比,不会有重叠和固定的开始时间和结束时间的情况,相反,当它在一个固定的时间周期内不再收到元素,即非活动间隔产生,那个这个窗口就会关闭。一个session窗口通过一个session间隔来配置,这个session间隔定义了非活跃周期的长度,当这个非活跃周期产生,那么当前的session将关闭并且后续的元素将被分配到新的session窗口中去。

図セッションウィンドウ

3. Window API

3.1 CountWindow

CountWindow根据窗口中相同key元素的数量来触发执行,执行时只计算元素数量达到窗口大小的key对应的结果。

注意:CountWindow的window_size指的是相同Key的元素的个数,不是输入的所有元素的总数。

(1)滚动窗口(Tumbling Windows)

默认的CountWindow是一个滚动窗口,只需要指定窗口大小即可,当元素数量达到窗口大小时,就会触发窗口的执行。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment

// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)

// 对Stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item.split(" ")(0), item.split(" ")(1).toLong)).keyBy(0)

// 引入滚动窗口
// 这里的5指的是5个相同key的元素计算一次
val streamWindow = streamKeyBy.countWindow(5)

// 执行聚合操作
val streamReduce = streamWindow.reduce(
  (item1, item2) => (item1._1, item1._2 + item2._2)
)

// 将聚合操作写入文件
streamReduce.print()

// 执行程序
env.execute("TumbingWindow")

(2)滑动窗口(Sliding Windows)

滑动窗口和滚动窗口的函数名是完全一致的,只是在传参数时需要传入两个参数,一个是window_size,一个是sliding_size。

下面代码中的sliding_size设置为了2,也就是说,每收到两个相同key的数据就计算一次,每一次计算的window范围是5个元素。

 // 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
 
// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)
 
// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item.split(" ")(0), item.split(" ")(1).toLong)).keyBy(0)
 
// 引入滚动窗口
// 当相同key的元素个数达到2个时,触发窗口计算,计算的窗口范围为5
val streamWindow = streamKeyBy.countWindow(5,2)
 
// 执行聚合操作
val streamReduce = streamWindow.reduce(
  (item1, item2) => (item1._1, item1._2 + item2._2)
)
 
// 将聚合数据写入文件
streamReduce.print()
 
// 执行程序
env.execute("TumblingWindow")

3.2 TimeWindow

TimeWindow是将指定时间范围内的所有数据组成一个window,一次对一个window里面的所有数据进行计算。

(1)滚动窗口(Tumbling Windows)

Flink默认的时间窗口根据Processing Time 进行窗口的划分,将Flink获取到的数据根据进入Flink的时间划分到不同的窗口中。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment

// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)

// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item, 1)).keyBy(0)

// 引入时间窗口
val streamWindow = streamKeyBy.timeWindow(Time.seconds(5))

// 执行聚合操作
val streamReduce = streamWindow.reduce(
  (item1, item2) => (item1._1, item1._2 + item2._2)
)

// 将聚合数据写入文件
streamReduce.print()

// 执行程序
env.execute("TimeWindow")

时间间隔可以通过Time.milliseconds(x),Time.seconds(x),Time.minutes(x)等其中的一个来指定。

(2)スライディングウィンドウ(SlidingEventTimeWindows)

関数名ウィンドウをスライディングし、ウィンドウをスクロールすると、まったく同じで、時間だけでパスパラメータは2つのパラメータを渡す必要があり、一つはWINDOW_SIZEあり、1はsliding_sizeです。

2Sのために、次のコードで提供さsliding_sizeは、それが各ウィンドウの範囲は、5秒以内にすべての要素について計算され、毎2S時間窓を算出する、と言うことです。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
 
// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)
 
// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item, 1)).keyBy(0)
 
// 引入滚动窗口
val streamWindow = streamKeyBy.timeWindow(Time.seconds(5), Time.seconds(2))
 
// 执行聚合操作
val streamReduce = streamWindow.reduce(
  (item1, item2) => (item1._1, item1._2 + item2._2)
)
 
// 将聚合数据写入文件
streamReduce.print()
 
// 执行程序
env.execute("TumblingWindow")

時間間隔は、一つのTime.milliseconds(X)、Time.seconds(X)Time.minutes(X)などで指定することができます。

3.3ウィンドウの削減

WindowedStream→データストリームが:ウィンドウ関数を減らすために機能を割り当て、重合の結果を返します。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
 
// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)
 
// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item, 1)).keyBy(0)
 
// 引入时间窗口
val streamWindow = streamKeyBy.timeWindow(Time.seconds(5))
 
// 执行聚合操作
val streamReduce = streamWindow.reduce(
  (item1, item2) => (item1._1, item1._2 + item2._2)
)
 
// 将聚合数据写入文件
streamReduce.print()
 
// 执行程序
env.execute("TumblingWindow")

3.4ウィンドウの折りたたみ

WindowedStream→データストリームが:窓関数を折るために機能を割り当てると、倍の結果を返します。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
 
// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111,'\n',3)
 
// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item, 1)).keyBy(0)
 
// 引入滚动窗口
val streamWindow = streamKeyBy.timeWindow(Time.seconds(5))
 
// 执行fold操作
val streamFold = streamWindow.fold(100){
  (begin, item) =>
     begin + item._2
}
 
// 将聚合数据写入文件
streamFold.print()
 
// 执行程序
env.execute("TumblingWindow")

ウィンドウ上の3.5集約

WindowedStream→データストリームが:ウィンドウ内のすべての要素に対する操作を集約します。これは、分の間の差であるとminBy minは最小値を返し、要素を(同じ原理が最大とmaxByに適用される)を含むminBy最小フィールドを返します。

// 获取执行环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
 
// 创建SocketSource
val stream = env.socketTextStream("localhost", 11111)
 
// 对stream进行处理并按key聚合
val streamKeyBy = stream.map(item => (item.split(" ")(0), item.split(" ")(1))).keyBy(0)
 
// 引入滚动窗口
val streamWindow = streamKeyBy.timeWindow(Time.seconds(5))
 
// 执行聚合操作
val streamMax = streamWindow.max(1)
 
// 将聚合数据写入文件
streamMax.print()
 
// 执行程序
env.execute("TumblingWindow")

おすすめ

転載: blog.csdn.net/org_hjh/article/details/90383804