FLINK | ProcessFunctionのAPI(基礎となるAPI)

 

買収の透かし時間

変換演算子の前にイベントのタイムスタンプ情報と水位情報にアクセスすることができません。そして、いくつかのシナリオでは、非常に重要なこと。例えばMapFunctionこのマップ変換演算子は、現在のイベントまたはイベント時刻のタイムスタンプにアクセスすることはできません。これに基づき、データストリームAPIは、低レベルの変換演算子の範囲を提供します。タイムスタンプ、透かしおよび登録の時限イベントをアクセスすることができます。また、このようなタイムアウトイベントなど、いくつかの特別なイベントを、エクスポートすることができます。処理機能は、イベント駆動型アプリケーションを構築し、窓関数を使用する前に、カスタムビジネスロジックを実装するために使用し、変換演算子を達成することができません。例えば、FLINK SQLが実行されるプロセスの機能を使用することです。

FLINKは8つの処理機能を提供しています

  •  ProcessFunction
  •  KeyedProcessFunction
  •  CoProcessFunction
  •  ProcessJoinFunction
  •  BroadcastProcessFunction
  •  KeyedBroadcastProcessFunction
  •  ProcessWindowFunction
  • ProcessAllWindowFunction
KeyedProcessFunction 
KeyedStreamを動作させるため。KeyedProcessFunction各ストリーム要素出力が処理するゼロ、1つまたは複数の要素。すべての処理機能RichFunctionは、インターフェイスから継承される
すべてのオープン()、クローズ()とgetRuntimeContext()メソッドなります。そしてKeyedProcessFunction [KEY、IN、OUT]はさらに二つの方法を提供する:    processElement(V:IN、CTX:コンテキスト、OUT:コレクタ[OUT])は、各要素ストリームは、このメソッドをコールし、結果を呼び出します出力データ型のコレクター。
    コンテキストは、タイムスタンプ要素、キー要素、並びにのTimerService時間サービスにアクセスすることができます。コンテキストは、また、別のストリーム(サイド)に出力することができる    のOnTimer(:ロング、CTX:OnTimerContext、OUT:タイムスタンプコレクタ[OUT])コールバック関数です。タイマーが登録する前に発射したときに呼び出されます。
    パラメータのタイムスタンプは、タイムスタンプタイマ設定トリガーです。出力セットのためのコレクター。OnTimerContextとprocessElementは、いくつかのコンテキスト情報を提供するコンテキストパラメータ、のような
    そのようなタイマートリガイベント時間や処理時間の時刻情報として。

 

TimerServiceとタイマーのタイマー
:コンテキストとOnTimerContextはのTimerServiceオブジェクトは以下のメソッドを持って開催された
   currentProcessingTime()戻り値:現在の長い処理時間
   currentWatermark():ロングは現在のタイムスタンプ透かし返し
   registerProcessingTimeTimerを(タイムスタンプ:ロング):単位は現在のキーを登録します
     プロセスへは、時間タイマーを歌います。タイマー時間は、処理時間、トリガタイマーに達したとき。
   registerEventTimeTimer(タイムスタンプ:ロング):単位は現在のキーイベント時間のタイマーを登録します。場合よりも水位以上タイマー登録時刻、タイマーコールバック関数をトリガします。
   deleteProcessingTimeTimer(タイムスタンプ:ロング):登録処理時間タイマユニット削除する前に。このタイムスタンプタイマーなしで実行されていません。

 

どのようにKeyedProcessFunction操作KeyedStream。
需要:温度が第2の(処理時間)連続して上昇する場合、アラームを温度値を監視するための温度センサ。

パッケージcom.xxx.fink.api.windowapi 

インポートcom.xxx.fink.api.sourceapi.SensorReading
 インポートorg.apache.flink.api.common.stateを{ValueState、ValueStateDescriptor}
 インポートorg.apache.flink.streaming.api .functions.KeyedProcessFunction
 インポートorg.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
 インポートorg.apache.flink.streaming.api.scala。{でDataStream、StreamExecutionEnvironment}
 インポートorg.apache.flink.streaming.api.windowing .time.Time
 輸入org.apache.flink.util.Collector
 輸入org.apache.flink.api.scala._
 輸入org.apache.flink.streaming.api.TimeCharacteristic


/ ** 
  * 1S之内温度连续上升就报警
  * / 
オブジェクトProcessFunctionTest { 
  DEFメイン(引数:配列[文字列]):単位 = { 
    ヴァルENV:StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment 
    env.setParallelism( 1 
    env.setStreamTimeCharacteristic(TimeCharacteristic .EventTime)
    ヴァルストリーム:でDataStream [文字列] = env.socketTextStream( "hadoop101"、7777 

    ヴァルデータストリーム:でDataStream [SensorReading] = stream.map(データ=> { 
      ヴァルdataArray:配列[文字列] = data.split(」 、」
      SensorReading(dataArray(0).trim、dataArray(1).trim.toLong、dataArray(2 ).trim.toDouble)
    })
      .assignTimestampsAndWatermarks(新しい BoundedOutOfOrdernessTimestampExtractor [SensorReading(Time.seconds(1 )){ 
        オーバーライドデフextractTimestamp(エレメント:SensorReading) :長い = element.timestamp * 1000 
      })


    ヴァルprocessedStream:でDataStream [文字列] = dataStream.keyBy(。_ ID)
      .process(新しいTempIncreAlert())

    dataStream.print( "入力データ:" 
    processedStream.print(「プロセスデータ:」

    env.execute( "ウィンドウ試験" 

  }


} 

クラス TempIncreAlert()延びKeyedProcessFunction [文字列、SensorReading、文字列] { 


  // 温度が比較を行うデータを維持するために、連続的に上昇し、現在の状態を保存する
   // 定義されたデータの状態に格納された値温度を 
  遅延ヴァルlastTemp:ValueStateを[ダブル] = getRuntimeContext.getState(新新 ValueStateDescriptor [ダブル]( "lastTemp" 、classOf [ダブル]))
   // 状態を定義するには、タイマは、タイムスタンプ保存するために使用され 
  ValueState [ロング]:怠惰ヴァルcurrentTimer (= getRuntimeContext.getStateを新しい新しい ValueStateDescriptor [ロング]( "currentTimer" 、classOf [ロング]))

  オーバーライドDEF processElement(値:SensorReading、CTX:KeyedProcessFunction [文字列、SensorReading、文字列] #Context、OUT:コレクター[文字列]):単位 ={
     // 最初の削除つの温度値 
    ヴァルpreTemp = lastTemp.value()
     // 更新された温度値
    lastTemp.update(value.temperature)

    ヴァルcurTimerTs = currentTimer.value()

    // 温度が上昇し、タイマーを設定していませんでした登録タイマ
    IF(value.temperature> preTemp && curTimerTs == 0 ){
       // 温度が低下した場合、または最初のデータ、及びタイマーの空の状態を削除 
      ヴァルtimerTs = ctx.timerService()。currentProcessingTime ()+ 10000L 
      ctx.timerService()。registerProcessingTimeTimer(timerTs)
      currentTimer.update(timerTs)
    }  IF(preTemp> value.temperature || preTemp == 0.0 ){
       //温度が設定されていないすぎるタイマー上昇、タイマ登録
      ctx.timerService()deleteProcessingTimeTimer(curTimerTs)。
      CurrentTimer.clear()

    } 
  } 

  オーバーライドのOnTimer DEF(タイムスタンプ:ロング、CTX:KeyedProcessFunction [文字列、SensorReading、文字列] #OnTimerContext 、OUT:コレクタ[文字列]):単位は = {
     // 警報情報が出力され 
    out.collect(ctx.getCurrentKey + "は、連続温度上昇" 
    currentTimer.clear()
  } 


}

 

データ入力:> SensorReading(sensor_1,1547718199,35.0 
INPUTデータ: > SensorReading(sensor_1,1547718199,36.0 
プロセスデータ: >連続温度上昇sensor_1

 

サイド出力ストリーム(SideOutput)

オペレータ最もデータストリームAPIの出力は、データ型のストリームである単一の出力、です。
スプリット演算子に加えて、フローストリームの複数に分割されてもよく、これらのタイプのデータストリームも同じです。
側出力機能処理機能は、複数のストリームを生成してもよいし、データ型のこれらのストリームは、同じでなくてもよいです。
[X]の物体側の出力OUT putTagとして定義することができ、Xは、出力ストリームのデータ・タイプです。イベント処理機能は、一つ以上のコンテキストオブジェクト側出力によって送信されてもよいです

 

 

 

 

輸入com.xxx.fink.api.sourceapi.SensorReading
 輸入org.apache.flink.streaming.api.functions.ProcessFunctionの
 輸入org.apache.flink.streaming.api.functions.timestamps.BoundedOutOfOrdernessTimestampExtractor
 輸入org.apache.flink.streaming .api.scala。{でDataStream、OutputTag、StreamExecutionEnvironment}
 インポートorg.apache.flink.streaming.api.windowing.time.Timeの
 インポートorg.apache.flink.util.Collector
 インポートorg.apache.flink.api.scala._ 

/ ** 
  *侧输出流代替スプリット
  * / 
オブジェクトSideOutputTest { 
  DEFメイン(引数:配列[文字列]):単位 = { 
    ヴァルENV =StreamExecutionEnvironment.getExecutionEnvironment 
    env.setParallelism( 1 
    バルストリーム = env.socketTextStream( "hadoop101"、7777 
    ヴァルデータストリーム = stream.map(データ=> { 
      ヴァルdataArray = data.split( "" 
      SensorReading(dataArray( 0) .trim、dataArray(1).trim.toLong、dataArray(2 ).trim.toDouble)
    。})assignTimestampsAndWatermarks(新しい BoundedOutOfOrdernessTimestampExtractor [SensorReading(Time.seconds(1 )){ 
      extractTimestamp(要素DEFオーバーライド:SensorReading):ロング = element.timestamp×1000 
    })
    processedStreamヴァル:でDataStream [SensorReading] = dataStream.process(新新FreezingAlert())
    processedStream.print( "処理されたデータ:" 
    processedStream.getSideOutput(新しい新しい。OutputTag [文字列]( "凍結と警告"))印刷( "データ警告" 

    env.execute(「テストウインドウ」
  } 
} 

// 凍結警報、32F、アラーム情報は、ストリームの出力側に出力未満である場合
クラス FreezingAlert()延びProcessFunction [SensorReading、SensorReading] { 

  怠惰ヴァルalertOutPut:OutputTag [文字列] = 新しい新( "アラートを凍結すると" OutputTag [文字列] 

  (:SensorReading、CTX:ProcessFunction [SensorReading、SensorReading] #Context、アウト:コレクタ[SensorReading]値):単位processElement DEFオーバーライド = {
     場合(value.temperature <32.0 ){ 
      ctx.output(alertOutPut、 "アラートを凍結" + value.id)
    } { 
      out.collect(値)
    } 

  } 
}

テスト:

> SensorReading(sensor_1,1547718199,35.8:処理されたデータ
のアラートデータ > 警告forsensor_6の凍結
警報データ > 警告forsensor_7凍結
処理されたデータ: > SensorReading(sensor_10,1547718205,38.1)

 

おすすめ

転載: www.cnblogs.com/shengyang17/p/12543524.html