Flink 02 | 英雄莫问出处 Flink丰富多彩的数据源

Flink中,Source是数据流的 "起点" ,负责从外部数据源读取数据。Flink提供了多种内置的Source接口和类,以适应不同的使用场景,同时还支持自定义数据源。

Flink 数据源非常灵活,可以是文件,分布式系统,可以是消息队列、可以是数据库,并且支持用户自定义。英雄莫问出处,从理论上讲,Flink可以处理几乎"一切数据"。

本文主要内容

  • 内置数据源

  • 自定义数据源

  • 几种数据源接口介绍

  • 自定义数据源Demo

1. 基本数据源

Collection Source

  • 使用方式:通过fromCollection或fromElements方法

  • 应用场景:通常用于测试或演示简单的Flink程序,一般适用于一些静态离线演示的场景。

java 复制代码
List<Person> people = new ArrayList<Person>();

people.add(new Person("Fred", 35));
people.add(new Person("Wilma", 35));
people.add(new Person("Pebbles", 2));

DataStream<Person> flintstones = env.fromCollection(people);

Socket-based

  • 使用方式:env.socketTextStream("localhost", 9999)

  • 应用场景:通常用于测试或演示简单的Flink程序,这种方式测试数据比fromCollection 更加灵活,方便,但不适用大量数据演示。

java 复制代码
DataStream<String> lines = env.socketTextStream("localhost", 9999);

File-based

  • Flink数据源可以是本地文件或者分布式文件系统(如HDFS)。
本地文件
java 复制代码
DataStream<String> textStream = env.readTextFile("file:///path/to/file.txt");
HDFS

Flink 能够与HDFS 无缝集成,实现对海量数据的实时处理。

java 复制代码
DataStream<String> hdfsStream = env.readTextFile("hdfs://namenode:port/path/to/file");

2. 自定义数据源

除了基本数据源外Flink 内置了许多数据源连接器:如Kafka Source、Elasticsearch Source等等,以满足不同的业务场景,比如Kafka 数据源

java 复制代码
 KafkaSource<String> source = KafkaSource.<String>builder()
                .setBootstrapServers("localhost:9092")
                .setTopics("input-topic")
                .setGroupId("my-group")
                .setStartingOffsets(OffsetsInitializer.earliest())
                .setValueOnlyDeserializer(new SimpleStringSchema())
                .build();

env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source");

自定义数据源接口介绍

SourceFunction接口

这是一个基础的数据源接口,用于定义非并行数据源或并行度为 1 的数据源

  • run(SourceContextctx) throws Exception:在这个方法中实现数据的生成逻辑,并通过 ctx.collect 发送数据。

  • cancel():用于停止数据源的生成操作。当作业取消或出现异常时会调用此方法。

ParallelSourceFunction接口

它继承自 SourceFunction 接口,增加了对并行性的支持。

RichParallelSourceFunction

这是一个更丰富的带有生命周期管理方法 的并行数据源类。除了 run 和 cancel 方法外,还提供了 open 和 close 方法。

  • open(Configuration parameters):在每个并行数据源实例启动时调用,可以用于初始化资源,如建立数据库连接等。

  • close():在数据源实例关闭时调用,用于清理资源。

Flink还提供了数据源接口,我们实现该接口就可以实现自定义数据源,不同的接口有不同的功能,分类如下:

java 复制代码
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.source.RichParallelSourceFunction;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class JDBCRichParallelSourceFunction extends RichParallelSourceFunction<Integer> {

  private Connection connection;


  @Override
  public void open(Configuration parameters) throws Exception {
      // 建立数据库连接
      connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
 
  }

  @Override
  public void run(SourceContext<Integer> ctx) throws Exception {
      Statement  statement = connection.createStatement();
      ResultSet resultSet = statement.executeQuery("SELECT * FROM my_table");
      while (resultSet.next()) {

          String value = resultSet.getString("my_column");
          // 发送数据
          ctx.collect(value);
      }
      statement.close();
  }

  @Override
  public void cancel() {
      // 停止数据读取
  }

  @Override
  public void close() throws Exception {
    
      if (connection!= null) {
          connection.close();
      }
  }
}

3. 总结

本文介绍了Flink 数据源使用,以及自定义数据库的使用方式,学了本文相信读者可以根据业务场景选择合适的数据源。

相关推荐
captain_AIouo几秒前
OZON运营全场景导入,Captain AI系统功能适配效果
大数据·人工智能·经验分享·aigc
b***25114 分钟前
定制组装锂电池设备:技术融合与精准制造的实践路径|深圳比斯特
大数据·人工智能
qyr67894 分钟前
全球汽车AI智能体市场调研与行业发展趋势
大数据·人工智能·数据分析·汽车·生活·汽车ai智能体
湘美书院--湘美谈教育16 分钟前
湘美书院人工智能启示录:AI会是人类的造梦师吗?
大数据·人工智能·深度学习·神经网络·机器学习
盘古信息IMS21 分钟前
MES最佳实践|盘古信息IMS赋能傲佑科技打造PCBA一站式电子智造新标杆
大数据·人工智能·科技
YMY哈2 小时前
Spark 4.0 重磅升级:湖仓处理性能再突破
大数据
南棱笑笑生3 小时前
20260420给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时调通AP6256并实测网速109Mbits/sec
大数据·elasticsearch·搜索引擎·rockchip
Elastic 中国社区官方博客9 小时前
Elasticsearch:使用 Agent Builder 的 A2A 实现 - 开发者的圣诞颂歌
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
历程里程碑10 小时前
2. Git版本回退全攻略:轻松掌握代码时光机
大数据·c++·git·elasticsearch·搜索引擎·github·全文检索
面向Google编程10 小时前
从零学习Kafka:ZooKeeper vs KRaft
大数据·kafka