Hadoop本身提供了map-reduce分布式计算框架,将大文件切块存储、计算,分而治之。在map-reduce框架中,输入数据被划分成等长的小数据块,称为输入分片(input split)。 每个输入分片均会构建一个map任务以处理分片中的每条记录,排过序的处理结果通过网络传输发送到运行reduce任务的节点。 reduce任务节点在复制完所有map输出后,将其按照排序顺序合并。 最后,reduce任务通过运行用户自定义的reduce函数以完成MapReduce作业。
mapper的数量
Hadoop采用“数据本地化优化”的策略,使得map端任务到达最佳性能。 在application master为每个分片创建map作业的过程中,MapReduce框架优先选择存储有输入数据的节点来执行map任务。
如果所有存储该分片数据的节点都在执行map任务时,作业调度会尝试从数据块所在机架上的其他节点寻找空闲的map槽, 只有当无法在当前机架运行map任务时才在其他机架创建map作业。 因为同一个机架上的两个数据节点之间的数据传输,比跨机架的数据传输有着更高的带宽和更低的延迟响应。
此外,因为对任务的分配,初始化数据和数据输出,这个过程比较耗费时间。会出现启动任务花费的时间在整个任务作业的执行中占的时间比较大的情况,这会影响任务的执行效率,因此建议map任务的运行时间最好能在一分钟以上。 但是,和reducer不一样,不能调节mapper的运行时间,只能通过设定分片的大小间接调整mapper的个数。
MapReduce框架的输入数据分片是由InputFormat接口来完成的。FileInputFormat提供了三个属性参数来控制实际的分片大小:
- mapreduce.input.fileinputf