简单来说,DataSource是指数据来源,也是其字面意思,Flink无论是实时流计算还是批计算都基于数据进行,其数据源是非常重要的一部分,Flink在命名这一方面非常的直白,可以直接从字面意思来理解基本功能。
通常来说source的定义需要使用
StreamExecutionEnvironment.addSource(sourceFunction)
通过上述方法在程序中添加或者定义数据源。
Flink官方定义了非常多的DataSource。如果需要可以直接使用对应的DataSource。
监听一个端口,生成DataSource,并行度为1的DataSource
DataStreamSource nums = env.socketTextStream("localhost", 12800);
一般用于单元测试程序或者调试代码使用,给定一些元素生成一个source。并行度是1的DataSource
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource> dataStream = env.fromElements(new Tuple2(1, 5), new Tuple2(2, 2), new Tuple2(2, 4), new Tuple2(1, 3));
从集合中生成source,集合中的元素必须是相同类型。这是并行度是1的DataSource。
DataStreamSource nums = env.fromCollection(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
从迭代器中生成source,Flink指定的迭代器主要是两种,这是一个并行度为默认并行度的DataSource。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30LqxtPH-1577094589673)(http://note.youdao.com/yws/res/21447/04EA91658CFD472AB853F5094CED6FFB)]
DataStreamSource nums = env.fromParallelCollection(new NumberSequenceIterator(1, 20), TypeInformation.of(Long.TYPE));
DataStreamSource nums = env.fromParallelCollection(new NumberSequenceIterator(2, 20), Long.class);
DataStreamSource nums = env.generateSequence(1, 100);
从文件中读取,指定是text文件格式的文件
DataStreamSource stringDataStreamSource = env.readTextFile("file:///path/to/file");
执行输入文件格式,可以定义fileInputFormat
DataStreamSource stringDataStreamSource = env.readFile(new CsvInputFormat(new Path("file:///path/to/file")) {
@Override
protected String fillRecord(String reuse, Object[] parsedValues) {
return null;
}
}, "file:///path/to/file");
Flink给出了很多DataSource,但是从使用场景来看主要是用于测试比较多,所以大多的DataSource都是需要自定义的,而自定义的主要使用addSource来生成对应的DataSource。
如使用kafkasource:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
Properties prop = new Properties();
prop.setProperty("bootstrap.servers","localhost:9092");
String topic = parameter.get("topic","test");
FlinkKafkaConsumer kafkaConsumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), prop);
kafkaConsumer.setStartFromEarliest();
DataStreamSource source = env.addSource(kafkaConsumer);
Flink 已经给出了很多source,目前支持的:
如果完全自定义DataSource,需要了解sourceFunction,通常使用RichSourceFuction
图片来源:justdojava.com/2019/10/24/flink_learn_datasource/
一张图讲清楚了具体的使用及各个方法的作用。