前言:
我们在线上跑的MapRed程序和Hive程序,Map数到底怎么控制?这个问题一直比较模糊,这次有机会深入代码里面去看,才了解到其实MapReduce针对不同输入格式有不同的判断文件大小的规则以及文件切片和合并的方式。下面就来具体了解一下FileInputFormat和CompositeInputFormat两种主流输入格式的处理细节。
首先在这里提一下MapReduce框架是默认一个文件Block对应一个Map的输入的,所以在这个背景下才有不同的输入格式自己的有针对性的文件切分或合并方式。
CompositeInputFormat格式:
这个是Hive读取所有Textfile格式的文件是用的默认输入格式:
void
createSplits(Map<String, Set<OneBlockInfo>> nodeToBlocks,
Map<OneBlockInfo, String[]> blockToNodes,
Map<String, List<OneBlockInfo>> rackToBlocks,
long
totLength,
long
maxSize,
long
minSizeNode,
long
minSizeRack,
List<InputSplit> splits
) {
...
if
(maxSize !=
0
&& curSplitSize >= maxSize) {
addCreatedSplit(splits, Collections.singleton(node), validBlocks);
|