文章目录
写在前面
中途丢失过一次近2000的文字,写得心痛。
kafka权威指南很久前已经看完了。今天打算根据所学到的知识进行一些基准测试和调优。本篇文章侧重实践+少量源码分析+部分原理分析,更多的原理分析、理解放在下篇文章中
【实战过程中,脑海中冒出了太多的疑惑和想解决的问题,我认为消息中间件 比之前学习的大数据生态的一些组件要复杂些,等校招拿了offer,我会把下方所有未解决的问题,逐个深入击破】。
另外,由于无人指导,文章中的测试或者结论,皆为个人见解,不妥之处,大家多指出。
背景
需要将第三方接口的数据全部导出,为避免数据丢失,故考虑使用kafka,暂时没有结合Flume(数据维度有些复杂)。
数据量:近8000万条论文等知识产权数据,预计600G。
我所理解的kafka的使用场景
-
考虑数据丢失。比如我们从某个数据源接受数据,但是数据从数据源流出的速度大于我们接受数据组件的处理速度,那么这种情况,就很有可能出现数据丢失;还有就是网络阻塞,机器宕机,也可能会造成数据丢失。而kafka处理数据的策略可以适当的解决这个问题
-
多订阅数据分发,kafka的消费者组,kafka的某个主题,可以让多个组件去订阅。比如我们某个系统出来的数据,可能多个子系统都会使用这些数据,那么使用kafka是个很不错的选择【比如对于同一份数据,我们需要有不同的动作,比如对该数据进行数据清洗挖掘信息,或者将该数据发往别的界面进行展示,等等。】(Kafka支持多个消费者从一个消息流上读取数据,而且消费者之间直不影响)
-
实时处理:收集处理流式数据(我们可以把数据库的更新发布到 Kafka 上,应用程序通过监控事件流来接收数据库的实时更新。)
-
日志收集: kafka可将多个日志服务器的数据聚合到一起,比如说文件服务器,hdfs。之后再对这些日志数据进行离线分析,或者放入全文检索系统中进行数据挖掘
-
应用程序指标,跟踪 CPU 使用率和应用性能等指标
-
行为跟踪:跟踪用户浏览页面、搜索及其他行为,以发布-订阅的模式实时记录到对应的topic里。那么这些结果被订阅者拿到后,就可以做进一步的实时处理,或实时监控,或放到hadoop/离线数据仓库里处理。(在领英,Kafka 最初的使用场景是跟踪用户的活动。这样一来就可以生成报告,为机器学习系统提供数据,更新搜索结果等)
优化需要考虑的问题
使用kafka前,有些我们需要考虑的地方,想象我们自己设计中间件,需要考虑些什么?
- 生产与消费,异步还是同步?
- 如何确定生产者正确接受到数据,当前场景,是否每个消息都很重要?是否允许丢失一小部分消
息?偶尔出现重复消息是否可以接受? - 发送失败的重试次数
- 是否有严格的延迟和吞吐量要求?
- 缓冲区大小
- 因为是消息中间件嘛,更多的只是作为一个通道(也会持久化),所以需要根据实际业务,考虑消息删除策略,是基于时间还是基于空间
- 由于组的概念,以为消费者往往需要进行数据分析、处理,所以我们还需要考虑消费者处理数据的速度,需要多少消费者,还有确定消费者分别处理哪些分区的数据。
- 还有消费者数量变化、分区数量变化导致的数据再均衡
- 消费者读取信息的偏移量,如何保证消费者成功消费到所有数据
- 如何保证消费者不重复消费数据
- 如何正确退出生产和消费
- 等等
注
以下代码会有不少注释,很多注释是初学时或者第一次实践时注释的,考虑到好记性不如烂笔头,就没有去掉。但是在企业真实生产环境中,过于普通,大家都懂的注释,还是少写点吧?
生产者优化
对于server的配置优化,留到最后,不然反复重启Kafka集群,还是比较不划算。
配置1-同步生产数据
在这里, producer.send()先返回一个 Future 对象,然后调用 Future 对象的 get()方法等待 Kafka 响应。如果服务器返回错误, get 方法会抛出异常。如果没有发生错误,我们会得到一个 RecordMetadata 对象,进一步,可以用它获取消息的偏移量。
kafkaProducer.send(new ProducerRecord<>(topic, Integer.toString(keyCount), Arrays.toString(keywords))).get();