|
@@ -1,11 +1,10 @@
|
|
|
package com.persagy.iot.app
|
|
|
|
|
|
import com.persagy.iot.bean.IOTData
|
|
|
-import com.persagy.iot.func.{IOTOriginalSinkFunction, OriginalDataAlarm, SplitData}
|
|
|
-import com.persagy.iot.utils.KafkaUtil
|
|
|
+import com.persagy.iot.func.{IOTAccuracySinkFunction, IOTOriginalSinkFunction, OriginalDataAlarm, SplitData}
|
|
|
+import com.persagy.iot.utils._
|
|
|
import org.apache.flink.api.common.serialization.SimpleStringSchema
|
|
|
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.windowing.time.Time
|
|
|
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer
|
|
@@ -19,13 +18,20 @@ object IOTApp {
|
|
|
val no_value: String = "ff ff ff ff"
|
|
|
|
|
|
def main(args: Array[String]): Unit = {
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
|
|
|
|
|
|
|
|
|
env.setParallelism(1)
|
|
|
|
|
|
|
|
|
- env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime)
|
|
|
+ env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
|
|
|
|
|
|
val inputStream: DataStream[String] =
|
|
|
env.addSource( new FlinkKafkaConsumer[String](KafkaUtil.topic, new SimpleStringSchema(), KafkaUtil.kafkaConsumerProperties()) )
|
|
@@ -42,44 +48,47 @@ object IOTApp {
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-
|
|
|
- val iotFilterDataStream: DataStream[IOTData] = filterStream.flatMap(new SplitData)
|
|
|
-
|
|
|
- val waterStream: DataStream[IOTData] = iotFilterDataStream
|
|
|
-
|
|
|
- .assignAscendingTimestamps(_.eventTime - 1)
|
|
|
+
|
|
|
+ val iotFilterDataStream: DataStream[IOTData] = filterStream.flatMap(new SplitData(1800L, 3600L, 1000L,0))
|
|
|
+
|
|
|
|
|
|
|
|
|
-
|
|
|
- val keyedStream: DataStream[IOTData] = waterStream.keyBy(_.rowKey)
|
|
|
+ val keyedStream: DataStream[IOTData] = iotFilterDataStream.keyBy(_.rowKey)
|
|
|
.process(new OriginalDataAlarm)
|
|
|
+
|
|
|
keyedStream.getSideOutput(new OutputTag[IOTData]("late-data")).print("outputTag:")
|
|
|
-
|
|
|
+ keyedStream.addSink(new IOTOriginalSinkFunction)
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
|
|
|
+
|
|
|
+ val waterStream: DataStream[IOTData] = iotFilterDataStream
|
|
|
+ .map(iotData => {
|
|
|
+
|
|
|
+ val key: String = iotData.rowKey
|
|
|
+ val time: Time = Time.minutes(15)
|
|
|
+ val l: Long = IOTUtils.accuracyTime(iotData.eventTime, time)
|
|
|
+ iotData.copy(rowKey = key + ":" + l)
|
|
|
+ iotData
|
|
|
+ })
|
|
|
+ .assignAscendingTimestamps(_.eventTime - 1)
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ val sideOutputTag = new OutputTag[IOTData]("late-data")
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ val windowsStream: DataStream[IOTData] = waterStream.keyBy(_.rowKey)
|
|
|
+ .timeWindow(Time.minutes(15))
|
|
|
+ .sideOutputLateData(sideOutputTag)
|
|
|
+ .aggregate(new IOTAgg(), new IOTWindowResult())
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+ windowsStream.addSink(new IOTAccuracySinkFunction)
|
|
|
+ windowsStream.getSideOutput(sideOutputTag).addSink(new IOTAccuracySinkFunction)
|
|
|
+
|
|
|
|
|
|
+ windowsStream.print("result: ")
|
|
|
+ windowsStream.getSideOutput(sideOutputTag).print("sideOutputTag:")
|
|
|
env.execute("iot data collect")
|
|
|
}
|
|
|
|