基本摘自网上给自己做一记录,如有错误请斧正
CombineFileInputFormat是一个抽象类。Hadoop提供了两个实现类CombineTextInputFormat和CombineSequenceFileInputFormat。
其继承关系如下:
InputFormat
--->FileInputFormat
------>CombineFileInputFormat
CombineTextInputFormat的使用:
仅输入一个文件路径时:
//指定输入格式CombineFileInputFormat job.setInputFormatClass(CombineTextInputFormat.class); //指定SplitSize CombineTextInputFormat.setMaxInputSplitSize(job, 60*1024*1024L); //指定输入路径 CombineTextInputFormat.addInputPath(job, new Path(args[0]));
对于多路径输入:多次调用,加载不同路径
//指定输入格式CombineFileInputFormat job.setInputFormatClass(CombineTextInputFormat.class); //指定SplitSize CombineTextInputFormat.setMaxInputSplitSize(job, 128*1024*1024L); //指定输入路径 CombineTextInputFormat.addInputPath(job, new Path(args[0])); CombineTextInputFormat.addInputPath(job, new Path(args[1]));
一次调用,同时加载多路径(字符串用逗号隔开):
//这种方式的第二个参数只能是:将路径以逗号拼接的字符串 FileInputFormat.addInputPaths(job,"hdfs://mine:9000/orc/can,hdfs://mine:9000/orc/gps");
多路径不同类型输入:
//指定SplitSize CombineTextInputFormat.setMaxInputSplitSize(job, 128*1024*1024L); //指定输入路径,以及指定输入格式 MultipleInputs.addInputPath(job, new Path(args[0]), CombineTextInputFormat.class); MultipleInputs.addInputPath(job, new Path(args[1]), CombineSequenceFileInputFormat.class);
以上两种多路径输入方式处理切割:
CombineTextInputFormat 是先把所有的输入集中起来求出总的输入大小,再除以SplitSize算出总的map个数
MultipleInputs 是先分别算出每个MultipleInputs路径对应的map个数,再对两个MultipleInputs的map个数求和
CombineFileInputFormat的使用:
常用属性值:
1.文件指定切片大小的最大值, CombineFileInputFormat.setMaxInputSplitSize()方法进行设置【不设置,则所有输入只启动一个map任务】;
2.同一节点的数据块形成切片时,切片大小的最小值,CombineFileInputFormat.setMinSplitSizeNode()方法进行设置;
3.同一机架的数据块形成切片时,切片大小的最小值,CombineFileInputFormat.setMinSplitSizeRack()方法进行设置
注意:
1)、文件切割最小值默认是1,最大值默认是long的最大值,这个不用设置最小值即可;
2)、存在关系:文件切割数> 同一个节点文件个数最小值 > 同一个机架上的文件个数最小值
切片的形成过程:
第一个过程: 不断迭代节点列表,逐个节点形成切片(Local Split)
a. 如果maxSplitSize == 0,则整个节点上的Block数据形成一个切片
b. 如果maxSplitSize != 0,遍历并累加每个节点上的数据块,如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小 < maxSplitSize 。则进行下一步
a. 遍历并累加这个机架上所有节点的数据块 (这些数据块即上一步遗留下来的数据块),如果累加数据块大小 >= maxSplitSize,则将这些数据块形成一个切片。继续该过程,直到剩余数据块累加大小<maxSplitSize。则进行下一步
b. 如果剩余数据块累加大小 >= minSplitSizeRack,则将这些剩余数据块形成一个切片。如果剩余数据块累加大小 < minSplitSizeRack,则这些数据块留待后续处理
总结记录:1.节点先内部进行文件大小判断切割,再节点判断切割,2.机架内部进行文件大小判断切割,再机架判断切割