本篇文章分两个部分:
一个是给出写好的生产者和消费者
一个是介绍代码的实现过程
1. 首先完善好的代码
生产者代码
import java.io.{File, RandomAccessFile}
import java.nio.charset.StandardCharsets
import scala.io.Source
object KafkaWordProducer2 {
def main(args: Array[String]) {
if (args.length < 3) {
System.err.println("用法: KafkaWordProducer <metadataBrokerList> <topic> <linesPerSec>")
System.exit(1)
}
val Array(brokers, topic, linesPerSec) = args
// Kafka生产者属性
val props = new java.util.HashMap[String, Object]()
props.put(org.apache.kafka.clients.producer.ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers)
props.put(org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer")
props.put(org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer")
val producer = new org.apache.kafka.clients.producer.KafkaProducer[String, String](props)
// 文件路径
val filePath = "/home/hadoop/bilibili/streaming/data/part2.txt" // 假设数据文件名为 part2.txt
// 记录已发送的行数
var sentLines = 0
while (true) {
val file = new File(filePath)
val bufferedSource = Source.fromFile(file)
val linesIterator = bufferedSource.getLines().drop(sentLines)
val linesToSendPerSec = linesPerSec.toInt
val sleepTime = (1000.0 / linesToSendPerSec).toLong
while (linesIterator.hasNext) {
val line = linesIterator.next()
val message = new org.apache.kafka.clients.producer.ProducerRecord[String, String](topic, null, line)
producer.send(message)
Thread.sleep(sleepTime)
sentLines += 1
}
bufferedSource.close()
// 等待一段时间再次检查文件是否有新内容
Thread.sleep(5000)
}
// 不会执行到这里,因为循环会一直运行
producer.close()
}
}
1. 代码介绍
这个代码是一个Kafka消息生产者程序,用于从一个指定的文本文件中/home/hadoop/bilibili/streaming/data/part2.txt读取数据行,并将这些数据行作为消息发送到Kafka的一个特定主题(topic)中。
-
导入必要的库:
import java.io.{ File, RandomAccessFile} import java.nio.charset.StandardCharsets import scala.io.Source -
定义主对象和main方法:
object KafkaWordProducer2 { def main(args: Array[String]) {这个对象是程序的入口点,
main方法是程序的主方法。 -
检查命令行参数:
if (args.length < 3) { System.err.println("用法: KafkaWordProducer <metadataBrokerList> <topic> <linesPerSec>") System.exit(1) }代码要求至少三个命令行参数:Kafka的broker列表、目标主题(topic)和每秒发送的行数。如果参数不足,程序会输出用法说明并退出。
-
解析命令行参数:
val Array(brokers, topic, linesPerSec) = args将命令行参数赋值给变量。
-
设置Kafka生产者属性:
val props = new java.util.HashMap[String, Object]() props.put(org.apache.kafka.clients.producer.ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers) props.put(org.apache.kafka.clients.producer.ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer") props.put(org.apache.kafka.clients.producer.ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer") val producer = new org.apache.kafka.clients

最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



