一、创建kafka_producer文件,生成一个kafka的生产者,用于将读到的数据投放到生产中供flink消费。
步骤:
1、引入环境
2、读取文件
3、生成一个kafka生产者
4、把数据放进生产者
5、先运行消费者,再运行生产者
import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.api.scala._
import org.apache.flink.connector.kafka.sink.{KafkaRecordSerializationSchema, KafkaSink}
import org.apache.flink.streaming.api.scala.{DataStream, StreamExecutionEnvironment}
//【生成一个kafka的生产者,用于将读到的数据投放到生产中。】
object kafka_producer {
def main(args: Array[String]): Unit = {
//1-> 引入环境
val env = StreamExecutionEnvironment
.getExecutionEnvironment
//2-> 读取文件
//写出文件地址(相对地址)
val value: DataStream[String] = env.readTextFile("data/data.csv")
//3-> 【生成一个kafka的生产者,用于将读到的数据投放到生产中。】
// 定义了一个名为kafka_producer的"KafkaSink"对象,
// KafkaSink[String]表示这个生产者将处理String类型的数据。
val kafka_producer: KafkaSink[String] = KafkaSink.builder[String]()
//设置kafka的集群地址
//这些地址是Kafka broker的地址和端口,用于生产者建立连接并发送数据。
.setBootstrapServers("192.168.126.51:9092,192.168.126.52:9092,192.168.126.53:9092")
//设置序列化
.setRecordSerializer(
//指定要序列化的数据类型为String。
KafkaRecordSerializationSchema.builder[String]()
//对string类型的value值进行序列化
.setValueSerializationSchema(new SimpleStringSchema())
//设置主题
.setTopic("flink")
.build()
)
.build()
//4-> 把数据放进生产者
value
//设置放入数据的速度
.map(x=>{
Thread.sleep(100)
x
})
//sinkTo()方法:用于将数据流的最终结果输出到外部目标,比如文件、数据库或消息队列等。
//使用.sinkTo()将处理后的数据发送到之前定义的 kafka_producer。
//这意味着数据流中的每个元素都将被 序列化 为 Kafka 记录,并发送到之前指定的 Kafka 主题中。
.sinkTo(kafka_producer)
// value.print()
env.execute() //启动流式环境代码!别忘了写!
}
}
二、创建read_kafka文件,消费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()
}
}