Kafka不像hadoop更致力于处理大量级数据,Kafka的消息队列更擅长于处理小数据。针对具体业务而言,若是源源不断的push大量的数据(eg:网络爬虫),可以考虑消息压缩。但是这也一定程度上对CPU造成了压力,还是得结合业务数据进行测试选择
broker端
topic设置多分区,分区自适应所在机器,为了让各分区均匀分布在所在的broker中,分区数要大于broker数。分区是Kafka进行并行读写的单位,是提升kafka速度的关键。
关闭自动更新offset,等到数据被处理后再手动跟新offset。
在消费前做验证前拿取的数据是否是接着上回消费的数据,不正确则return先行处理排错。
一般来说zookeeper只要稳定的情况下记录的offset是没有问题,除非是多个consumer group同时消费一个分区的数据,其中一个先提交了,另一个就丢失了。
Kafka的数据一开始就是存储在PageCache上的,定期flush到磁盘上的,也就是说,不是每个消息都被存储在磁盘了,如果出现断电或者机器故障等,PageCache上的数据就丢失了。这个是总结出的到目前为止没有发生丢失数据的情况。
//producer用于压缩数据的压缩类型。默认是无压缩。正确的选项值是none、gzip、snappy。压缩最好用于批量处理,批量处理消息越多,压缩性能越好
props.put("compression.type", "gzip");
//增加延迟
props.put("linger.ms", "50");
//这意味着leader需要等待所有备份都成功写入日志,这种策略会保证只要有一个备份存活就不会丢失数据。这是最强的保证。,
props.put("acks", "all");
//无限重试,直到你意识到出现了问题,设置大于0的值将使客户端重新发送任何数据,一旦这些数据发送失败。注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。
props.put("retries ", MAX_VALUE);
props.put("reconnect.backoff.ms ", 20000);
props.put("retry.backoff.ms", 20000);
//关闭unclean leader选举,即不允许非ISR中的副本被选举为leader,以避免数据丢失
props.put("unclean.leader.election.enable", false);
//关闭自动提交offset
props.put("enable.auto.commit", false);
限制客户端在单个连接上能够发送的未响应请求的个数。设置此值是1表示kafka broker在响应请求之前client不能再向同一个broker发送请求。注意:设置此参数是为了避免消息乱序
props.put("max.in.flight.requests.per.connection", 1);强行kill线程,导致消费后的数据,offset没有提交,partition就断开连接。比如,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-blance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
如果在close之前调用了consumer.unsubscribe()则有可能部分offset没提交,下次重启会重复消费。
Kafka数据重复Kafka设计的时候是设计了(at-least-once)至少一次的逻辑,这样就决定了数据可能是重复的,Kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
Kafka的数据重复一般情况下应该在消费者端,这时log.cleanup.policy = delete使用定期删除机制。
如何为Kafka集群确定合适的分区数以及分区数过多带来的弊端
Kafka分区分配策略(Partition Assignment Strategy)
Kafka中sequence IO、PageCache、SendFile的应用详解
关注微信公众号大数据学习与分享,获取更多技术干货
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69918097/viewspace-3125116/ ,如需转载,请注明出处,否则将追究法律责任。