一、flink 流式读取文件夹、文件
Apache Flink针对文件系统实现了一个可重置的source连接器,将文件看作流来读取数据。如下面的例子所示:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
TextInputFormat textInputFormat = new TextInputFormat(null);
DataStreamSource<String> source = env.readFile(textInputFormat, sourcePath, FileProcessingMode.PROCESS_CONTINUOUSLY, 30000L);
StreamExecutionEnvironment.readFile()接收如下参数:
- FileInputFormat参数,负责读取文件中的内容。
- 文件路径。如果文件路径指向单个文件,那么将会读取这个文件。如果路径指向一个文件夹,FileInputFormat将会扫描文件夹中所有的文件。
- PROCESS_CONTINUOUSLY将会周期性的扫描文件,以便扫描到文件新的改变。
- 30000L表示多久扫描一次监听的文件。
FileInputFormat是一个特定的InputFormat,用来从文件系统中读取文件。FileInputFormat分两步读取文件。首先扫描文件系统的路径,然后为所有匹配到的文件创建所谓的input splits。一个input split将会定义文件上的一个范围,一般通过读取的开始偏移量和读取长度来定义。在将一个大的文件分割成一堆小的splits以后,这些splits可以分发到不同的读任务,这样就可以并行的读取文件了。FileInputFormat的第二步会接收一个input split,读取被split定义的文件范围,然后返回对应的数据。
DataStream应用中使用的FileInputFormat需要实现CheckpointableInputFormat接口。这个接口定义了方法来做检查点和重置文件片段的当前的读取位置。
在Flink 1.7中,Flink提供了一些类,这些类继承了FileInputFormat,并实现了CheckpointableInputFormat接口。TextInputFormat一行一行的读取文件,而CsvInputFormat使用逗号分隔符来读取文件。
二、flink 写入文件系统——StreamFileSink
该Sink不但可以将数据写入到各种文件系统中,而且整合了checkpoint机制来保证Exacly Once语义,还可以对文件进行分桶存储,还支持以列式存储的格式写入,功能更强大。
streamFileSink中输出的文件,其生命周期会经历3中状态:
- in-progress Files 当前文件正在写入中
- Pending Files 当处于 In-progress 状态的文件关闭closed了,就变为 Pending 状态
- Finished Files 在成功的 Checkpoint 后,Pending 状态将变为 Finished 状态
下面是一个简答的例子 , 将接收到的数据流 ,写入到文件中保存 !
数据文件格式是行式存储格式
BucketAssigner<String, String> assigner = new DateTimeBucketAssigner<>("yyyy-MM-dd", ZoneId.of("Asia/Shanghai"));
StreamingFileSink<String> fileSink = StreamingFileSink.<String>forRowFormat(
new Path(savePath),
new SimpleStringEncoder<>("UTF-8"))
.withRollingPolicy(
DefaultRollingPolicy.builder()
.withRolloverInterval(TimeUnit.MINUTES.toMillis(20))//至少包含 20 分钟的数据
.withInactivityInterval(TimeUnit.MINUTES.toMillis(20)

本文介绍了如何在ApacheFlink中使用流式API读取文件夹,以及如何利用StreamFileSink进行文件系统写入,包括ExactlyOnce语义、分桶存储和列式格式。同时,强调了开启Checkpoint以确保写入过程的安全性。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



