Java大数据开发(三)Hadoop(19)-CombineTextInputFormat小文件切片

2021年11月21日 阅读数:6
这篇文章主要向大家介绍Java大数据开发(三)Hadoop(19)-CombineTextInputFormat小文件切片,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。
导读:上一节咱们讲了FileInputFormat切片机制,本节继续探求切片机制-   CombineTextInputFormat 切片机制


框架默认的TextInputFormat切片机制是对任务按文件规划切片,无论文件多小,都会是一个单独的切片,都会交给一个MapTask,这样若是有大量小文件,就会产生大量的MapTask,好比有一个2m的文件,可是默认分片仍是128m,处理效率极其低下。java


一、应用场景:swift


CombineTextInputFormat用于小文件过多的场景,它能够将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就能够交给一个MapTask处理,就不至于每一个小文件规划大的切片了。微信


二、虚拟存储切片最大值设置app


CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m框架

注意:虚拟存储切片最大值设置最好根据实际的小文件大小状况来设置具体的值。测试


三、切片机制大数据


生成切片过程包括:虚拟存储过程和切片过程二部分。spa



虚拟存储过程:.net


获取输入目录下全部文件大小,依次和代码中设置的setMaxInputSplitSize值作比较,若是不大于设置的最大值,逻辑上划分一个切片。若是输入文件大于设置的最大值且大于两倍,那么以最大值切割一块切片;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分红2个虚拟存储块(防止出现过小切片)。code


例如setMaxInputSplitSize值为5M,输入文件大小为10.02M,则先逻辑上分红一个5M。剩余的大小为5.02M,若是按照5M逻辑划分,就会出现0.02M的小的虚拟存储文件,因此将剩余的5.02M文件切分红(2.51M和2.51M)两个文件。


切片过程:


(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)


(d)  最终会造成3个切片,大小分别为:1.7+2.55M,2.55+3.4M,3.4+3.4M


CombineTextInputFormat案例实操


1.需求


将输入的大量小文件合并成一个切片统一处理。


(1)输入数据


准备4个小文件


(2)指望


指望一个切片处理4个文件


2.实现过程


(1)不作任何处理,运行WordCount案例程序,观察切片个数为4。

 

(2)在WordcountDriver中增长以下代码,运行程序并观察运行的切片个数为3。


(a)驱动类中添加代码以下:


// 若是不设置InputFormat,它默认用的是TextInputFormat.classjob.setInputFormatClass(CombineTextInputFormat.class);//虚拟存储切片最大值设置4mCombineTextInputFormat.setMaxInputSplitSize(job, 4194304);


(b)运行结果为3个切片。

 

(3)在WordcountDriver中增长以下代码,运行程序并观察运行的切片个数为1。


(a)驱动中添加代码以下:


// 若是不设置InputFormat,它默认用的是TextInputFormat.classjob.setInputFormatClass(CombineTextInputFormat.class);
//虚拟存储切片最大值设置20mCombineTextInputFormat.setMaxInputSplitSize(job, 20971520);


(b)运行为1个切片。


关注「跟我一块儿学大数据」

跟我一块儿学大数据

本文分享自微信公众号 - 跟我一块儿学大数据(java_big_data)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。