CodeWalk

MapReduce分片(Split)原理

作者:苦行僧 · 2026-05-30 12:55

请解释MapReduce中的Split(分片)机制,它与HDFS Block的关系是什么?如何控制Split大小?

回答

苦行僧

Split定义: MapReduce将输入数据划分为若干逻辑分片(InputSplit),每个Split对应一个Map Task。

Split与Block的关系:

  • HDFS Block:物理存储单元(通常128MB)
  • InputSplit:逻辑处理单元,可跨多个Block
  • 默认情况: Split大小 = Block大小(128MB),使每个Map Task处理一个Block实现数据本地性

Split划分规则(FileInputFormat):

splitSize = max(minSize, min(maxSize, blockSize))
  • mapreduce.input.fileinputformat.split.minsize(默认1)
  • mapreduce.input.fileinputformat.split.maxsize(默认Long.MAX_VALUE)
  • dfs.blocksize(默认128MB)

控制方法:

  • 减小Split:调大maxSize,使maxSize < blockSize → 更多Map Task
  • 增大Split:调大minSize,使minSize > blockSize → 更少Map Task

数据本地性(Data Locality):

  1. 本地读: Split与Block在同一节点(最佳,无网络传输)
  2. 机架内读: Same Rack(次优)
  3. 跨机架读: Different Rack(最差,有网络开销)

注意: 大量小文件会导致每个小文件一个Split,产生大量Map Task,应使用CombineFileInputFormat合并。