源码地址,一键下载可用:https://gitee.com/shawsongyue/aurora.git
模块:aurora_flink
主类:FlinkListSourceJob(集合)
1.Source 是Flink程序从中读取其输入数据的地方。你可以用 StreamExecutionEnvironment.addSource(sourceFunction) 将一个 source 关联到你的程序。
2.Flink 自带了许多预先实现的 source functions,不过你仍然可以通过实现 SourceFunction 接口编写自定义的非并行 source。
3.也可以通过实现 ParallelSourceFunction 接口或者继承 RichParallelSourceFunction 类编写自定义的并行 sources。
fromCollection(Collection)函数
从 Java Java.util.Collection 创建数据流。集合中的所有元素必须属于同一类型
fromCollection(Iterator, Class)
从迭代器创建数据流。class 参数指定迭代器返回元素的数据类型。
fromElements(T ...)
从给定的对象序列中创建数据流。所有的对象必须属于同一类型。
注意!使用迭代器的时候对象必须是实现持久化的,否则报错,详情可以看我的另外一篇文章、
错误:org.apache.flink.api.common.InvalidProgramException: java.util.Arrays$ArrayItr@784c3487 is not serializable
fromParallelCollection(SplittableIterator, Class)
从迭代器并行创建数据流。class 参数指定迭代器返回元素的数据类型
generateSequence
基于给定间隔内的数字序列并行生成数据流。
addSource - 关联一个新的 source function。例如,你可以使用 addSource(new FlinkKafkaConsumer<>(...)) 来从 Apache Kafka 获取数据。更多详细信息见连接器。
4.0.0
com.xsy
aurora_flink
1.0-SNAPSHOT
11
3.8.1
UTF-8
UTF-8
1.2.75
2.17.1
1.18.0
2.11
2.17.1
com.alibaba
fastjson
${fastjson.version}
org.apache.flink
flink-java
${flink.version}
org.apache.flink
flink-streaming-scala_2.12
${flink.version}
org.apache.flink
flink-clients
${flink.version}
org.apache.logging.log4j
log4j-slf4j-impl
${log4j.version}
org.apache.logging.log4j
log4j-api
${log4j.version}
org.apache.logging.log4j
log4j-core
${log4j.version}
${project.name}
src/main/resources
src/main/java
**/*.xml
org.apache.maven.plugins
maven-shade-plugin
3.1.1
package
shade
org.apache.flink:force-shading
org.google.code.flindbugs:jar305
org.slf4j:*
org.apache.logging.log4j:*
*:*
META-INF/*.SF
META-INF/*.DSA
META-INF/*.RSA
org.xsy.sevenhee.flink.TestStreamJob
org.springframework.boot
spring-boot-maven-plugin
${spring.boot.version}
true
${project.build.finalName}
repackage
maven-compiler-plugin
${maven.plugin.version}
${java.version}
UTF-8
-parameters
aliyun-repos
https://maven.aliyun.com/nexus/content/groups/public/
false
aliyun-plugin
https://maven.aliyun.com/nexus/content/groups/public/
false
注意:Flink根据集群撇嘴可能会启动多个并行度运行,可能导致数据重复处理,可以通过.setParallelism(1)设置为一个平行度运行即可
package com.aurora.source;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import org.apache.flink.util.NumberSequenceIterator;
import org.apache.flink.util.SplittableIterator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.util.*;
/**
* @description flink的list集合source应用
* @author 浅夏的猫
* @datetime 23:03 2024/1/28
*/
public class FlinkListSourceJob {
private static final Logger logger = LoggerFactory.getLogger(FlinkListSourceJob.class);
public static void main(String[] args) throws Exception {
//1.创建Flink运行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
//2.设置Flink运行模式:
//STREAMING-流模式,BATCH-批模式,AUTOMATIC-自动模式(根据数据源的边界性来决定使用哪种模式)
env.setRuntimeMode(RuntimeExecutionMode.AUTOMATIC);
List list = Arrays.asList("测试", "开发", "运维");
// 01 从集合创建数据流
DataStreamSource dataStreamSource_01 = env.fromCollection(list);
// 02 从迭代器创建数据流,这里直接使用list的迭代器会报错,因为没有ArrayList没有进行持久化,需要深入了解的,可以看我的另外一篇文章
// DataStreamSource dataStreamSource_02 = env.fromCollection(list.iterator(),String.class);
// 03 从给定的对象序列中创建数据流
DataStreamSource dataStreamSource_03 = env.fromElements("测试", "开发", "运维");
// 04 从迭代器并行创建数据流
NumberSequenceIterator splittableIterator = new NumberSequenceIterator(1,10);
DataStreamSource dataStreamSource_04=env.fromParallelCollection(splittableIterator,Long.TYPE);
// 05 基于给定间隔内的数字序列并行生成数据流
DataStreamSource dataStreamSource_05 = env.generateSequence(1, 10);
//自定义数据流
DataStreamSource dataStreamSource_06 = env.addSource(new SourceFunction() {
@Override
public void run(SourceContext sourceContext) throws Exception {
//自定义你自己的数据来源
for (int i = 0; i < 10; i++) {
sourceContext.collect("测试数据" + i);
}
}
@Override
public void cancel() {
}
});
//5.输出打印
dataStreamSource_01.print();
// dataStreamSource_02.print();
dataStreamSource_03.print();
dataStreamSource_04.print();
dataStreamSource_05.print();
dataStreamSource_06.print();
//6.启动运行
env.execute();
}
}