Flink--Source(Kafka)

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从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")


  }
}
### FlinkKafka的集成及使用方法 Flink通过其Kafka连接器(Kafka Connector)提供了对Kafka的一流支持,允许用户轻松地将FlinkKafka集成以实现高效的实时数据处理和流式数据分析[^3]。以下是对Flink Kafka Connector的详细介绍以及如何配置和使用的指南。 #### 配置Kafka连接器 Flink支持从Kafka读取数据作为数据源(Source),并可以将处理后的数据写入Kafka作为数据汇(Sink)。为了启用Kafka连接器,首先需要确保在项目中添加了正确的依赖项。对于Maven项目,可以在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-connector-kafka_2.12</artifactId> <version>1.15.0</version> <!-- 根据实际版本调整 --> </dependency> ``` #### 使用Kafka作为数据源 Flink可以从Kafka中读取数据流,并将其作为输入源用于流处理任务。以下是一个简单的示例代码,展示如何从Kafka主题中读取数据: ```java import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer; import java.util.Properties; public class KafkaSourceExample { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); properties.setProperty("group.id", "test"); FlinkKafkaConsumer<String> kafkaConsumer = new FlinkKafkaConsumer<>( "input_topic", new SimpleStringSchema(), properties); env.addSource(kafkaConsumer).print(); env.execute("Kafka Source Example"); } } ``` 上述代码展示了如何配置一个Kafka消费者,并从指定的主题中读取数据[^3]。 #### 使用Kafka作为数据汇 除了作为数据源外,Flink还可以将处理后的数据写入Kafka。以下是一个示例代码,展示如何将数据写入Kafka主题: ```java import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; import org.apache.flink.streaming.connectors.kafka.FlinkKafkaProducer; import java.util.Properties; public class KafkaSinkExample { public static void main(String[] args) throws Exception { final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); Properties properties = new Properties(); properties.setProperty("bootstrap.servers", "localhost:9092"); FlinkKafkaProducer<String> kafkaProducer = new FlinkKafkaProducer<>( "output_topic", new SimpleStringSchema(), properties); env.fromElements("Hello, Kafka!", "Flink and Kafka integration") .addSink(kafkaProducer); env.execute("Kafka Sink Example"); } } ``` 此代码片段展示了如何配置一个Kafka生产者,并将数据写入指定的主题[^3]。 #### Kerberos身份验证配置 如果Kafka集群启用了Kerberos身份验证,则需要在`flink-conf.yaml`中进行相应的配置。例如: ```yaml security.kerberos.login.keytab: /path/to/keytab/file security.kerberos.login.principal: flink-principal@EXAMPLE.COM security.kerberos.login.contexts: KAFKA_CLIENT ``` 完成上述配置后,Flink将能够与启用了Kerberos的Kafka集群进行通信[^1]。 ### 数据通信协议 FlinkKafka之间的数据通信基于Kafka的发布-订阅模式。Flink通过Kafka连接器订阅Kafka中的主题,并将数据流作为输入源处理。处理后的结果可以通过Kafka连接器再次写回Kafka,形成闭环的数据处理流程[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值