我正在Scala中编写一个Producer,我想进行批处理。批处理应该起作用的方式是,它应该将消息保持在队列中直到它已满,然后将所有消息一起发布到主题上。但不知怎的,它不起作用。在我开始发送消息的那一刻,它开始逐个发布消息。有谁知道如何在Kafka Producer中使用批处理。
val kafkaStringSerializer = "org.apache.kafka.common.serialization.StringSerializer"
val batchSize: java.lang.Integer = 163840
val props = new Properties()
props.put("key.serializer", kafkaStringSerializer)
props.put("value.serializer", kafkaStringSerializer)
props.put("batch.size", batchSize);
props.put("bootstrap.servers", "localhost:9092")
val producer = new KafkaProducer[String,String](props)
val TOPIC="topic"
val inlineMessage = "adsdasdddddssssssssssss"
for(i<- 1 to 10){
val record: ProducerRecord[String, String] = new ProducerRecord(TOPIC, inlineMessage )
val futureResponse: Future[RecordMetadata] = producer.send(record)
futureResponse.isDone
println("Future Response ==========>" + futureResponse.get().serializedValueSize())
}
答案 0 :(得分:1)
您必须在道具中设置linger.ms
默认情况下,它为零,表示如果可能,即时发送消息。 您可以增加它(例如100)以便批处理 - 这意味着更高的延迟,但吞吐量更高。
batch.size
是最大值:如果您在linger.ms
过去之前到达,则会在不等待更多时间的情况下发送数据。
要查看实际发送的批次,您需要配置日志记录(在后台线程上完成批处理,您将无法查看使用生产者API执行的批处理 - 您无法发送或接收批处理,只发送一条记录并接收其响应,通过批处理与代理进行内部沟通)
首先,如果尚未完成,请绑定log4j属性文件(Dlog4j.configuration=file:path/to/log4j.properties
)
log4j.rootLogger=WARN, stderr
log4j.logger.org.apache.kafka.clients.producer.internals.Sender=TRACE, stderr
log4j.appender.stderr=org.apache.log4j.ConsoleAppender
log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
log4j.appender.stderr.layout.ConversionPattern=[%d] %p %m (%c)%n
log4j.appender.stderr.Target=System.err
例如,我会收到
TRACE Sent produce request to 2: (type=ProduceRequest, magic=1, acks=1, timeout=30000, partitionRecords=({test-1=[(record=LegacyRecordBatch(offset=0, Record(magic=1, attributes=0, compression=NONE, crc=2237306008, CreateTime=1502444105996, key=0 bytes, value=2 bytes))), (record=LegacyRecordBatch(offset=1, Record(magic=1, attributes=0, compression=NONE, crc=3259548815, CreateTime=1502444106029, key=0 bytes, value=2 bytes)))]}), transactionalId='' (org.apache.kafka.clients.producer.internals.Sender)
这是一批2个数据。批处理将包含发送给同一经纪人的记录
然后,使用batch.size和linger.ms来查看差异。请注意,记录包含一些开销,因此batch.size为1000将不包含10条大小为100的消息
请注意,我没有找到说明所有记录器及其功能的文档(如log4j.logger.org.apache.kafka.clients.producer.internals.Sender)。您可以在rootLogger上启用DEBUG / TRACE并查找所需的数据,或explore the code