MapReduce切片与文件输入格式

MapReduce切片

MapReduce的并行度决定了Map阶段任务的并发度,但是MapTask的并行任务并不是越多越好。MapTask的并行度由切片数量决定,切片是MapReduce程序输入数据的单位,一个切片会对应一个MapTask。数据切片只是逻辑上对输入进行分片处理,不会在磁盘上对其切分成片进行处理。

FileInputFormat切片源码解析

  1. 找到数据存储的目录,遍历每一个文件
  2. 获取文件大小
  3. 计算切片大小:computeSplitSize()方法,计算公式为Max(minSize,min(maxSize, blockSize)) = blockSize,所以默认是block大小,要调整切片大小,可以修改maxSize和minSize,比如将maxSize调到比blockSize小,则切片大小比blockSize小,将minSize调到比blockSize大,则切片大小比blockSize大。
  4. 按照切片大小进行切片,每次切片时,都会片段剩下的文件是否大于切片的1.1倍,如果不大于则在一个切片中
  5. 将切片信息写到一个切片规划文件中,整个切片的核心过程在getSplit()方法中完成
  6. InputSplit只记录了切片的元数据信息,比如起始位置、长度和所在的节点等。
  7. 提交切片规划文件到YARN上,YARN上的MrAppMaster根据切片规划文件计算出开启的MapTask的个数

获取切片信息的API:

TextInputFormat

FileInputFormat的常见实现接口:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat。其中TextInputFormatFileInputFormat的默认实现,key是LongWritable类型,代表该行的起始字节偏移量,value是Text类型,代表该行内容。其他的实现也是见名知义,比如KeyValueTextInputFormat的key和value都是Text类型,每行按照某个指定的分隔符切割为key-value键值对的形式,NLineInputFormat与TextInputFormat类似,只不过可以一次读取多行,CombineTextInputFormat则可以一次读取多个文件,用于处理多个小文件的场景,可以将多个小文件放在一个逻辑切片中,提高效率。

CombineTextInputFormat

CombineTextInputFormat的最大切片设置:CombineTextInputFormat.setMaxInputSplitSize(job, 4194304),即4M,但这并不意味着每个切片的最大大小真的就是4M,这涉及到一个虚拟存储的概念,即遇到一个大于4M的文件时,将其分为n份,使得每份小于4M,然后按照字典序排列依次相加,直到遇到大于4M则放入同一个切片中:

设置输出格式为CombineTextInputFormat:​​​​​​​

// 如果不设置InputFormatClass,则默认为TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);
// 设置切片最大值
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值