第一步:创建流处理环境:
val env = StreamExecutionEnvironment.getExecutionEnvironment
第二步:读取数据
第一种.从已有集合读取数据
val stream1 = env.fromCollection(List(
SensorReading("sensor_1", 1547718159, 4),
SensorReading("sensor_2", 1547718261, 1),
SensorReading("sensor_9", 1547718272, 6.6),
SensorReading("sensor_10", 1547718285, 8.1)
))
第二种.读取任意类型的数据
env.fromElements(1, 34, "date")
第三种.从文件读取数据
val stream = env.readTextFile("D:\\test.txt")
第四种.从kafka读取数据
1)添加依赖
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka-0.11_2.11</artifactId>
<version>1.7.2</version>
</dependency>
2)代码
// 定义相关的配置
val properties = new Properties()
properties.setProperty("bootstrap.servers", "localhost:9092")
properties.setProperty("group.id", "consumer-group")
properties.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
properties.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
properties.setProperty("auto.offset.reset", "latest")
val stream = env.addSource(
new FlinkKafkaConsumer011[String]("sensor", new SimpleStringSchema(), properties)
//[String]为数据类型
//"sensor"为kafka的topic
//new SimpleStringSchema()为数据类型(此处为string)的反序列化器,
//properties为配置
)
第五种.自定义source
1)自定义数据源
//自定义类,继承SourceFunction,每条数据是一个(int,Long)类型的元组(根据业务自定义)
class MySensorSource2() extends SourceFunction[(Int, Long)] {
// 定义一个标识,表示数据源是否继续运行
var running: Boolean = true
//定义不运行的标志
override def cancel(): Unit = {
running = false
}
override def run(sourceContext: SourceFunction.SourceContext[(Int, Long)]): Unit = {
// 无限循环,产生随机的数据流
while (running) {
//为防止生成过快,线程没调用一次休眠100毫秒
Thread.sleep(100)
sourceContext.collect(
//生成随机数,第一个是三位的整数,第二位是时间戳
new Random().nextInt(999), System.currentTimeMillis().toLong
)
}
}
}
2)从数据源读取数据
val stream5 = env.addSource(new MySensorSource2())
stream5.print()
输出结果: