【案例一:实时计算传感器的最高温度,一旦温度超过阈值,就发出报警】
*要求:在cmd中逐条输入数据,idea端接收数据并输出温度最高的数据字段,将时间戳转换为日期,格式为: (sensor_1,1970-01-19 05:55:18.199,35.8)
1、数据源字段格式是 (sensor_id,timestamp,temperature)
2、sensor_flink.scala
import org.apache.flink.api.scala._
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import java.text.SimpleDateFormat
import java.util.Date
object sensor_flink {
def main(args: Array[String]): Unit = {
// 【实时计算传感器的最高温度,一旦温度超过阈值,就发出报警】
//1-> 引入环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
//设置并行度为1
// env.setParallelism(1)
//2-> 读数据
val value = env.socketTextStream("localhost", 1234)
value
//提取数据
.map(x=>{
//切数据
val strings: Array[String] = x.split(",")
//按照一定格式创建时间处理类SimpleDateFormat
val format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
//对时间戳进行格式化,format无法格式化字符串类型,需要转换为long类型
val time: String = format.format(strings(1).toLong)
(strings(0),time,strings(2))
})
//分组
.keyBy(_._1)
//求最大值
//.max() //只会更新最新的温度数据
.maxBy(2) //可以更新最新的所有数据
//求最小值
// .minBy(2)
.print()
env.execute()
}
}
【案例2:生成一个kafka消费者,flink读 kafka 数据】
手动输入生产者数据,flink消费数据。
1、在pom中添加依赖
<!-- Flink连接Kafka的依赖-->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka_2.12</artifactId>
<version>1.14.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.21</version>
</dependency>
2、创建read_kafka.scala 文件,生成一个消费者,接收kafka数据
import org.apache.flink.api.common.eventtime.WatermarkStrategy
import org.apache.flink.api.scala._
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.connector.kafka.source.KafkaSource
import org.apache.flink.connector.kafka.source.enumerator.initializer.OffsetsInitializer
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
object read_kafka {
def main(args: Array[String]): Unit = {
//【读 kafka 数据】
// 1-> 引入流式环境
val env = StreamExecutionEnvironment.getExecutionEnvironment
// 2-> 读kafka数据
//生成一个kafka的消费者
val kafkaConsumer = KafkaSource.builder[String]()
//设置kafka的地址
.setBootstrapServers("192.168.126.51:9092,192.168.126.52:9092,192.168.126.53:9092")
//设置组别,用来区分不同的人消费同一个主题的数据
.setGroupId("paipai")
//设置消费的主题
.setTopics("flink")
//设置是从头消费还是从最新位置开始消费
.setStartingOffsets(OffsetsInitializer.earliest())
//对value进行反序列化
.setValueOnlyDeserializer(new SimpleStringSchema())
//这个不能丢
.build()
//3-> 开始读数据
val value = env
.fromSource(kafkaConsumer, WatermarkStrategy.noWatermarks(), "kafka")
value.print()
//1-> 启动流式环境代码
env.execute()
}
}
3、在虚拟机中启动Kafka(先启动zookeeper)
1)创建flink主题:kafka-topics.sh --create --zookeeper hadoop1:2181,hadoop2:2181,hadoop3:2181 --topic flink --partitions 2 --replication-factor 2
2)在虚拟机中创建主题为flink的生产者
3)在kafka生产者中输入数据