目录
1 Apache kafka
Kafka的核心是一个分布式的发布/订阅消息的一个系统。并广泛用于获取和分发事件流。
1.1 Topic(主题)与分区
- Kafka将事件流,组织为不同的主题(Topic)。
- 每个主题都是一个事件日志,其事件读取顺序和写入顺序完全相同。
- 为了实现主体读写的伸缩性,Kafka允许用户在创建topic时定义分区,即将topic拆分为多个分区分散在集群上。并对每个分区上的事件提供保序,但kafka不能保证不同分区之间的事件顺序,因此kafka提供了offset偏移量这个概念,来保证就算你读取的数据在不同的分区上也能通过偏移量实现与输入顺序相同的顺序来进行读取
2 Flink kafka连接器(flink-connector-kafka_2.12)
Flink kafka 连接器会以并行的方式获取事件流。
每个并行的数据源任务都可以从一个或多个分区中读取数据。并通过维护偏移量来保证各分区之间数据的顺序,如果程序开启检查点的话,Flink会将偏移量记录到检查点中。
- 因此当程序因为故障而要从检查点处进行恢复的时候,Flink kafka依赖的是记录在检查点中的偏移量,而非Kafka自身所提供的消费者组(consumer group)
2.1 举例
- 当你从检查点恢复的时候,你的代码中kafka设置的偏移量是从最近的一次开始读取,但实际上,你是从程序失败处读取Kafka的数据,而非最近的一次Kafka数据。
3 Flink kafka提取事件时间生成水位线
Q:Flink中基于事件时间的操作需要我们定义水位线,那么在flink kafka中我们如何提取Kafka分区中的事件时间并定义水位线呢?
A:
- 可以通过调用FlinkKakfkaConsumer. assignTimestampsAndWatermarks()方法.同时向kafka消费者提供一个AssignerWithPeriodicWatermarks对象来定义水位线。
- 为了利用Kafka各个分区的保序性特征,分配器会在每个分区上定义水位线,然后再对各个分区之间的水位线进行合并。
注意:
如果某一分区变成非活跃状态且不再提供消息,那么这个数据源任务的水位线将无法前进,继而导致整个应用的水位线都不会前进。因此单个非活跃的分区会导致整个应用停止运行。