Apache Kafka 学习:kafka在数据处理中的应用的一些个人理解。
离线数据处理
场景
在离线数据处理的过程中。
如果不使用消息队列,在并发量很小的情况下,所有的客户端数据日志直接向hdfs写数据暂时不会产生什么问题。
如果不使用消息队列,在并发量很大的情况下,向 hdfs 写数据就会出现问题,首先,向hdfs写数据会有锁竞争的情况,可能会导致大部分写请求很长时间得不到锁,导致大量请求延迟或者超时,这是不能接受的;并且 hdfs 作为文件系统不能承受太大的并发量,在并发很高的情况下,集群可能会崩溃。
问题原因总结
总的来说,在这种情况下,问题的根本在于高并发情况下,hdfs 作为文件系统不能承受高并发请求的问题。
实施方案
所以需要一种工具可以将客户端日志这种高并发请求转换为低并发的请求,这时候就可以使用kafka这样的消息队列,客户端的高并发请求直接写入 kafka,然后 hdfs 以低并发消费 kafka 中的数据。这样就解决了文件系统不能支持高并发的情况。并且由于 kafka 的HA特性,可以保证数据的正确性。
kafka作用
将高并发请求以低并发方式处理。这种方式中解耦效果不明显,下面的实时数据处理使用到的解耦效果比较明显。
实时数据处理
场景
在实时数据处理的过程中。
如果不使用消息队列,上游数据写入到类似 flink 这样的实时处理引擎当中,flink处理完成后向下游 olap 引擎(druid,clickhouse等)或者hdfs,hive,es等的文件系统写数据时,就需要为每一种 olap 引擎开发一种 connector,这样的情况下,每出现一种 olap 引擎或者每当下游的 olap 引擎升级版本引入新特性时,就需要 flink 开发工程师开发一种新的 connector 或者跟随 olap 引擎的升级而升级自己的 connector,这样 flink 开发工程师的维护成本之后就会特别高。
这里有同学可能会说可以在数据处理的过程中使用下游 olap 等的引擎提供的 sdk,这种方法是可以的,但是实时处理打不风情况下并发量很高,olap 引擎提供的 sdk 应对这种高并发的场景可能会有很多问题。
问题原因总结
问题的根本在于实时处理引擎和下游之间的耦合问题,这就需要一种HA的中间件来将各个模块进行解耦,kafka这样的消息队列可以很好的解决这中模块之间高度耦合的情况。
实施方案
在 flink 和 druid中间使用 kafka 进行解耦,让 flink 向 kafka 生成数据,druid 消费 kafka 的数据。
这样就使得 flink 可以只开发和维护一套针对于 kafka 的 connector,druid也只用开发和维护一套针对 kafka 的 connector,这样无论是实时处理引擎的升级或替换,或者是实时处理引擎下游的模块的升级或替换,都不会互相影响,并且这些模块的工程师只需要对消息队列的 connector 进行维护即可,并且可以根据其特性进行更好的优化。
kafka作用
模块之间的解耦。让各个模块各司其职。
拓展:
1.Java 虚拟机在 Java 语言和各个系统之间的作用。
2.Sql 进行三范式优化,不需要将所有数据都放在一张表当中,将n对n的表拆分出一张维表进行解耦。将维度拆分为维表可以减少数据量,更好划分和使用维度数据。
3.经典网络五层模型,划分为五层,则在每一层中更新或者新建协议栈只需要对上下层进行兼容即可,不需要对整个网络架构模型做调整。
4.Maven multiModule 划分。
5.springMvc。
等等。