hadoop集羣的小文件过多是一个棘手的问题,过多的小文件作为输入的时候,会导致集羣一下启动了太多的map,浪费了集羣资源,同时可能会阻塞其他的任务执行。hadoop提供了一种多文件输入的方法CombineInputFormat,可以将过多的小文件合并为若干个期望大小的大文件作为输入,这样启动的map数目会比较合适。
但是CombineInputFormat合并的策略比较糟糕,按照文件输入的顺序依次相加,在有些情况下,合并的文件仍然大小不一,使得个别的map处理的数据仍然较大,需要一种更好的,更加合理的合并策略。
数学问题如下:
跟定一组数字,n1,n2,n3…….和给定一个相对较大的数字N,将数字组分成m组,每组内的数字之和小于N,找到这种分组方法,并且m达到最小值。
经过在水木上咨询,这个问题是一个NP难问题。。。。
只能用一个近似算法:
首先将所有的文件排序,最大的放在前面,顺序相加文件,直到文件的大小之和大于N以后,然后在从最小的文件开始相加,知道不能添加更多的文件。依次类推,这样能够得到一个相对较好的结果。