Flink Connector(一) FlinkKafkaConsumer

 

 

前言

分析基于的版本是Flink 1.12.1 , Kafka 是 2.11 。 下面是在IDEA 里边直接依赖的包的截图 。

FlinkKafkaConsumer

Maven依赖:

<dependency>
    <groupId>org.apache.flink</groupId>
    <artifactId>flink-connector-kafka_2.11</artifactId>
    <version>1.12.1</version>
</dependency>

 

Flink Kafka Consumer  特性

Flink Kafka Consumer 直接依赖的关键 Class 是  org.apache.flink.streaming.connectors.kafka.FlinkKafkaConsumer , 这个类有两个方面的指责,一是作为Flink  框架支持的一种 Source, 要适配Source 接口的相关逻辑保证正确接入Flink,第二个是与Kafka 本身的Consumer 方式交互的逻辑 。 官方给出使用Flink Kafka Consumer 的简单例子 :

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test");
DataStream<String> stream = env
    .addSource(new FlinkKafkaConsumer<>("topic", new SimpleStringSchema(), properties));

 

Properties properties = new Properties();
properties.setProperty("bootstrap.servers", "localhost:9092");
properties.setProperty("group.id", "test");

FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<>(
    java.util.regex.Pattern.compile("test-topic-[0-9]"),
    new SimpleStringSchema(),
    properties);
 

 

从官方给出的例子可以看出,使用 Flink Kafka Consumer 的三个要素

1、 Kafka 的Topic 或则会是 Topic的一个列表 (支持正则匹配的方式),表征从Kafka Cluster 哪里获取数据

2、 数据如何反序列化,与Kafka 自身的Consumer 使用模式类似,用户APP 需要负责将read 的bytes 还原成业务操作的对象,涉及到的接口就是  DeserializationSchema / KafkaDeserializationSchema

3、 Kafka Consumer的配置属性 ,如“bootstrap.servers”,“group.id” 必须存在,其他的控制属性如 poll超时时间,每次poll多少条等

引用自官方 

  1. The topic name / list of topic names
  2. A DeserializationSchema / KafkaDeserializationSchema for deserializing the data from Kafka
  3. Properties for the Kafka consumer. The following properties are required:
    • “bootstrap.servers” (comma separated list of Kafka brokers)
    • “group.id” the id of the consumer group

 

 

Flink Kafka Consumer  相关源代码分析

入口类 FlinkKafkaConsumer,需要一个范型指定SOURCE 输出到 Flink Stream 中的Record 类型 T,这个T 是通过用户配置的 反序列化类实现的~

public class FlinkKafkaConsumer<T> extends FlinkKafkaConsumerBase<T> 

     FlinkKafkaConsumer的构造函数重载的形式,最终都是调用最后一个构造器完成对象的创建

 

public FlinkKafkaConsumer(String topic, DeserializationSchema<T> valueDeserializer, Properties props)
public  FlinkKafkaConsumer(String topic, KafkaDeserializationSchema<T> deserializer, Properties props)
public FlinkKafkaConsumer(List<String> topics, DeserializationSchema<T> deserializer, Properties props)
public FlinkKafkaConsumer(List<String> topics, KafkaDeserializationSchema<T> deserializer, Properties props)
public FlinkKafkaConsumer(Pattern subscriptionPattern, DeserializationSchema<T> valueDeserializer, Properties props) 
public FlinkKafkaConsumer(Pattern subscriptionPattern, KafkaDeserializationSchema<T> deserializer, Properties props)
private FlinkKafkaConsumer(
   List<String> topics,
   Pattern subscriptionPattern,
   KafkaDeserializationSchema<T> deserializer,
   Properties props)

 

 

private FlinkKafkaConsumer(
   List<String> topics,
   Pattern subscriptionPattern,
   KafkaDeserializationSchema<T> deserializer,
   Properties props) {

   super(
      topics,
      subscriptionPattern,
      deserializer,
      getLong(
         checkNotNull(props, "props"),
         KEY_PARTITION_DISCOVERY_INTERVAL_MILLIS, PARTITION_DISCOVERY_DISABLED),
      !getBoolean(props, KEY_DISABLE_METRICS, false));

   this.properties = props;
   setDeserializer(this.properties);

   // configure the polling timeout
   try {
      if (properties.containsKey(KEY_POLL_TIMEOUT)) {
         this.pollTimeout = Long.parseLong(properties.getProperty(KEY_POLL_TIMEOUT));
      } else {
         this.pollTimeout = DEFAULT_POLL_TIMEOUT;
      }
   }
   catch (Exception e) {
      throw new IllegalArgumentException("Cannot parse poll timeout for '" + KEY_POLL_TIMEOUT + '\'', e);
   }
}

上边这个构造函数的核心流程,super 是调用父类的构造起,之后是将传入的properties赋值到该对象的成员变量 this.properties 。

比较有意思的是最后进行 deserialize 的接口就只是 KafkaDeserializationSchema,也就就算用户DeserializationSchema 传入接口的实现,也会被包装成KafkaDeserializationSchema,后便会对比一下两者的区别[1]

setDeserializer(this.pro

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Kafka SQL Connector是Apache Kafka社区提供的一个工具,用于将Kafka消息流转换成关系型数据,并支持在SQL中进行查询、聚合和窗口操作。Flink是一个流处理框架,可以实现实时的数据处理和计算。在Flink 1.11版本中,可以使用Kafka SQL ConnectorKafka消息流集成到Flink中,并直接在Flink SQL中进行流处理和分析。 使用Kafka SQL Connector需要进行以下步骤: 1. 安装Kafka SQL Connector 需要下载并安装Kafka SQL Connector包,可以从Apache官网或者Kafka社区下载。 2. 将Kafka SQL Connector添加到Flink Classpath中 可以通过修改flink-conf.yaml文件或使用--classpath参数将Kafka SQL Connector添加到Flink Classpath中。 3. 创建Kafka数据源 可以使用Flink提供的Kafka连接器,从Kafka中读取数据流,并转换成Flink DataStream。代码示例: ```java Properties props = new Properties(); props.setProperty("bootstrap.servers", "localhost:9092"); props.setProperty("group.id", "test"); FlinkKafkaConsumer<String> consumer = new FlinkKafkaConsumer<>("my-topic", new SimpleStringSchema(), props); DataStream<String> stream = env.addSource(consumer); ``` 4. 创建Kafka SQL表 使用CREATE TABLE语句,将Kafka数据流转换成Kafka SQL表。代码示例: ```sql CREATE TABLE kafka_table ( `key` STRING, `value` STRING, `timestamp` TIMESTAMP(3) METADATA, WATERMARK FOR `timestamp` AS `timestamp` - INTERVAL '5' SECOND ) WITH ( 'connector' = 'kafka', 'topic' = 'my-topic', 'properties.bootstrap.servers' = 'localhost:9092', 'properties.group.id' = 'test', 'format' = 'json' ) ``` 5. 在Flink SQL中进行数据处理和分析 可以使用Flink SQL语句,在Kafka SQL表上进行数据处理和分析。代码示例: ```sql SELECT COUNT(*) FROM kafka_table WHERE `key` = 'foo' ``` 以上就是使用Kafka SQL ConnectorFlink 1.11中将Kafka消息流集成到Flink中的基本步骤。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值