【知识分享】小文件合并设计实现版本
2022-10-27 19:30:24
127次阅读
0个评论
当前设计实现方案:
-
小文件合并时机:在插入表数据后进行 (insert into等)
在插入后会启动一个 InceptorPostCompactTask来完成合并工作。
为了生成一个合理的Operator Tree, 方案借助了一个虚拟的SQL来完成。
假设被插入表是T,那么会使用 insert into T select * from T来生成。
在4040界面会显示一条 insert into T select * from T的SQL。
由于是在插表最后进行合并,因此无论原查表SQL中含有union或者其它语法,都做统一处理。 -
在执行虚拟的SQL时,在TableScan阶段将进行小文件(对应的Spark Partition)合并操作。
这部分的实现参照已有的automerge功能。但合并策略不同。
之后,引擎将按合并的文件输出到新目录(SQL原有执行逻辑未变)。
注意:可能只有部分文件进行了合并存在于新目录。
-
最后将合并的文件替换掉原目录的小文件即可(先移动合并文件,再删小文件)
小文件合并参数及合并策略:
-
共两个参数
a: inceptor.smallfile.automerge 关闭或开启小文件合并功能,默认关闭。 注:当前实现无并发控制,单表同时插入读取会有正确性问题或者读取的Exception,生产不能使用。
b: inceptor.smallfile.mergesize 小文件合并的目标大小(字节数)。 -
合并策略:
综合根据文件类型以及目标大小Target决定实际文件的合并目标大小。
当文件格式为ORC时,直接使用参数大小Target作为结果。
当文件格式为Text表时,使用参数大小Target * 4 作为结果。
合并策略采用贪心,优先将当前文件与最小文件进行合并直到合并到目标大小或无可用文件合并。
0
0