Flink--Source(Kafka)

本文介绍了如何在Apache Flink中使用kafka-0.11_2.12连接器与Kafka建立连接,通过addSource方法实现数据流消费,并展示了从Kafka消费字符串数据的完整代码实例。

从kafka读取数据

依赖

kafka和flink是非常契合的。
若flink想和kafka建立连接,需要导入新的依赖

<dependency>
      <groupId>org.apache.flink</groupId>
      <artifactId>flink-connector-kafka-0.11_2.12</artifactId>
     <version>1.10.1</version>
</dependency>

addSource

之前从文件(readTextFile)、集合(fromCollection)属于特殊化方法。
当调用这种方法的时候,数据源已经被限定死了。

和kafka建立连接需要使用addSource,这是一般法方法,它对应的源是不固定的。

第一种实现方式

addSource[T](function:SourceContext[T] =>Unit):DataStream[T]

需要传入一个匿名函数,传入一个source上下文,没有返回值。
因为没有返回值,所以里边会生成数据并利用source上下文发出来。
最终得到一个DataStream[T]。后续都是关于DataStream[T]的转换
自己实现这么一个函数无疑是困难的,还有另外一中方式。

第二种实现方式

addSource[T](function:SourceFunction[T] ):DataStream[T]

首先,这里的SourceFunction是一个java接口。
所以这里需要一个 实现了此接口的类。是一个类似于函数功能的函数类
然后,SourceFunction接口中最核心的就是 SourceContext
接口中必须要实现的是两个方法cancel 和run
cancel方法需要在想要停止发送数据的时候调用。
run方法主要用于源源不断的读取数据。

与kafka建立连接

要和kafka建立连接。首先引入连接器依赖
连接器依赖已经实现了flink-kakfal连接类
之后addsource中直接创建一个连接类
因为要接收kafka数据 所以选择消费者

继承关系

FlinkKafkaConsumer11
FlinkKafkaConsumer10
FlinkKafkaConsumer09
FlinkKafkaConsumerBase
RichParallelSourceFunction
ParallelSourceFunction
SourceFunction
发现最终是继承于SourceFunction

继承关系

[ String ] 泛型 :表示从kafka读取的数据类型
( string topic , scheme 值的反序列化器,consumer的配置项 )
new SimpleStringSchema() 反序列器会直接当成普通的字符串去解析。

    val properties = new Properties()
    properties.setProperty("bootstrap.servers","localhost:9092")
    properties.setProperty("group.id","consumer-group")

    val kafkaData: DataStream[String] = env.addSource(new FlinkKafkaConsumer011[String]("Sennir",new SimpleStringSchema(),properties))

之后就是打印输出

完整代码

package com.erke.apitest

import java.util.Properties

import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.{FlinkKafkaConsumer011, FlinkKafkaConsumer09}

object SourceTest {
  def main(args: Array[String]): Unit = {

    //创建执行环境
    val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment

    val properties = new Properties()
    properties.setProperty("bootstrap.servers","localhost:9092")
    properties.setProperty("group.id","consumer-group")
    
	// 与kafka建立连接
    val kafkaData: DataStream[String] = env.addSource(new FlinkKafkaConsumer011[String]("Sennir",new SimpleStringSchema(),properties))
	
	//打印
    kafkaData.print()

    //执行
    env.execute("apitest")


  }
}
你问得非常好,而且已经做了正确的尝试! > ✅ **简短回答:** > **不应该再出现 `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` 就会彻底消失。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值