、時間
ストリーミングFLINKでは、それは時間の異なる概念を必要とします
イベント時間:イベント時間が作成されます。一般に、例えば、イベントのタイムスタンプにアクセスすることにより、その発生時刻、タイムスタンプディスペンサーFLINKを記録する各ログで取得したログデータを、イベントのタイムスタンプで記述されています
摂取時間:FLINKに時刻データ
処理時間は:マシンに関連付けられた動作時間のローカルシステム時刻に基づいて、各オペレータのために行われ、デフォルトの属性は時間の処理時間です。
時間2017-11-1210にログのFLINK例:00:00.123システム到着時刻ウィンドウは2017-11-1210である:00:01.234、ログは次のとおり
2017年11月2日18:37:15.624 INFOフェアオーバーRM2へ
ビジネスのために、1分にログの数をカウントする障害は、最も重要な何時ですか?-----イベント時刻、我々は時間のログに基づいて統計を生成したいので。
それが重合している場合は、データ・ストリームのための可能な解決策を重合されません。
二、ウィンドウ
図1に示すように、流量計算をストリーミングするデータ処理エンジンは、データセットが無限ますます魅力本質的に無制限のデータセットであり、無制限の処理データセットのために設計され、そして切開窓データが無制限です処理は、限定されたブロックを意味します。
無制限のデータ・ストリームが処理されるウィンドウのコアは、ウィンドウは「バケット」バケット限られたサイズの無限のストリームに分割されます、我々はこれらのバケットに計算処理を行うことができます。
2種類、時間ウィンドウの5種類があります。
図2に示すように、ウィンドウの種類(カテゴリ)
2.1、CountWindow:時間に関係なく、データの指定された数に応じてウィンドウを生成します
2.2、TimeWindow:時間のウィンドウを生成します。(に従って処理時間ウィンドウの分割)
ローリング・ウィンドウ(タンブリングウィンドウ)、スライディングウィンドウ(スライディングウィンドウ)とセッション・ウィンドウ(セッションウィンドウ):TimeWindowとCountWindowのために、窓に応じて、三の原則の実現のタイプに分けることができます。
(1)ローリング・ウィンドウ(タンブリングWindowsの場合)
固定窓の長さに応じてデータ分割データ。
機能:時間アライメントは、ウィンドウの長さが固定され、重なりません。
各ローリング・ウィンドウ分配要素がウィンドウの指定されたウィンドウサイズに割り当てられ、ウィンドウをスクロールする固定サイズを有し、重なりません。
(2)スライディングウィンドウ(Windowsのスライディング)
スライディングウィンドウは固定窓のより一般的な形、スライディングウィンドウと摺動スペーサ組成物の固定窓の長さです。
機能:時間アライメントは、ウィンドウの長さが固定され、重複があります。
スライディングウィンドウ分配要素は、固定長のウィンドウに割り当てられている、スクロール・ウィンドウと同様に、周波数の他のスライディングウィンドウ制御パラメータで構成ウィンドウサイズパラメータにウィンドウサイズは、ウィンドウをスライド開始します。
ウィンドウパラメータをスライディングスライドウィンドウサイズよりも小さい場合従って、ウィンドウ要素が複数のウィンドウに割り当てされる場合には、重複することができます。
使用シナリオ:時間の直近期間の統計(最近警報するかどうかを決定するためのインタフェースの故障率の5分を求めています。)
(3)セッション・ウィンドウ(セッションWindowsの場合)
タイムアウトイベントの直列結合は、時間の指定された長さは、組成物をスロット。同様のセッション、Webアプリケーション、時間のすなわち期間新たなデータが受信されないと、新しいウィンドウを生成します。
特長:いいえ整列。
セッション・アクティビティを介してディスペンサーのグループ要素へのセッション・ウィンドウ、セッション・ウィンドウのウィンドウをスクロールすると、それが一定であるときにスライディングウィンドウと比較し、逆に、オーバーラップおよび固定開始時刻と終了時刻の場合は存在しません
もはや非アクティブの間隔で生成された期間内の要素を受け取っていない場合、このウィンドウが閉じます。セッションは、ウィンドウ間隔セッションによって構成されている場合、非アクティブ、このセッションの間隔は、休止期間の長さを規定します
サイクルを生成し、現在のセッションがクローズされ、後続の要素が新しいセッションにウィンドウに割り当てられます。
三、ウィンドウAPI
3.1、CountWindow
CountWindowウィンドウの同じ数は、ウィンドウサイズに対応するキーが行われた結果を達成する要素の数のみをカウントし、重要な要素の実行をトリガします。
注:WINDOW_SIZEは、同一のキー要素の数を指すCountWindow、すべての要素の合計数は入力されません。
インポートorg.apache.flink.api.java.tuple.Tuple インポートorg.apache.flink.streaming.api.scala。{でDataStream、KeyedStream、StreamExecutionEnvironment} / ** * CountWindowローリング・ウィンドウ(Windowsのタンブリング) *データ固定窓の長さに応じてデータを分割します。 * / オブジェクトTimeAndWindow { DEFメイン(引数:配列[文字列]):単位 = { ヴァルENV = StreamExecutionEnvironment.getExecutionEnvironment ヴァルストリーム:でDataStream [文字列] = env.socketTextStream( "localhost"を、11111 ) ヴァルstreamKeyBy:KeyedStream [(文字列ロング)、タプル] = stream.map(項目=>(項目、1L))。keyBy(0 ) //注:WINDOW_SIZEは、同一のキー要素の数を指すCountWindow、すべての要素の合計数は入力されません。 streamWindowヴァル:(。5でDataStream [(文字列、ロング)] streamKeyBy.countWindow = ) .reduce((ITEM1、ITEM2) =>(item1._1、item1._2 + item2._2)) streamWindow.print() env.execute( "TimeAndWindow" ) } }
3.2
インポートorg.apache.flink.api.java.tuple.Tuple インポートorg.apache.flink.streaming.api.scala。{でDataStream、KeyedStream、StreamExecutionEnvironment} / ** * CountWindowスライディングウィンドウ(Windowsのスライディング) *データ固定窓の長さに応じてデータを分割します。 * / オブジェクトTimeAndWindow { DEFメイン(引数:配列[文字列]):単位 = { ヴァルENV = StreamExecutionEnvironment.getExecutionEnvironment ヴァルストリーム:でDataStream [文字列] = env.socketTextStream( "localhost"を、11111 ) ヴァルstreamKeyBy:KeyedStream [(文字列ロング)、タプル] = stream.map(項目=>(項目、1L))。keyBy(0 ) //注:WINDOW_SIZEは、同一のキー要素の数を指すCountWindow、すべての要素の合計数は入力されません。 // 最初のパラメータの長さによって、一度実行満たすステップ、 ヴァルstreamWindow:でDataStream [(文字列、ロング)] = streamKeyBy.countWindow(5,2 ) .reduce((ITEM1、ITEM2) =>(ITEM1。 _1、item1._2 + item2._2)) streamWindow.print() env.execute( "TimeAndWindow" ) } }
四、イベント時刻とウィンドウ
1、イベント時刻紹介
FLINKをストリーミングでは、企業の大半はイベント時刻が使用できない、またはProcessingTime IngestionTimeを使用するように強制されます、通常時にのみ、イベント時刻を使用します。
次のようにメソッドを追加イベント時刻、イベント時刻のタイムスタンプを導入する、その後必要性を、使用するには:
2、透かし
概念:ほとんどの場合、データ・フロー・オペレータは、イベントによって生成されるものの、我々は、そのソースを通って流れるように、イベントストリーム処理から生成される知っているが、オペレータは、中央には、プロセスと時間であります
イベントが順番スタンプが、順不同で呼ばれる配列のうち、その結果、背ネットワーク、圧力及び他の理由のために除外しない、順序がFLINKイベントが配置されたイベントのイベント時刻順序に厳密に従ってない受信指します。
透かしイベント時間は、データ自体は、対応するウォーターマークを運び、自ら隠し属性データである、進捗状況を測定するための仕組みです。
透かしは、イベントを処理するための外で、注文のうち正しい取り扱いイベントは、通常、ウォーターマークウィンドウ機構と連動して実施しました。
透かしデータストリームは、従って、ウォーターマークウィンドウがトリガされることによって行われる、イベント時刻透かしを表すために使用される数より少ない達したれます。
透かしは、トリガ遅延として理解することができます。透かし長い遅延時間tは、我々はその後、イベント時刻よりも小さい見つけ、システムが最大maxEventTimeに達したデータを検証するたびに設定することができます
MaxEventTime-tは、すべてのデータが到達しています。maxEventTime-Tを停止さに等しい時間窓がある場合、ウィンドウがトリガされます。
スクロールウィンドウ/スライドウィンドウ/ダイアログウィンドウ
輸入org.apache.flink.api.java.tuple.Tupleの
輸入org.apache.flink.streaming.api.TimeCharacteristic
輸入org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractorの
輸入org.apache.flink.streaming .api.scala._
インポートorg.apache.flink.streaming.api.windowing.assigners。{EventTimeSessionWindows、SlidingEventTimeWindows、TumblingEventTimeWindows}
インポートorg.apache.flink.streaming.api.windowing.time.Timeの
インポートorg.apache.flink .streaming.api.windowing.windows.TimeWindow
/ **
* TimeWindow
* /
オブジェクトEventTimeAndWindow {
DEFメイン(引数:配列[文字列]):単位= {
ヴァルのENV = StreamExecutionEnvironment.getExecutionEnvironment
//开启透かし
//通話開始時からの各時間の流れの追加機能を作成ENVします。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
ヴァルストリーム:KeyedStream [(文字列、ロング)、タプル] = env.socketTextStream( "192.168.218.130"、1111).assignTimestampsAndWatermarks(
新しい新しいBoundedOutOfOrdernessTimestampExtractor [文字列](Time.milliseconds(3000)) {
オーバーライドDEF extractTimestamp(エレメント:文字列):ロング= {
//イベントログ生成時刻がイベント時刻語で、我々は、ログイベント時刻から解決
ヴァルイベント時刻のelement.split =(「」)(0).toLong
のprintln(イベント時刻)
イベント時刻を
}
}
).MAP(項目=>(item.split( "")(1)、1L))。keyBy(0)
//スクロールウィンドウを追加し、ウィンドウサイズは、コールウィンドウAPI 5Sあります
//ヴァルstreamWindow:WindowedStream [(文字列、ロング)、タプル、TimeWindow] = stream.window(TumblingEventTimeWindows.of(Time.seconds(5)))
//滑动窗口
//ヴァルstreamWindow:WindowedStream [(文字列、ロング) 、タプル、TimeWindow] = stream.window(SlidingEventTimeWindows.of(Time.seconds(10)、Time.seconds(5)))
//会话窗口
ヴァルstreamWindow:WindowedStream [(文字列、ロング)、タプル、TimeWindow] =ストリーム.window(EventTimeSessionWindows.withGap(Time.seconds(5)))
ヴァルstreamReduce = streamWindow.reduce((ITEM1、ITEM2)=>(item1._1、item1._2 + item2._2))
streamReduce.print()
ENV。実行( "EventTimeAndWindow")
}
}