1)水位线始终为负无穷(实际上是个极小值)
本项目要求Kafka 并行度为4,如果没有修改Kafka 的配置文件,则默认并行度为1。而程序并行度为 4,一个分区至多只能被一个消费者消费,这样一来,只有一个并行度可以消费到数据。没有数据的并行度水位线始终为极小值,上游多个并行度的数据进入下游的一个并行度时,下游的水位线取决于上游多个并行度的最小值,程序中存在shuffle 时,就会出现下游某个并行度的水位线无法升高,始终为极小值的情况,从而导致窗口无法闭合。
2**)没有聚合结果**
(1)DWS 层的数据来源于DWD 层。如果为了测试方便,将Kafka Connector 的启动模式修改为 earliest-offset,则会将 topic_db 的所有数据读取到程序中。在模拟数据配置文件中指定的业务日期不变的前提下,生成数据的水位线高低只与执行jar 包的系统时间有关(数据生成时间的HH:mm:ss 部分与系统时间相同)。若首次执行jar 包在当日22:00,之后执行都在22:00 之前,则第一批数据会将水位线推至22:00 对应的值,导致之前的窗口全部销毁,此时前面的数据进入程序,无法进入对应窗口,会被舍弃。而同批数据的生成时间极其相近,抵达较晚的数据无法使前面数据的窗口闭合,又没有其它批次的数据推高水位线,所以这批数据也没有结果输出。因而,看不到任何结果。
(2)如果没有消费分区历史数据,生成一批数据之后没有看到结果,可能是由于同批次数据生成时间极其相近,全部进入了同一个窗口。此时再生成一批数据,推高水位线使当前批次数据所属窗口闭合,即可看到结果。
3)关于Kafka 分区的删除和重新消费
Kafka 主题分区数只能增大,不能减小。分区数增大后,不会发生数据迁移,新的分区为空。
Kafka 主题的分区数发生变化时,重启程序才会消费到新的分区。因为只有在启动时才会为消费者分配分区,运行过程中分区分配不会发生变化。