问题描述
项目中需要利用Pig MongoLoader将MongoDB里面的数据每日增量备份到hive的外部分区表中,但是在检查hdfs文件发现分区文件夹下产生了大量的小文件/空文件。
原因分析
由于MongoDB表没有设置retention,该表中的数据也没有被定期清理,随着该表的体力不断增多。这样导致mongoloader在计算split数目的时候会根据totalsize产生大量的split。
详见源代码
解决方法
根本pig版本的不同,可以有如下解决方法:
-
版本0.13及以上:
set pig.output.lazy true
-
0.12以下可以配合使用以下设置:
set mongo.input.query {…} set mongo.input.split_size 128 set mongo.input.splits.filter_empty true
-
其他方法:
可以使用进阶的pig编程,比如python包装pig来判断如果为空文件,如果是,则移除(如调用rmf等)。