今天看hadoop的JobClient的源码,在JobClient的init(JobConfig)函数中当mapred.job.tracker的值为默认值或者"local"时,将JobConfig的mapred.map.tasks设置为了1。觉得是不是太武断了点,不过在看JobConfig.setNumMapTasks(int)的注释时发现是这样说的:
这个MapTask数量的值设置只是对hadoop框架的提示,并不起决定作用。
实际上map task的数量依赖于InputFormat的getSplits生成的InputSplit的数量。因此经常使用定制的InputFormat来准确的控制map task的数目。换句话说map的数目依赖于输入的总大小(输入的block数)。基于文件的InputFormat的主要功能就是根据输入文件的总大小将它切分为逻辑上的InputSplit。对于分块的大小,输入文件所在的文件系统的块大小是其上限,下限可以通过mapred.min.split.size来设置。因此如果有10TB的数据且块大小为128M,那么将会产生82000(我算的是81920)个map除非setNumMapTasks(int)设置得更多。(problem:如果map数设为了90000,那么多出来的map干什么了?没有数据了啊!难道什么都不做,待进一步分析)
对于一个合理的并行程度每个节点的map数量应该大约在10-100个(对于不太消耗cpu的map task 可以有300个)。需要注意的是Task的建立是需要时间的,因此在并行度许可的情况下应该使用尽量少的map来运行。
TaskSplitMetaInfo[] splits = createSplits(jobId);
if (numMapTasks != splits.length) {
throw new IOException("Number of maps in JobConf doesn't match number of " +
"recieved splits for job " + jobId + "! " +
"numMapTasks=" + numMapTasks + ", #splits=" + splits.length);
}
numMapTasks = splits.length;
这样看来map的数量与JobConfig的mapred.map.tasks的值没有关系,依据的是split的数目
分享到:
相关推荐
### Hadoop MapTask辅助类源代码分析 #### 一、概述 Hadoop作为一个分布式计算框架,其核心组件之一是MapReduce。MapReduce负责处理大规模数据集的并行运算任务,而MapTask作为MapReduce的核心组成部分之一,其...
在Hadoop中,MapTask是MapReduce框架的关键组件,负责执行Mapper阶段的工作。MapTask辅助类,特别是MapOutputBuffer,是Mapper输出数据管理的核心部分。本文将继续深入分析MapOutputBuffer的内部实现,以便理解...
当某些 Task 运行缓慢时,Hadoop 可以启动额外的 Task 实例来尝试替换它们。这有助于减少整体作业时间,但也可能浪费资源。因此,合理配置推测执行阈值是必要的。 8. **Shuffle阶段优化**: 优化 Shuffle 阶段的...
- **Merge过程**:MapTask结束后,所有溢写文件会被合并成一个文件,`io.sort.factor`参数控制合并时的最大并行流数量,影响磁盘读写次数。 2. **Combiner优化** - **min.num.spill.for.combine**:当spill文件...
一个TaskTracker可以有多个mapslot和reduceslot,具体数量由参数mapred.tasktracker.[map|reduce].tasks.maximum配置。这些slot资源被调度器用来分配给不同作业中的任务。 Hadoop的三级调度策略包括:队列、作业和...
**MapTask并行度**:MapTask的数量由InputFormat切片机制决定,直接影响作业的并行度和效率。适当的切片大小能最大化并行度,避免过多的磁盘I/O。 **ReduceTask运行流程:** 1. **数据拷贝**:Reduce进程启动数据...
- **任务初始化**:JobTracker根据作业配置文件中的信息,计算出所需的MapTask和ReduceTask的数量,并为每个任务分配初始状态。 - **任务分配**:根据TaskTracker的心跳消息,JobTracker会了解各个节点的资源状况,...
若输入数据量巨大,过多的Map Task会增加网络传输负担,对Job Tracker造成压力。可以通过调整**mapred.min.split.size**来控制Split的最小大小,从而影响Map任务的数量。 5. **mapred.compress.map.output**:启用...
默认情况下,每个Map Task处理一个Block的数据,小文件会导致大量Map Task的生成,每个Task都需要消耗一定的资源。这不仅增加了Job的启动时间和计算成本,还可能导致整体处理速度大幅下降。 为了解决这些问题,...
通过理解这些源码细节,我们可以更好地掌握Hadoop作业的生命周期,从Job提交到MapTask和ReduceTask的执行,这对于优化大数据处理性能和调试Hadoop应用程序至关重要。这些深入的源码分析对于开发人员和系统管理员来说...
总结来说,Hadoop的排序机制是通过MapTask和ReduceTask的组合操作实现的,而自定义排序则需要实现WritableComparable接口并重写compareTo方法。这种灵活性使得用户可以根据具体业务需求对数据进行复杂排序,从而优化...
MapTask阶段shuffle源码分析是Hadoop MapReduce框架中一个重要的组件,它负责将Mapper的输出数据进行分区、排序和缓存,以便于后续的Reduce任务处理。在本文中,我们将深入探讨MapTask阶段shuffle源码分析的实现机制...
这篇博客“Hadoop配置文件表”虽然没有提供详细的描述,但从标题我们可以推断,它可能包含了关于Hadoop系统中各种配置文件的详细信息。这些配置文件对于理解和优化Hadoop集群的性能至关重要。 Hadoop的核心组件主要...
- 切片的大小会影响MapTask的数量,进而影响整个作业的性能。 以上内容涵盖了Hadoop的基本概念、运行模式、生态系统组件、集群运行的关键进程以及数据处理中的序列化和切片机制,这些都是面试中常见的问题,理解和...
尤其是当任务数量巨大时,Hadoop系统中的Java虚拟机(JVM)在节点内存管理方面显得不够高效。由于Java的垃圾回收(Garbage Collection, GC)机制,当达到某个阈值后才回收内存,这导致在多JVM并行运行的情况下,内存管理...
- Map Task Capacity:Map任务的总处理能力。 - Reduce Task Capacity:Reduce任务的总处理能力。 - Queue Name:任务队列的名称,用于资源分配。 10. 启动一个DataNode的步骤: - 首先确保Hadoop环境已经正确...
9. **MapReduce优化**:源代码分析可以帮助我们了解如何优化MapReduce作业,例如减少数据 shuffle、提高数据本地化、调整Task数量等。 10. **实战应用**:理解Hadoop源代码对于实际项目中的问题排查、性能调优具有...
这个“Hadoop配置文档”涵盖了关于如何设置和优化Hadoop环境的关键知识点。在深入探讨之前,我们需要明确Hadoop的基本架构,它主要由Hadoop Distributed File System (HDFS) 和 MapReduce 两大部分组成。 1. **...
- `mapreduce.task.io.sort.mb` 和 `mapreduce.task.io.sort.factor`: 控制排序阶段使用的内存以及可以同时进行排序的数据分区数量。 - `mapreduce.reduce.shuffle.parallelcopies` 和 `mapreduce.reduce.shuffle....