flink sql消费kafka的五种方式

4,313 阅读2分钟

flink sql提供了以下五种消费kafka的方式

earliest-offset

该模式为每次执行时从头开始消费 topic

latest-offset

从最新的offset 开始消费,也就是说在任务启动之前的消息是不会被消费到的,消费时会丢失数据

timestamp

指定每个分区(partition)的时间戳开始消费,设置时间戳之前的数据不会被消费, 通过 scan.startup.timestamp-millis 配置进行设置时间戳

specific-offsets

指定从每个分区(partition)的某个偏移量(offset)开始消费
设置方式: 'specific-offsets' = 'partition:0,offset:15' 表示 分区 0 从 偏移量(offset)15 开始消费消息

group-offsets(默认的消费方式)

zookeeper 或者 kafka 中某个指定的消费组已提交的偏移量开始消费

可能遇到的错误问题:

NoOffsetForPartitionException: Undefined offset with no reset policy for partitions

group-offsets在实际使用的时候发现没法使用,会一直报 NoOffsetForPartitionException: Undefined offset with no reset policy for partitions 错误, 机器翻译后:未定义的偏移量、没有分区的重置策略

在网上找了很多帖子发现都是复制粘贴,根本就没有去解决问题,而是直接把问题干掉了,既然问题不能解决,那么就把提出问题的地方直接干掉。
最多的回答就是把 group-offsets 修改为 earliest-offset 或者 latest-offset,但是很明显不能这样做。
网上不靠谱继续翻flink sql官网,找到了问题所在可能是没有配置 checkpoint ,然后尝试去配置了一下 checkpoint 地址和时间,发现ok了。
所以该错误的解决办法不应该去改变消费方式而是配置 checkpoint ,我是使用 flink sql 进行开发,添加以下配置成功解决:

execution.checkpointing.interval 1000
state.checkpoints.dir file:///data/source/flink/flink-save-point

第一个是配置 checkpoint 时间
第二个是配置 checkpoint 地址

org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException: Could not acquire the minimum required resources.

解决办法:查看flink服务是否正常,可能是flink服务挂掉,重启flink服务即可

连接信息

CREATE TABLE flink种表名(
    .....
)WITH (
    'connector' = 'kafka',
    'topic' = 'tpoic名称',
    'scan.startup.mode' = '以上五种消费方式',
    'properties.group.id' = '消费组',
    'properties.bootstrap.servers' = 'kafka地址',
    'properties.username' = 'kafka用户名',
    'properties.password' = 'kafka密码',
    'format' = 'json', 
    'json.fail-on-missing-field' = 'false',
    'json.ignore-parse-errors' = 'true'
)