Mapreduce切片机制

本文详细解析了HDFS中文件切片的工作机制及其重要性。介绍了如何通过配置minsize和maxsize参数来优化切片大小,从而提高mapreduce任务处理效率。

为什么:

一个文件比如由200MB,存储再HDFS上,又按HDFS默认块大小128MB进行切块(block)存储,且每个块(block)备份3份,那么这个文件将被切成2块存储到HDFS上。mapreduce程序相当于HDFS的客户端,每个节点上的mapreduceHDFS拿数据时,如果没有规划好切片大小,导致节点上程序运行,需要从其他节点上拿数据,那么必然经过网络传输,会消耗网络资源,速度慢,那么这样显然不好,所以要好好规划切片。

 

《Mapreduce&yarn工作机制


切片机制原理:

客户端根据用户所配置的minsizemaxsize来规划切片,客户端提交任务后,客户端程序就会调用hdfs的方法,判断需要处理的文件大小,然后再根据用户配置的参数minsizemaxsize,参数解释:

minsize:默认值:1  

   配置参数: mapreduce.input.fileinputformat.split.minsize    

maxsize:默认值:Long.MAXValue  

    配置参数:mapreduce.input.fileinputformat.split.maxsize

blocksize

通过逻辑splitSize = Math.max(minSize, Math.min(maxSize, blockSize))确定切片的大小。

拿到参数后,就按照splitSize对文件进行切割。通过逻辑splitSize = Math.max(minSize, Math.min(maxSize, blockSize))确定切片的大小。

注意:这里由一段逻辑:

while (((double) bytesRemaining)/splitSize > SPLIT_SLOP) {
     int blkIndex = getBlockIndex(blkLocations, length-bytesRemaining);
     splits.add(makeSplit(path, length-bytesRemaining, splitSize,blkLocations[blkIndex].getHosts(),
                  blkLocations[blkIndex].getCachedHosts()));
     bytesRemaining -= splitSize;
}

解释:SPLIT_SLOP = 1.1,即当划分后剩余文件大小除splitSize大于1.1时,循环继续,小于1.1时退出循环,将剩下的文件大小归到一个切片上去。


### 切片大小的配置 在 MapReduce 中,切片(Split)大小是决定 Map 任务并行度和处理效率的重要参数。框架默认的 `TextInputFormat` 会根据文件的大小进行切片划分,并且每个文件至少会被分配一个切片[^3]。切片大小可以通过以下两个关键参数进行控: - **mapreduce.input.fileinputformat.split.minsize**:单个切片的最小大小,默认为1。 - **mapreduce.input.fileinputformat.split.maxsize**:单个切片的最大大小,默认为 `Long.MAX_VALUE`。 客户端程序在提交作业时,会调用 HDFS 的 API 获取输入文件的元数据,并结合用户配置的 `minsize` 和 `maxsize` 来计算切片的数量和大小[^4]。 --- ### 切片大小的作用 切片大小直接影响 Map 任务的数量,进而影响整个作业的性能和资源利用率: 1. **并行度控** 每个切片对应一个 MapTask,因此切片越小,MapTask 越多,理论上可以提高并行度。但过多的 MapTask 会导致调度开销增加,反而降低整体性能。例如,一个 140MB 的文件,在默认情况下(切片大小为 128MB)只会被划分为两个切片,而不是三个,因为框架允许最多 0.1 倍的溢出(即 12.8MB),这样可以避免不必要的 MapTask 数量增加[^2]。 2. **资源利用与性能平衡** 如果切片过大,会导致 MapTask 处理时间过长,资源利用率低;而切片过小,则可能导致大量 MapTask 同时运行,增加 JVM 启动开销和任务调度负担。因此,合理设置切片大小可以在资源利用与性能之间取得平衡。 3. **对小文件的优化影响** 默认机制下,即使是一个非常小的文件(如几 KB),也会被单独作为一个切片处理,导致大量 MapTask 的产生,严重降低效率。这种情况下通常建议使用 `CombineFileInputFormat` 或者将小文件合并后再处理[^3]。 --- ### 如何配置合理的切片大小 为了获得最佳性能,可以根据集群的硬件配置、HDFS 块大小以及作业的数据特征来调整切片大小: ```bash # 示例:设置切片最小为64MB,最大为128MB -D mapreduce.input.fileinputformat.split.minsize=67108864 \ -D mapreduce.input.fileinputformat.split.maxsize=134217728 ``` 此外,还需要考虑以下因素: - **HDFS 块大小**:通常建议将切片大小设置为 HDFS 块大小的整数倍(如 128MB、256MB 等),以减少跨块读取带来的网络开销。 - **压缩文件处理**:如果输入文件是压缩格式(如 GZIP),则无法切分,整个文件作为一个切片处理[^5]。 --- ### 总结 合理配置切片大小对于 MapReduce 作业的性能至关重要。通过调整 `minsize` 和 `maxsize`,可以有效控 MapTask 的数量和负载均衡。同时,应根据实际业务场景优化切片策略,尤其是在处理大量小文件或压缩文件时,需采取相应的优化手段以提升执行效率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值