文章目录

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()
  }
}