MapReduce分片(Split)原理
请解释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):
- 本地读: Split与Block在同一节点(最佳,无网络传输)
- 机架内读: Same Rack(次优)
- 跨机架读: Different Rack(最差,有网络开销)
注意: 大量小文件会导致每个小文件一个Split,产生大量Map Task,应使用CombineFileInputFormat合并。