flink1.11.1 sql-client 连接kafka

本文档介绍了如何启动Flink集群和SQL客户端,配置Flink读取Kafka中的数据流,以及进行时间窗口聚合操作。内容包括设置Kafka源、定义数据格式、配置时间戳和水印,以及提供了测试数据和SQL查询示例。

一、启动flink集群 bin/start-cluster.sh

二、启动sql-client.sh embedded -l libs/

三、配置文件:

 添加表设置:tip:kafka版本 version: universal

tables:
  - name: orders
    type: source
    update-mode: append
    connector: 
       property-version: 1
       type: kafka
       version: universal
       topic: ck1
       startup-mode: latest-offset
       properties:
       - key: zookeeper.connect
         value: hdp-1:2181
       - key: bootstrap.servers
         value: hdp-2:9092
       - key: group.id
         value: test-consumer-group
    format: 
       property-version: 1
       type: json
       schema: "ROW(order_id LONG, shop_id VARCHAR, member_id LONG, trade_amt DOUBLE, pay_time TIMESTAMP)"
    schema: 
       - name: order_id
         type: LONG
       - name: shop_id
         type: VARCHAR
       - name: member_id
         type: LONG
       - name: trade_amt
         type: DOUBLE
       - name: payment_time
         type: TIMESTAMP
         rowtime:
           timestamps:
             type: "from-field"
             from: "pay_time"
           watermarks:
             type: "periodic-bounded"
             delay: "60000"

四、下载flink-connecter-kafka的jar和flink json的jar放在sql_libs目录下

注意、flink-connecter的jar需要从官网下

https://ci.apache.org/projects/flink/flink-docs-release-1.11/dev/table/connectors/kafka.html

 flink-json maven仓库下就可以

https://mvnrepository.com/artifact/org.apache.flink/flink-json/1.11.1

 

五、测试:

Kafka测试数据

{"order_id": "1","shop_id": "AF18","member_id": "3410211","trade_amt": "100.00","pay_time": "2021-01-19T09:45:00Z"}
{"order_id": "1","shop_id": "AF18","member_id": "3410211","trade_amt": "100.00","pay_time": "2021-01-19T09:45:01Z"}
{"order_id": "1","shop_id": "AF18","member_id": "3410211","trade_amt": "100.00","pay_time": "2021-01-19T09:45:02Z"}
{"order_id": "1","shop_id": "AF18","member_id": "3410211","trade_amt": "100.00","pay_time": "2021-01-19T09:45:03Z"}
{"order_id": "1","shop_id": "AF18","member_id": "3410211","trade_amt": "100.00","pay_time": "2021-01-19T09:45:04Z"}

flink-sql:

1、select * from orders;

2、

SELECT
  shop_id
  , TUMBLE_START(payment_time, INTERVAL '1' MINUTE) AS tumble_start
  , TUMBLE_END(payment_time, INTERVAL '1' MINUTE)   AS tumble_end
  , sum(trade_amt)                             AS amt
FROM orders
GROUP BY shop_id, TUMBLE(payment_time, INTERVAL '1' MINUTE);
你问得非常好,而且已经做了正确的尝试! > ✅ **简短回答:** > **不应该再出现 `ClassNotFoundException: org.apache.kafka.connect.errors.ConnectException` 了** —— > 只要你添加的是官方发布的、完整版本的 `flink-sql-connector-kafka-1.17.2.jar`,并且重启了 SQL Client 或集群。 但如果 **仍然报这个错**,说明: ➡️ 要么 JAR 不完整(比如是 “shaded” 版本但排除了 connect 类) ➡️ 要么路径不对没加载 ➡️ 要么用错了包(比如只用了 `flink-connector-kafka` 而不是 `flink-sql-connector-kafka`) --- ## 🔍 深入分析:两个 JAR 的区别 你提到了两个 JAR: | JAR 名称 | 作用 | 是否解决 ConnectException? | |--------|------|----------------------------| | `flink-sql-connector-kafka-1.17.2.jar` | ✅ 包含 Kafka SQL Connector + 所有 format 支持(包括 `debezium-json`, `canal-json`) | ✅ 是你需要的核心依赖 | | `flink-connector-kafka-1.17.2.jar` | ❌ 已废弃!Flink 1.15+ 不再使用此命名 | ⚠️ 很可能是空包或仅 API stub | 📌 **重点来了:** ### ❌ `flink-connector-kafka-1.17.2.jar` 是一个“占位符”或“API-only”的 artifact 它 **不包含实际运行时类**,也不包含 `kafka-clients` 和 `debezium` 相关代码。 👉 官方推荐使用的是: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-sql-connector-kafka</artifactId> <version>1.17.2</version> </dependency> ``` 这才是完整的、可运行的 JAR 文件。 --- ## ✅ 正确做法:只需要这一个 JAR ```bash # 推荐下载地址(Maven Central) https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-kafka/1.17.2/flink-sql-connector-kafka-1.17.2.jar ``` ✅ 这个 JAR 已经包含了: - Kafka Source/Sink 实现 - JSON / Debezium JSON / Canal JSON 格式工厂 - 对 `org.apache.kafka.connect.*` 类的内部引用(部分重命名或影子依赖) 所以只要你加了它,并放到 `$FLINK_HOME/lib/`,就应该能解决 `ConnectException` 问题。 --- ## 🧪 验证 JAR 是否真的包含所需类 你可以用以下命令检查 JAR 是否包含 `ConnectException`: ```bash jar -tvf $FLINK_HOME/lib/flink-sql-connector-kafka-1.17.2.jar | grep "ConnectException" ``` 如果输出类似: ``` ... org/apache/kafka/connect/errors/ConnectException.class ``` ✅ 说明类存在。 如果没有输出 ❌ → 说明这个 JAR 是精简版或者构建时被排除了。 --- ## ⚠️ 常见导致问题依旧的原因 | 原因 | 解决方案 | |------|----------| | 1. 使用了错误的 JAR(如 `flink-connector-kafka`) | 删除,只保留 `flink-sql-connector-kafka` | | 2. 下载的是 `-javadoc.jar` 或 `-sources.jar` | 确保下载的是 `.jar` 主构件(无后缀) | | 3. JAR 没放进 `$FLINK_HOME/lib/` | 必须放这里,SQL Client 才能加载 | | 4. 没有重启 SQL Client | 添加 JAR 后必须重启进程 | | 5. 使用了自定义 ClassLoader 隔离机制 | 如在 Kubernetes/YARN 上需确认分发成功 | --- ## ✅ 最佳实践建议 ### ✔️ 推荐操作流程: ```bash # 1. 进入 lib 目录 cd $FLINK_HOME/lib # 2. 清理旧的无效 JAR(避免冲突) rm flink-connector-kafka-*.jar # 删除已废弃的 connector rm kafka-connect-*.jar # 手动添加的碎片 JAR 全删掉 # 3. 下载正确 JAR wget https://repo.maven.apache.org/maven2/org/apache/flink/flink-sql-connector-kafka/1.17.2/flink-sql-connector-kafka-1.17.2.jar # 4. 验证是否包含 ConnectException jar -tvf flink-sql-connector-kafka-1.17.2.jar | grep "ConnectException" # 5. 启动 SQL Client $FLINK_HOME/bin/sql-client.sh ``` 然后执行你的 DDL,应该不会再报错。 --- ## 💡 补充知识:为什么有时候即使有 JAR 还找不到类? 可能原因: - **Shading(重命名)**:某些发行版把 `org.apache.kafka.connect.*` 重命名为 `org.apache.flink.shaded.kafka.connect.*` - **ClassNotFoundException 仍发生** → 因为代码里写死要找原始包名 - **解决方案**:Flink 内部做了适配,但前提是使用官方发布版本 👉 所以:**不要自己编译或裁剪 JAR,使用官方二进制包最安全** --- ## ✅ 总结 | 问题 | 回答 | |------|------| | 我加了 `flink-sql-connector-kafka-1.17.2.jar` 和 `flink-connector-kafka-1.17.2.jar`,还会报错吗? | ✅ 如果只加了这两个,且其中一个是废弃的,**还是会报错** | | 正确做法是什么? | ❌ 删除 `flink-connector-kafka`,✅ 只保留 `flink-sql-connector-kafka-1.17.2.jar` | | 是否需要其他 Kafka Connect JAR? | ❌ 不需要!官方 JAR 已内置必要类 | | 加完之后要不要重启? | ✅ 必须重启 SQL Client 或集群 | | 如何验证类是否存在? | 使用 `jar -tvf xxx.jar \| grep ConnectException` | 只要做到以上几点,`ClassNotFoundException: org.apache.kafka.connect.errors.ConnectException` 就会彻底消失。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值