Flink可以从各种来源获取数据,然后构建DataStream进行转换处理。一般将数据的输入来源称为数据源(data source),而读取数据的算子就是源算子(source operator)。所以,source就是我们整个处理程序的输入端。
通过 StreamExecutionEnvironment 可以访问多种预定义的 stream source
基于文件(过时的):
/*
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-files</artifactId>
<version>${flink.version}</version>
<scope>provided</scope>
</dependency>
*/
//readTextFile(path) - 读取文本文件,例如遵守 TextInputFormat 规范的文件,逐行读取并将它们作为字符串返回。
executionEnvironment.readTextFile("D:\\...\\dataFile.txt");
//readFile(fileInputFormat, path) - 按照指定的文件输入格式读取(一次)文件。
executionEnvironment.readFile(new TextInputFormat(new Path("")),"")
//readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) - 这是前两个方法内部调用的方法。它基于给定的 fileInputFormat 读取路径 path 上的文件。根据提供的 watchType 的不同,source 可能定期(每 interval 毫秒)监控路径上的新数据(watchType 为 FileProcessingMode.PROCESS_CONTINUOUSLY),或者处理一次当前路径中的数据然后退出(watchType 为 FileProcessingMode.PROCESS_ONCE)。使用 pathFilter,用户可以进一步排除正在处理的文件。
基于套接字(常用的):
//socketTextStream - 从套接字读取。元素可以由分隔符分隔。
executionEnvironment.socketTextStream("127.0.0.1",7777)
基于集合(测试使用):
//fromCollection(Collection) - 从 Java Java.util.Collection 创建数据流。集合中的所有元素必须属于同一类型。
executionEnvironment.fromCollection(Arrays.asList("aa", "bb", "cc"));
//fromCollection(Iterator, Class) - 从迭代器创建数据流。class 参数指定迭代器返回元素的数据类型。
executionEnvironment.fromCollection(Arrays.asList("aa", "bb", "cc").listIterator(),String.class);
//fromElements(T ...) - 从给定的对象序列中创建数据流。所有的对象必须属于同一类型。
executionEnvironment.fromElements("aa", "bb");
//fromParallelCollection(SplittableIterator, Class) - 从迭代器并行创建数据流。class 参数指定迭代器返回元素的数据类型。
NumberSequenceIterator numberSequenceIterator = new NumberSequenceIterator(1, 10);
executionEnvironment.fromParallelCollection(numberSequenceIterator, Long.class).print();
//generateSequence(from, to) - 基于给定间隔内的数字序列并行生成数据流。
executionEnvironment.generateSequence(1, 20);
自定义:
//addSource(过时的,1.12之前版本) - 关联一个新的 source function。例如,你可以使用 addSource(new FlinkKafkaConsumer<>(...)) 来从 Apache Kafka 获取数据。更多详细信息见连接器。
executionEnvironment.addSource(new FromElementsFunction<Object>("aa","bb ff","ff mm"));
//fromSource 将数据源添加到环境中以获取数据流。
//读取文件流
final FileSource<String> source = FileSource.forRecordStreamFormat(new TextLineFormat(), new Path("")).build();
final DataStream<String> stream = executionEnvironment.fromSource(source, WatermarkStrategy.noWatermarks(), "file-source");
//从kafka读取流
/*
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-kafka</artifactId>
<version>${flink.version}</version>
</dependency>
*/
KafkaSource<String> kafkaSource = KafkaSource
.<String>builder()
.setBootstrapServers("hadoop115:9092,hadoop116:9092,hadoop117:9092")
.setTopics("topic-events-1")
.setGroupId("test")
.setPartitions(new HashSet<>(5))
.setValueOnlyDeserializer(new SimpleStringSchema())
.setStartingOffsets(OffsetsInitializer.earliest())
.build();
final DataStream<String> stream = executionEnvironment.fromSource(kafkaSource, WatermarkStrategy.noWatermarks(), "file-source");
//从数据生成器读取数据
/*
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-datagen</artifactId>
<version>${flink.version}</version>
</dependency>
*/
DataGeneratorSource<String> dataGeneratorSource =
new DataGeneratorSource<>(
new GeneratorFunction<Long, String>() {
@Override
public String map(Long value) throws Exception {
return "Number:"+value;
}
},
Long.MAX_VALUE,
RateLimiterStrategy.perSecond(10),
Types.STRING
);
final DataStream<String> stream = executionEnvironment
.fromSource(dataGeneratorSource, WatermarkStrategy.noWatermarks(), "datagenerator")
.print();