创建Kafka生产者实例:您需要使用org.apache.kafka.clients.producer.KafkaProducer类创建一个Kafka生产者实例。在创建生产者时需要指定使用Kafka Avro序列化器。
import org.apache.kafka.clients.producer.ProducerRecord
import org.apache.kafka.clients.producer.KafkaProducer
import io.confluent.kafka.serializers.KafkaAvroSerializer
import java.util.Properties
val props = new Properties()
props.put("bootstrap.servers", "localhost:9092")
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer")
props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer")
props.put("schema.registry.url", "http://localhost:8081")
val producer = new KafkaProducer[String, GenericRecord](props)
准备要序列化的数据:您需要将要序列化的数据准备好。例如,您可以使用Spark SQL创建DataFrame:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions._
val spark = SparkSession.builder().appName("KafkaAvroSerializer").master("local[*]").getOrCreate()
val schema = StructType(Seq(
StructField("name", StringType, true),
StructField("age", IntegerType, true)
))
val data = Seq(
("Alice", 30),
("Bob", 40),
("Charlie", 50)
)
val df = spark.createDataFrame(data).toDF(schema)
序列化数据并将其发送到Kafka:您可以使用KafkaAvroSerializer序列化数据并将其发送到Kafka主题中。在下面的代码中,我们使用foreach函数遍历DataFrame中的每一行,并将其序列化为Avro格式后发送到Kafka主题中。
val topic = "my_topic"
df.foreach(row => {
val key = row.getAs[String]("name")
val value = new GenericData.Record(valueSchema)
value.put("name", row.getAs[String]("name"))
value.put("age", row.getAs[Int]("age"))
val record = new ProducerRecord[String, GenericRecord](topic, key, value)
producer.send(record)
})