解决方案:
小文件进行合并不是map数越多越好。比如:一个任务有很多小文件(远远小于块大小128m),则每个小文件也会被当做一个块,用一个map任务来完成,而一个map任务启动和初始化的时间远远大于业务处理的时间,就会造成很大的资源浪费。而且,同时可执行的map数是受限的。
系统默认的格式CombineHiveInputFormat具有对小文件进行合并的功能。 hive-site.xml:
hive.input.format
org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
在map执行前合并小文件,减少map数:
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
复杂文件增加Map数
比如有一个127m的文件,正常会用一个map去完成,但这个文件只有一个或者两个小字段,却有几千万的记录,如果map处理的逻辑比较复杂,用一个map任务去做,肯定也比较耗时。 当input的文件都很大,任务逻辑复杂,map执行非常慢的时候,可以考虑增加Map数,来使得每个map处理的数据量减少,从而提高任务的执行效率。 通过设置最大切片值来改变map数。
reduce个数默认是-1,可以在hadoop的mapred-default.xml文件中,设置每个job的Reduce个数。
set mapreduce.job.reduces = 15;