切片机制
FileInputFormat中默认的切片机制
切片的大小=块的大小=128M(如果程序运行在本地则是32M)
切片的标准是看文件大的小是达到块大小的1.1倍(140.8M),如果达到则按128M进行切片,如果没达到,则其本身就是一个切片。切完第一片剩下的数据在进行比较,如果达到块大小的1.1被,依然按照128M切片,不够则本身为一个切片,以此类推。
CombineTextInputFormat切片机制
关于大量小文件的优化策略:
默认情况下FileInputformat对任务的切片机制是按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个maptask,这样如果有大量小文件,就会产生大量的maptask,处理效率极其低下。
CombineTextInputFormat切片机制
先设置一个文件切片的最大值
job.setInputFormatClass(CombineTextInputFormat.class);//设置 CombineTextInputFormat切片机制
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304); //设置为4M
1虚拟存储过程:(不会切片)
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块。当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)
例如:设置的最大值为4,一个文件的大小如果小于4,则本身就为一块,如果大于4的2倍(8),则按照设置的最大值4M存储,如果文件大于4小于8,则存储为两个相等大小文件
文件大小 < 4 不动
8 > 文件大小 > 4 平分成两份
文件>8 按设置的最大值(4)存储
2切片过程:
(a)判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个
切片。
(b)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
(c)测试举例:有4个小文件大小分别为1.7M、5.1M、3.4M以及6.8M这四个小文件,则虚拟存
储之后形成6个文件块,大小分别为:
1.7M,(2.55M、2.55M),3.4M以及(3.4M、3.4M)
最终会形成3个切片,大小分别为:
(1.7+2.55)M,(2.55+3.4)M,(3.4+3.4)M