Hive常作为Hadoop的后台批处理数据库,其稳定性和高吞吐量毋容置疑。
然而在使用中经常遇到的问题就是产生大量的小文件,当小文件数量积累到一定程度时,会渐渐拖慢系统,乃至崩溃。
小文件过多为什么会拖慢系统呢?
HIVE作为分布式文件系统,在处理文件时,首先要把文件数据读到内存中,此时每读取一个文件入内存,就会开启一个IO Task,当小文件过多时候,读取数据时就会开启大量task
在hadoop系统中,开启文件的数量有上线的,我是用的是CDH系统,其默认开启是4096个文件,当然这远远不够,我现在配置是开启65000个文件。当开启task超过这个数量是,
再读取更多数据,就会处于等待,这时候系统就会越来越慢,为了保证系统的健康稳定,就需要定期合并小文件。
我合并小文件的思路很简单。
就是通过java job 连接Hive来执行下面SQL语句。就是将数据从表中抽出,在重新写回原表。
insert overwrite table table_name select * from table_name;
当然如果是分区表,则需要循环分区字段进行处理。
insert overwrite table table_name partition(partitionfield='${value}'
select * from table_name where partitionfield='${value}'