Map Reduce算法不适用于文件的物理块。它适用于逻辑输入拆分。输入拆分取决于记录的写入位置。一条记录可能跨越两个映射器。
HDFS的设置方式是将非常大的文件分解为大块(例如,测量 128MB),并将这些块的三个副本存储在集群的不同节点上。
HDFS 不知道这些文件的内容。一条记录可能已在Block-a中开始,但该记录的结尾可能出现在Block-b中。
为了解决这个问题,Hadoop 使用存储在文件块中的数据的逻辑表示,称为输入拆分。当 MapReduce 作业客户端计算输入拆分时,它会计算出块中第一条完整记录的开始位置和块中最后一条记录的结束位置。
关键点:
如果块中的最后一条记录不完整,则输入拆分包括下一个块的位置信息和完成记录所需的数据的字节偏移量。
看看下面的图表。

看看这篇文章和相关的 SE 问题:关于 Hadoop/HDFS 文件拆分
可以从文档中阅读更多详细信息
Map-Reduce 框架依赖作业的 InputFormat 来:
- 验证作业的输入规范。
- 将输入文件拆分为逻辑 InputSplits,然后将每个输入文件分配给单独的 Mapper。
- 然后将每个 InputSplit 分配给一个单独的 Mapper 进行处理。Split 可以是 tuple。
InputSplit[] getSplits(JobConf job,int numSplits) 是处理这些事情的 API。
FileInputFormat,它扩展了InputFormat实现的getSplits() 方法。在grepcode中查看此方法的内部结构