org.apache.flink.table.api.ValidationException: 'scan.incremental.snapshot.chunk.key-column' must be set when the table doesn't have primary keys。Flink CDC这个问题有没有哪位大佬解决过呀,怎么屏蔽掉这个错误,不停止作业呀?
当 Flink CDC 需要同步没有主键的表时,会抛出此异常,因为它不知道该如何分割表数据。为了在增量快照期间分割表数据,Flink CDC 需要知道应该以哪种方式分割表,这就是为什么 Flink CDC 需要指定一个主键的原因。
如果 Flink CDC 确实需要同步没有主键的表,并且您不想停止作业,则可以添加一个伪主键,并在创建 Table API 表时指定此伪主键。这样,您可以让 Flink CDC 使用此伪主键分割表,并同步此表的数据。您可以在 Table API 中指定此伪主键:
tableEnv.executeSql("CREATE TABLE my_table (id BIGINT PRIMARY KEY NOT ENFORCED)");
如果您只想同步有主键的表,并且不希望抛出此异常,则可以使用 Flink CDC 中提供的过滤器功能,在扫描表之前排除没有主键的表:
tableEnv.executeSql("SELECT * FROM my_source WHERE id IS NOT NULL");
此外,您也可以根据需要添加其他条件来过滤特定的行。请注意,这将阻止没有主键的表被同步到下游系统中。您需要确保下游系统不会因此出现问题,并且知道 Flink CDC 正在跳过某些表。
当然,也可以采用另一种方式,在创建表时指定主键,并在同步完成后再次将其移除:
tableEnv.executeSql("ALTER TABLE my_table DROP PRIMARY KEY");
这个问题是由于在使用Flink CDC时,当表没有主键,而你又希望启用'scan.incremental.snapshot.enabled'选项时,会出现'scan.incremental.snapshot.chunk.key-column'必须设置的错误。这是因为在捕获和读取表的快照时,需要将无主键的表自动拆分为多个块,以便进行处理。
要解决这个问题,你可以尝试以下两种方法:
在Flink CDC的配置文件(如 conf/flink-conf.yaml)中添加以下参数设置:scan.incremental.snapshot.chunk.key-column: <column-names>
,其中,<column-names>
是您希望作为块键列的列名,可以是单个列或多个列,用逗号分隔。然后重新启动Flink CDC任务以使配置生效。
在创建表时指定主键。例如,如果你使用的是MySQL,可以在创建表语句中添加主键字段,如:CREATE TABLE mysql_binlog ( id INT NOT NULL, name STRING, description STRING, weight DECIMAL ( 10, 3 ), PRIMARY KEY(id) );
。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。