一、用于测试的自定义SourceFunction
package com.fouth_sink
import org.apache.flink.streaming.api.functions.source.{RichSourceFunction, SourceFunction}
import scala.util.Random
/**
* 自定义sourceFunction
*/
class CustomSourceFunction extends RichSourceFunction[(String, Long)]{
var flag = true
override def run(ctx: SourceFunction.SourceContext[(String, Long)]): Unit = {
val arr: Array[String] = Array("a", "b", "c", "d", "e", "f", "g")
val random: Random = new Random()
while (flag) {
Thread.sleep(100)
// 随机取一个数组中的值
val key: String = arr(random.nextInt(arr.length))
val rightNow: Long = System.currentTimeMillis()
ctx.collect((key, rightNow))
}
}
override def cancel(): Unit = {
flag = false
}
}
二、Sink To Kafka
package com.fouth_sink
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer011
/**
* 写入到Kafka
*/
object SinkToKafka {
def main(args: Array[String]): Unit = {
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
val ds: DataStream[(String, Long)] = env.addSource(new CustomSourceFunction)
val resultDS: DataStream[String] = ds.map(r => {
r._1 + r._2
})
val flinkKafkaProduce: FlinkKafkaProducer011[String] = getKafkaProducer()
resultDS.addSink(flinkKafkaProduce)
env.execute()
}
/**
* 获取FlinkKafkaProducer
* @return
*/
def getKafkaProducer(): FlinkKafkaProducer011[String] ={
new FlinkKafkaProducer011[String]("master:9092","produce_test",new SimpleStringSchema())
}
}