(15) flink自定义source
原创
©著作权归作者所有:来自51CTO博客作者wx5ba7ab4695f27的原创作品,请联系作者获取转载授权,否则将追究法律责任
source
package com.htsec.test
import org.apache.flink.streaming.api.functions.source.SourceFunction
import scala.util.Random
class MySource() extends SourceFunction[SersorReading] {
//flag 表示数据源是否正常运行
var running: Boolean = true
override def run(ctx: SourceFunction.SourceContext[SersorReading]): Unit = {
//初始化一个随机数生成器
val random = new Random()
//随机生成10个传感器初始温度值,与传感器id构成二元组
var curTemp = 1.to(10).map(
i => ("sensor_" + i, random.nextGaussian() * 20 + 60)
)
while (running) {
//基于上次温度值做更新
curTemp.map(
data => (data._1, data._2 + random.nextGaussian())
)
//获取当前时间戳
val curTime = System.currentTimeMillis()
curTemp.foreach(
data => ctx.collect(SersorReading(data._1,curTime,data._2))
)
}
}
override def cancel(): Unit = {
running = false
}
}
主类
package com.htsec.test
import org.apache.flink.streaming.api.scala._
case class SersorReading(id: String,timeStamp:Long,temperature : Double)
object SourceTest {
def main(args: Array[String]): Unit = {
val env = StreamExecutionEnvironment.getExecutionEnvironment
val lines = env.addSource(new MySource)
lines.print()
env.execute()
}
}