Kafka解析之topic创建(3)合法性验证

本文介绍了Kafka中如何通过create.topic.policy.class.name参数自定义Topic创建的合法性验证策略,以防止创建不符合规范的Topic。在Kafka服务端实现CreateTopicPolicy接口并配置后,可在创建Topic时检查分区数和副本因子,避免影响系统运维。此外,通过KafkaAdminClient创建Topic时,不合规的请求将被PolicyViolationException捕获。

原 Kafka解析之topic创建(3)——合法性验证https://blog.youkuaiyun.com/u013256816/article/details/79996208版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.youkuaiyun.com/u013256816/article/details/79996208
欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。
前文摘要
在《Kafka解析之Topic创建(1)》这篇文章中,我们讲述了创建Topic的方式有两种:
如果kafka broker中的config/server.properties配置文件中配置了auto.create.topics.enable参数为true(默认值就是true),那么当生产者向一个尚未创建的topic发送消息时,会自动创建一个num.partitions(默认值为1)个分区和default.replication.factor(默认值为1)个副本的对应topic。
通过kafka提供的kafka-topics.sh脚本来创建,或者相关的变种方式(比如在zookeeper中的/config/topics/路径下直接创建)。
在学习了KafkaAdminClient之后我们发现它也可以用来创建Topic,即通过发送CreateTopicsRequest请求的方式来创建。KafkaAdminClient的详细内容可以参考:《集群管理工具KafkaAdminClient——原理与示例》和《集群管理工具KafkaAdminClient——改造》。
一般情况下,Kafka生产环境中的 auto.create.topics.enable参数会被修改为false,即自动创建Topic这条路会被堵住。kafka-topics.sh脚本创建的方式一般由运维人员操作,普通用户无权过问。那么KafkaAdminClient就为普通用户提供了一个口子,或者将其集成到公司内部的资源申请、审核系统中更加的方便。普通用户在创建Topic的时候,有可能由于误操作或者其他原因而创建了不符合运维规范的Topic,比如命名不规范,副本因子数太低等,

### 排查 Flink 中 Avro 数据异常问题并验证 Kafka 消息是否符合指定的 Avro Schema 在 Flink 处理 Kafka 的 Avro 格式数据时,`org.apache.flink.avro.shaded.org.apache.avro.AvroRuntimeException: Malformed data. Length is negative` 错误通常表明反序列化过程中存在问题。以下内容详细说明了可能的原因以及如何验证 Kafka 消息是否符合指定的 Avro Schema。 #### 1. 确认 Kafka 消息是否符合指定的 Avro Schema 为了验证 Kafka 中的消息是否符合预期的 Avro Schema,可以使用以下方法: - 使用 Kafka 控制台消费者工具读取消息,并结合 Confluent Schema Registry 验证消息格式[^3]。 - 示例命令如下: ```bash kafka-avro-console-consumer --bootstrap-server localhost:9092 \ --topic your_topic_name \ --from-beginning \ --property schema.registry.url=http://localhost:8081 ``` 如果消息能够成功解析,则说明消息格式与 Schema 匹配;否则需要检查生产者端的数据生成逻辑。 #### 2. 确保 Schema Registry URL 和版本正确 Flink 在处理 Confluent Avro 格式数据时依赖于 Schema Registry。如果未正确配置 Schema Registry URL 或使用的版本不兼容,则可能导致此错误[^2]。 - 确保表定义中包含正确的 Schema Registry 配置: ```sql CREATE TEMPORARY TABLE orders_kafka_avro ( order_number INT, order_date DATE, purchaser INT, quantity INT, product_id INT, op_ts TIMESTAMP(3) ) WITH ( &#39;connector&#39; = &#39;kafka&#39;, &#39;topic&#39; = &#39;orders_kafka_avro&#39;, &#39;properties.bootstrap.servers&#39; = &#39;b-2.oscimskcluster1.cedsl9.c20.kafka.us-east-1.amazonaws.com:9092,b-3.oscimskcluster1.cedsl9.c20.kafka.us-east-1.amazonaws.com:9092,b-1.oscimskcluster1.cedsl9.c20.kafka.us-east-1.amazonaws.com:9092&#39;, &#39;properties.group.id&#39; = &#39;orders_kafka_avro&#39;, &#39;scan.startup.mode&#39; = &#39;earliest-offset&#39;, &#39;format&#39; = &#39;debezium-avro-confluent&#39;, &#39;debezium-avro-confluent.schema-registry.url&#39; = &#39;http://10.0.13.30:8085&#39; ); ``` #### 3. 检查数据损坏或截断 Kafka 中的消息可能由于生产者或消费者的问题而被部分截断或损坏,导致长度字段为负值。这种情况下需要排查 Kafka 数据源本身是否存在异常[^4]。 - 使用 Kafka 工具检查消息完整性: ```bash kafka-console-consumer --bootstrap-server localhost:9092 --topic your_topic_name --from-beginning ``` 如果发现损坏的消息,需要清理 Kafka 中的这些数据并重新生成合法消息。 #### 4. 确保 Flink 和 Avro 版本兼容 Flink 的 Avro 支持依赖于特定版本的 Avro 库。如果使用的 Flink 版本与 Avro 库版本不匹配,可能会引发序列化/反序列化问题[^5]。 - 确认 Flink 和 Avro 的版本兼容性,必要时升级或降级相关组件。 #### 示例代码:验证 Kafka 消息与 Avro Schema 匹配 以下是一个完整的 SQL 创建表示例,包含 Schema Registry 配置: ```sql CREATE TEMPORARY TABLE Ammeter ( `header` ROW<`col` STRING, `enentTime` BIGINT> NOT NULL ) WITH ( &#39;connector&#39; = &#39;kafka&#39;, &#39;topic&#39; = &#39;your_topic&#39;, &#39;properties.bootstrap.servers&#39; = &#39;localhost:9092&#39;, &#39;format&#39; = &#39;avro-confluent&#39;, &#39;avro-confluent.schema-registry.url&#39; = &#39;http://localhost:8081&#39; ); ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值