Flink--初识 DataStream Connector Kafka

本文介绍如何在Apache Flink中集成Apache Kafka作为数据源和数据接收方,并提供了具体的配置步骤与示例代码。

  • Flink 作为比较适合流式处理的计算框架,在流式处理当中,比较搭配的消息中间件为 Kafka
  • 本次使用的 Kafka 版本为 2.1.0-cdh6.2.0
  • Flink 版本为 1.11.2,Scala 版本为 2.12.10

官网

Flink provides an Apache Kafka connector for reading data from and writing data to Kafka topics with exactly-once guaruntees.

1. 增加 POM 文件

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka_2.12</artifactId>
    <version>1.11.2</version>
</dependency>

2. 使用 Kafka 作为 Source

2.1 创建 Topic
[root@bigdatatest03 bin]# ./kafka-topics.sh --create --zookeeper  bigdatatest02:2181,bigdatatest02:2181,bigdatatest03:2181 --partitions 3 --replication-factor 3 --topic flink_kafka_source
  • 创建生产者
[root@bigdatatest03 bin]# ./kafka-console-producer.sh \
> --broker-list bigdatatest01:9092,bigdatatest02:9092,bigdatatest03:9092 \
> --topic flink_kafka_source
  • 创建消费者
[root@bigdatatest03 bin]# ./kafka-console-consumer.sh \
> --bootstrap-server bigdatatest01:9092,bigdatatest02:9092,bigdatatest03:9092 \
> --topic flink_kafka_source \
> --from-beginning
2.2 Code
package com.xk.bigdata.flink.datastream.connector

import java.util.Properties

import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer

/**
 * 使用 Kafka 作为数据源
 */
object KafkaSourceApp {

  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val properties = new Properties()
    val bootStrap = "bigdatatest02:9092,bigdatatest03:9092,bigdatatest04:9092"
    val sourceTopic = "flink_kafka_source"
    properties.setProperty("bootstrap.servers", bootStrap)
    properties.setProperty("group.id", "demo")
    val kafkaSource = new FlinkKafkaConsumer[String](sourceTopic, new SimpleStringSchema(), properties)
    val stream = env
      .addSource(kafkaSource)
    stream.flatMap(_.split(","))
        .map((_,1))
        .keyBy(_._1)
        .sum(1)
        .print()
    env.execute(this.getClass.getSimpleName)
  }

}
  • 运行结果
  • 生产者
>spark
>spark,hadoop
  • IDEA 控制台
1> (spark,1)
11> (hadoop,1)
1> (spark,2)

3. 使用 Kafka 作为 Sink

3.1 Code
package com.xk.bigdata.flink.datastream.connector

import java.util.Properties

import org.apache.flink.api.common.serialization.SimpleStringSchema
import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer

/**
 * 数据输出到 Kafka
 */
object KafkaSinkApp {

  def main(args: Array[String]): Unit = {
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val stream = env.readTextFile("data/wc.txt")
    val bootStrap = "bigdatatest02:9092,bigdatatest03:9092,bigdatatest04:9092"
    val topic = "flink_kafka_sink"

    val myProducer = new FlinkKafkaProducer[String](
      bootStrap, // target topic
      topic,
      new SimpleStringSchema()) // serialization schema

    stream.addSink(myProducer)
    env.execute(this.getClass.getSimpleName)
  }

}
  • Kafka Consumer
spark
hadoop,spark,flink
spark,hadoop
你问得非常好,而且已经做了正确的尝试! > ✅ **简短回答:** > **不应该再出现 `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、付费专栏及课程。

余额充值