Flink之源算子Data Source
源算子Data Source
概述
Flink中的Data Source(数据源、源算子)用于定义数据输入的来源。数据源是Flink作业的起点,它可以从各种数据来源获取数据,例如文件系统、消息队列、数据库等。
将数据源添加到Flink执行环境中,从而创建一个数据流。然后可以对该数据流应用一系列转换和操作,例如过滤、转换、聚合、计算等。最后将结果写入其他系统,例如文件系统、数据库、消息队列等。
数据源是Flink作业中非常重要的组件,它确定了数据的来源和初始输入,是构建流处理和批处理作业的基础。
内置Data Source
Flink Data Source用于定义Flink程序的数据来源,Flink官方提供了多种数据获取方法,用于帮助开发者简单快速地构建输入流
基于集合构建
可以将数据临时存储到内存中,形成特殊的数据结构后,作为数据源使用,比如采用集合类型。一般用来进行本地调试或者验证。
自定义的迭代器CustomIterator,产生 1 到 100 区间内的数据
注意: 自定义迭代器要实现Iterator接口外,还必须要实现序列化接口Serializable ,否则会抛出序列化失败的异常
基于文件构建
在本地环境进行测试时可以方便地从本地文件读取数据
各个参数含义:
基于Socket构建
通过监听Socket端口,可以在本地很方便地模拟一个实时计算环境。
Flink提供了socketTextStream方法可以通过host和port从一个Socket中以文本的方式读取数据,以此构建基于Socket的数据流
socketTextStream方法有以下四个主要参数:
示例如下:
读取socket文本流,是流处理场景,这种方式由于吞吐量小、稳定性较差,一般也是用于测试
注意:基于Socket构建数据源,一般需要搭配Netcat使用。
Netcat(又称为NC)是一个计算机网络工具,它可以在两台计算机之间建立 TCP/IP 或 UDP 连接。它被广泛用于测试网络中的端口,发送文件等操作。使用 Netcat 可以轻松地进行网络调试和探测,也可以进行加密连接和远程管理等高级网络操作。因为其功能强大而又简单易用,所以在计算机安全领域也有着广泛的应用。
安装nc命令
启动socket端口
注意:
测试时,先启动端口,后启动程序,会报超时连接异常,最后发送测试数据即可。
自定义Data Source
可以通过实现Flink的SourceFunction、ParallelSourceFunction、RichSourceFunction、RichParallelSourceFunction等类并重写其方法以此实现自定义Data Source
ParallelSourceFunction、RichParallelSourceFunction分别与SourceFunction、RichSourceFunctio功能类似,只不过它们通过SourceContext发送的数据会自动分发到并行任务中去,也就是说具有并行度的功能。
SourceFunction
它是Flink 提供的基础接口之一,用于定义数据源的行为。它包含一个 run 方法,该方法用于启动数据源,并使用SourceContext来发送数据元素。它中的方法是生命周期很简单的基础方法。
操作步骤:
将自定义的数据源传递给 env.addSource() 方法,并通过 .print() 将数据打印到控制台中。最后调用 env.execute() 方法来启动Flink程序。
RichSourceFunction
如果需要更高级的功能和更丰富的生命周期控制,可以使用RichSourceFunction 类。RichSourceFunction是
SourceFunction接口的子类,它提供了额外的方法和功能,例如初始化、配置和资源管理。
操作步骤:
常见连接器
第三方系统连接器
Flink内置了多种连接器,用于满足大多数的数据收集场景。连接器可以和多种多样的第三方系统进行交互。
Flink官方目前支持以下第三方系统连接器
除Flink官方之外,还有一些其他第三方系统与Flink的连接器,通过Apache Bahir发布:
File Source连接器
从文件读取数据是一种常见方式,比如读取日志文件,这是批处理中最常见的读取方式
flink-connector-files
是Apache Flink的一个连接器
,用于将本地文件系统或远程文件系统中的文件作为数据源或数据接收器使用。
它提供了一种简单的方法来处理文本文件或其他格式的文件,例如CSV、JSON、Avro等,并将其转换为Flink数据流。在使用时,可以指定文件的路径、编码方式和分隔符等参数,并使用适当的转换函数将文件内容解析为Flink的数据类型,然后进行数据处理和分析。
它支持对输出流的写入操作,将Flink数据流中的结果写入到指定的文件中。可以通过配置文件路径、编码方式和文件格式等参数来控制输出文件的格式和内容
添加文件连接器依赖
DataGen Source连接器
Flink提供了一个内置的DataGen连接器,主要用于生成一些随机数,进行流任务的测试以及性能测试
Kafka Source连接器
Flink-connector-kafka就是Flink的一个连接器,它提供了一个简单的方法来将Kafka作为Flink应用程序的数据源或数据接收器使用。
flink-connector-kafka可以帮助Flink应用程序从Kafka主题中读取数据,也可以将Flink的数据流写入到Kafka主题中。在使用时,可以指定Kafka集群的地址、主题名称、消费者组名称等参数,并使用适当的序列化和反序列化工具将数据转换为Flink的数据类型。
Topic、Partition订阅
Kafka Source提供了3 种Topic、Partition的订阅方式:
1.Topic 列表,订阅 Topic 列表中所有Partition的消息:
2.正则表达式匹配,订阅与正则表达式所匹配的Topic下的所有Partition:
3.Partition列表,订阅指定的 Partition:
起始消费位点
Kafka source 能够通过位点初始化器(OffsetsInitializer)来指定从不同的偏移量开始消费 。
如果内置的初始化器不能满足需求,也可以实现自定义的位点初始化器OffsetsInitializer
如果未指定位点初始化器,将默认使用 OffsetsInitializer.earliest()
内置的位点初始化器包括:
动态分区检查
为了在不重启Flink作业的情况下处理Topic扩容或新建Topic等场景,可以将KafkaSource配置为在提供的Topic/Partition订阅模式下定期检查新分区。分区检查功能默认不开启。
事件时间和水印
默认情况下,Kafka Source使用Kafka消息中的时间戳作为事件时间。可以定义自己的水印策略(Watermark Strategy) 以从消息中提取事件时间,并向下游发送水印:
示例
引入Kafka连接器依赖
RabbitMQ Source连接器
添加对RabbitMQ连接器的依赖
1.服务质量 (QoS)
服务质量是一种用于控制数据源连接器如何消费消息的策略。在Flink中,服务质量定义了消费者和消息代理之间的消息传输保证级别。通过合适的服务质量设置,可以实现以下不同的语义保证:
1.精确一次:
保证精确一次需要以下条件
2.至少一次:
在checkpointing开启的条件下,如果没有使用关联标识或者source是并发的,那么source就只能提供至少一次的保证。
3.无任何保证:
如果没有开启checkpointing,source就不能提供任何的数据投递保证。使用这种设置时,source一旦接收到并处理消息,消息就会被自动确认。
2.消费者预取Consumer Prefetch
注意:
默认情况下是不设置prefetch count的,这意味着RabbitMQ服务器将会无限制地向source发送消息。因此在生产环境中,最好要设置它。
prefetch count是对单个channel设置的,并且由于每个并发的source都持有一个connection/channel,因此这个值实际上会乘以 source 的并行度,来表示同一时间可以向这个job总共发送多少条未确认的消息。
使用
setPrefetchCount()
方法用于设置消费者预取值,这里将其设置为 10。这意味着每个消费者在处理完 10 条消息之前不会从 RabbitMQ 队列中获取更多的消息。
以下是保证exactly-once的RabbitMQ source示例
MongoDB Source连接器
Flink 提供了MongoDB 连接器使用至少一次(At-least-once)的语义在 MongoDB collection中读取和写入数据。
要使用此连接器,先添加依赖到项目中:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)