string(21) "{"docs":[],"count":0}" array(2) { ["docs"]=> array(0) { } ["count"]=> int(0) } MapReduce框架原理之InputFormat数据输入 - 爱码网

目录

前言

一、FileInputFormat切片机制(默认的切片机制)

1、切片原理

2、切片案例

3、问题与缺点

二、CombineTextInputFormat切片机制

1、切片原理

2、切片案例

总结


前言

我们在指定driver类的main方法向yarn提交任务的时候需要对数据进行切片,数据切片是逻辑上的,并不会对磁盘上的文件进行真正的拆分存储


提示:以下是本篇文章正文内容,下面案例可供参考

一、FileInputFormat切片机制(默认的切片机制)

FileInputFormat是mr中默认的切片机制。

1、切片原理

(1)遍历整个目录,对每个文件进行单独的切片处理。

(2)先拿到文件的大小,文件大小与128M的1.1倍进行比较,也就是与128*1.1=140.8M进行比较,如果文件大小 > 140.8,则以128M将文件切出一片;剩下的继续与140.8进行比较,只要大于就切一片;直到剩余部分小于等于140.8,将其分为一片。

2、切片案例

MapReduce框架原理之InputFormat数据输入

3、问题与缺点

(1)为什么与128M的1.1倍相比较?为了切片均匀,防止生成过小的切片。如果一个文件> 128M,与128M的1.1倍相比较,并且按照128M进行切片那么形成的最小切片>12.8。

(2)默认切片机制的缺点:无论文件多小他都会形成一个切片,启动一个map task。所以FileInputFormat切片机制不适合输入大量小文件。

二、CombineTextInputFormat切片机制

CombineTextInputFormat能够从逻辑上将小文件合并成大文件。

1、切片原理

(1)根据实际情况设置虚拟存储切片最大值:CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 这里设置4m

(2)先形成虚拟的存储,遍历整个目录下的所有文件,依次和setMaxInputSplitSize值相比较(下面简称max)
         文件大小 < max,该文件直接形成一个虚拟存储。
         max < 文件大小 < max*2,把该文件平分成两个虚拟存储。
         max*2 < 文件大小,先形成一个max大小的虚拟存储,剩余的继续循环比较。

(3)根据虚拟存储形成切片,每一个虚拟存储与max比较
         虚拟存储 > max,形成一个切片。
         虚拟存储 < max,和下一个虚拟存储形成一个切片。

2、切片案例

MapReduce框架原理之InputFormat数据输入


总结

如果目录下存在大量小文件我们解决方式有两种:
(1)从源头上解决,将文件合并之后在添加hdfs进行处理
(2)使用CombineTextInputFormat进行处理

相关文章: