import org.apache.flink.streaming.api.scala._
case class SensorReading(id: String, timestamp: Long, temperature: Double)
//样例类对象
object Sensor {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val stream1 = env.fromCollection(List(
三个字段分别是传感器 id,时间戳,温度
SensorReading("sensor_1", 1547718199, 35.80018327300259),
SensorReading("sensor_6", 1547718201, 15.402984393403084),
SensorReading("sensor_7", 1547718202, 6.720945201171228),
SensorReading("sensor_10", 1547718205, 38.101067604893444)
))
stream1.print("stream1:")
env.execute()
}
}
import java.util.Random
import org.apache.flink.streaming.api.functions.source.SourceFunction
import org.apache.flink.streaming.api.scala._
//实现类
object demo01 {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
env.setParallelism(1)
val dataStream: DataStream[SensorReading] = env.addSource(new SensorSource())
dataStream.print()
env.execute(" job")
}
}
//自定义数据源 继承样例对象
class SensorSource() extends SourceFunction[SensorReading]{
// 定义一个flag:表示数据源是否还在正常运行
var running:Boolean = true
override def run(ctx: SourceFunction.SourceContext[SensorReading]): Unit = {
// 创建一个随机数发生器,对温度的定义
val random = new Random()
// 随机初始换生成10个传感器的温度数据,之后在它基础随机波动生成流数据
var curTemp = 1.to(10).map(
i=>("sensor_" + i, 60 + random.nextGaussian() * 20)
)
// 无限循环生成流数据,除非被cancel
while (running){
curTemp = curTemp.map(
// 更新温度值
t => (t._1, t._2 + random.nextGaussian())
)
// 获取当前的时间戳
val curTime = System.currentTimeMillis()
// 包装成SensorReading,输出
curTemp.foreach(
t => ctx.collect( SensorReading(t._1, curTime, t._2) )
)
// 间隔时间
Thread.sleep(1000)
}
}
override def cancel(): Unit = running = false
}