Flink Sql的文件滚动的探究
背景
最近有一次在使用flink sql connector
的过程当中,我们使用flink kafka connector
将kafka
中读取出来的数据存储到hdfs
中,写到hdfs
的connector
是使用flink
自带的filesystem connector
写到hdfs
的文件系统当中。
在实际的使用当中,我们调整了如下参数
开始配置参数
auto-compaction = true
compaction.file-size = 128MB
sink.rolling-policy.file-size=128MB
sink.rolling-policy.rollover-interval = 1h
...
上述配置的预计是想让这个flink connector
自动聚合,然后文件大小为128MB的时候滚动一下,或者在时间为一个小时的时候滚动一下文件。
但是在实践当中我们遇到了以下几个问题:
flink程序输出的文件没有被标记为finshed状态
在程序启动的时候,如果flink程序获取到了数据之后,然后向kafka输入的时候,flink程序生成的文件会有inprogress
的字样。这样的文件会导致下游的程序无法正常的读取。
处理办法
在flink的程序当中,设置flink的checkpoint 当时我们将checkpoint配置后,发现文件能够从`inprogress`的状态,变为`finshed`的状态。
Flink程序太多小文件
在解决了上述的问题之后,我们将flink的checkpoint的间隔时间调整为了10s,后来我们发现flink向hdfs写入的文件目录当中有太多的小文件。
这些文件并没有达到预期设置的阀值。
处理办法
通过查询源代码发现,这个auto-compaction这个参数,配置了之后,输出的文件状态有inprogress的状态变为finshed状态的时候,是checkpoint的控制的。就是每经过一次的checkpoint,就会将这个文件flush掉,然后将这inprogress状态的文件变为finshed的状态。
所以,我门后来取消掉了auto-compaction = true
这个参数,发现文件合并的时候会安照我们预先设计的方案执行。
总结
本次经验分享写得很仓促,关于这块源码部分没有详细介绍。后续有时间的话,会有这方面的补充。如果各位大佬们有什么更好的看法与经验分享,请指点我一下,谢谢~