Flink学习 - 5. Flink之DataSource

  • DataSource
  • Flink自带的DataSource
  • socket
  • 给定元素
  • 基于集合
  • 文件生成
  • 自定义DataSource
  • RichSourceFunction


DataSource

简单来说,DataSource是指数据来源,也是其字面意思,Flink无论是实时流计算还是批计算都基于数据进行,其数据源是非常重要的一部分,Flink在命名这一方面非常的直白,可以直接从字面意思来理解基本功能。

通常来说source的定义需要使用

StreamExecutionEnvironment.addSource(sourceFunction)

通过上述方法在程序中添加或者定义数据源。

Flink自带的DataSource

Flink官方定义了非常多的DataSource。如果需要可以直接使用对应的DataSource。

flink实时数仓架构 flink datasource_自定义


flink实时数仓架构 flink datasource_并行度_02

socket

  1. socketTextStream

监听一个端口,生成DataSource,并行度为1的DataSource

DataStreamSource<String> nums = env.socketTextStream("localhost", 12800);

给定元素

  1. fromElements()

一般用于单元测试程序或者调试代码使用,给定一些元素生成一个source。并行度是1的DataSource

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStreamSource<Tuple2<Integer, Integer>> dataStream = env.fromElements(new Tuple2<Integer, Integer>(1, 5), new Tuple2<Integer, Integer>(2, 2), new Tuple2<Integer, Integer>(2, 4), new Tuple2<Integer, Integer>(1, 3));

基于集合

  1. fromCollection

从集合中生成source,集合中的元素必须是相同类型。这是并行度是1的DataSource。

DataStreamSource<Integer> nums = env.fromCollection(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
  1. fromParallelCollection

从迭代器中生成source,Flink指定的迭代器主要是两种,这是一个并行度为默认并行度的DataSource。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30LqxtPH-1577094589673)(http://note.youdao.com/yws/res/21447/04EA91658CFD472AB853F5094CED6FFB)]

DataStreamSource<Long> nums = env.fromParallelCollection(new NumberSequenceIterator(1, 20), TypeInformation.of(Long.TYPE));

DataStreamSource<Long> nums = env.fromParallelCollection(new NumberSequenceIterator(2, 20), Long.class);
  1. generateSequence
    从一个区间范围内的的数字生成DataSource,这是一个并行度为默认并行度的DataSource。
DataStreamSource<Long> nums = env.generateSequence(1, 100);

文件生成

  1. readTextFile

从文件中读取,指定是text文件格式的文件

DataStreamSource<String> stringDataStreamSource = env.readTextFile("file:///path/to/file");
  1. readFile

执行输入文件格式,可以定义fileInputFormat

DataStreamSource<String> stringDataStreamSource = env.readFile(new CsvInputFormat<String>(new Path("file:///path/to/file")) {
            @Override
            protected String fillRecord(String reuse, Object[] parsedValues) {
                return null;
            }
        }, "file:///path/to/file");

自定义DataSource

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<String> kafkaConsumer = new FlinkKafkaConsumer<>(topic, new SimpleStringSchema(), prop);

kafkaConsumer.setStartFromEarliest();

DataStreamSource<String> source = env.addSource(kafkaConsumer);

Flink 已经给出了很多source,目前支持的:

flink实时数仓架构 flink datasource_flink_03

如果完全自定义DataSource,需要了解sourceFunction,通常使用RichSourceFuction

RichSourceFunction

图片来源:justdojava.com/2019/10/24/flink_learn_datasource/

一张图讲清楚了具体的使用及各个方法的作用。

flink实时数仓架构 flink datasource_kafka_04