一、Flink 已实现的Source
https://nightlies.apache.org/flink/flink-docs-release-1.15/docs/connectors/datastream/overview/
二、Flink 自定义Source
2.1、单并行度Source
1、实现代码(1秒生成一条数据)
package com.hpsk.flink.source;
import org.apache.flink.streaming.api.functions.source.SourceFunction;
import java.util.Random;
public class MySource implements SourceFunction<String> {
private boolean isRunning = true;
private Long flag = 1L;
@Override
public void run(SourceContext<String> ctx) throws Exception {
Random random = new Random();
while (isRunning) {
ctx.collect( flag + " " + random.nextInt(999));
Thread.sleep(1000);
flag ++;
}
}
@Override
public void cancel() {
isRunning = false;
}
}
2、 调用代码
package com.hpsk.flink.stream;
import com.hpsk.flink.source.MyParallelSource;
import com.hpsk.flink.source.MyRichParallelSource;
import com.hpsk.flink.source.MySource;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class SourceFunStream {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> inputDS = env.addSource(new MySource());
// DataStreamSource<String> inputDS = env.addSource(new MyParallelSource());
// DataStreamSource<String> inputDS = env.addSource(new MyRichParallelSource());
inputDS.print(env.getParallelism() + ">>");
env.execute();
}
}
3、 执行结果
2.2、多并行度Source
1、 实现代码(1秒生成一条数据)
package com.hpsk.flink.source;
import org.apache.flink.streaming.api.functions.source.ParallelSourceFunction;
import java.util.Random;
public class MyParallelSource implements ParallelSourceFunction<String> {
private boolean isRunning = true;
private Long flag = 1L;
@Override
public void run(SourceContext<String> ctx) throws Exception {
Random random = new Random();
while (isRunning) {
ctx.collect( flag + " " + random.nextInt(999));
Thread.sleep(1000);
flag ++;
}
}
@Override
public void cancel() {
isRunning = false;
}
}
2、调用代码
package com.hpsk.flink.stream;
import com.hpsk.flink.source.MyParallelSource;
import com.hpsk.flink.source.MyRichParallelSource;
import com.hpsk.flink.source.MySource;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class SourceFunStream {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// DataStreamSource<String> inputDS = env.addSource(new MySource());
DataStreamSource<String> inputDS = env.addSource(new MyParallelSource());
// DataStreamSource<String> inputDS = env.addSource(new MyRichParallelSource());
inputDS.print(env.getParallelism() + ">>");
env.execute();
}
}
3、 执行结果
2.3、富文本多并行度Source
RichParallelSourceFunction
1、继承了AbstractRichFunction
2、实现了ParallelSourceFunction
RichParallelSourceFunction提供了外部连接的open和close方法以及运行时的getRuntimeContext等方法
1、实现代码(1秒生成一条数据)
package com.hpsk.flink.source;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.source.RichParallelSourceFunction;
import java.util.Random;
public class MyRichParallelSource extends RichParallelSourceFunction<String> {
private boolean isRunning = true;
private Long flag = 1L;
@Override
public void run(SourceContext<String> ctx) throws Exception {
Random random = new Random();
while (isRunning) {
ctx.collect( flag + " " + random.nextInt(999));
Thread.sleep(1000);
flag ++;
}
}
@Override
public void cancel() {
isRunning = false;
}
@Override
public void open(Configuration parameters) throws Exception {
System.out.println("连接资源.....");
}
@Override
public void close() throws Exception {
System.out.println("关闭资源.....");
}
}
2、 调用代码
package com.hpsk.flink.stream;
import com.hpsk.flink.source.MyParallelSource;
import com.hpsk.flink.source.MyRichParallelSource;
import com.hpsk.flink.source.MySource;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
public class SourceFunStream {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// DataStreamSource<String> inputDS = env.addSource(new MySource());
// DataStreamSource<String> inputDS = env.addSource(new MyParallelSource());
DataStreamSource<String> inputDS = env.addSource(new MyRichParallelSource());
inputDS.print(env.getParallelism() + ">>");
env.execute();
}
}
3、执行结果