Flume1.6的Kafka Sink参数中的batchSize属性在Flume1.7以后,变成了flumeBatchSize(应该是为了区分Kafka Producer的batch.size参数)。
在flume-ng-1.6.0-cdh5.14.4中Kafka Sink也使用 flumeBatchSize 参数。
flumeBatchSize的作用
How many messages to process in one batch. Larger batches improve throughput while adding latency.
配置多少条消息可以在 一个处理批次 被发送到 Kafka Broker。较大的批可以提高吞吐量,同时增加延迟。
但是,只设置这个Flume端的参数还不能完全让Kafka Sink 分批发送数据到Kafka Broker,因为 Flume的org.apache.flume.sink.kafka.KafkaSink是要通过使用 Kafka-clients包的org.apache.kafka.clients.producer.KafkaProducer发送数据的。
Kafka Producer端有两个很直接的参数——batch.size 和 linger.ms(0.8.1以后出现)
batch.size是一个批次发送消息的字节数(不是条数,默认16K),不会创建比这个值更大的批而尝试发送到broker上
linger.ms是批次间的间隔时间,默认0(间隔时间为0,有数据就发送)。
只要满足这两个条件之一,Producer就会发送消息:
- 记录的字节数达到 batch.size,就会发送一批
- 过了 linger.ms 指定的间隔时间,就会发送一批
- 对于Flume的Kafka Sink,event数目达到了 flumeBatchSize 就会发送一批
所以,Kafka Sink的 flumeBatchSize 并不能唯一确定一批要发送的Event的条数。
随着Kafka版本的更新,Producer端可能还有新的影响“批”的参数,一定要注意查阅相应版本的官方文档
示例
# Flume conf文件
agent1.sinks.kafka-sink.type = org.apache.flume.sink.kafka.KafkaSink
agent1.sinks.kafka-sink.kafka.topic = streamingtopic
agent1.sinks.kafka-sink.kafka.bootstrap.servers=master:9092
agent1.sinks.kafka-sink.kafka.producer.acks = 1
agent1.sinks.kafka-sink.flumeBatchSize=10 # Flume Kafka Sink端最多 10条 Event 为一批发送
agent1.sinks.kafka-sink.kafka.producer.batch.size=1048576 # 1批1M,此参数确定了一批的记录大小为1M字节
agent1.sinks.kafka-sink.kafka.producer.linger.ms=20000 # 间隔20秒,我的日志产生程序 1秒产生1条日志,此参数确定了最多20条一批
运行结果:
日志产生
消费的结果