MapReducec执行过程分几个阶段

本文详细解析了MapReduce的运行机制,包括split、map、shuffle、reduce四个关键阶段,阐述了如何通过调整参数优化MapReduce任务。

宏观上MapReduce可以分为以下三个阶段,如下图1所示。
阶段1:input/map/partition/sort/spill
阶段2:mapper端merge
阶段3:reducer端merge/reduce/output

 

 

 

1、split阶段:

此阶段,每个输入文件被分片输入到map。如一个文件有200M,默认会被分成2片,因为每片的默认最大值和每块的默认值128M相同。

如果输入为大量的小文件,则会造成过多的map数,导致效率下降,可采用压缩输入格式CombineFileInputFormat

2、map阶段:

此阶段,执行map任务。map数由分片决定,若要增加map数,可增大mapred.map.tasks,若减少map数,可增大mapred.min.split.size

3、shuffle阶段:

此阶段,将map的输出经过“整理”后给到reduce,也称为“混洗”。分为map端操作和reduce端操作。

在map端,map的输出先写入缓存,当每次缓存快满时,由缓存“溢写”至磁盘,每次溢写都先进行“分区”,并对每个分区的数据进行“排序”和“合并”(可选)。一般会产生多个溢写的文件,这些文件会在map端先被“归并”为一个大的磁盘文件,通知reduce任务来领取自己的分区。

在reduce端,每个reduce任务会从多个map任务领取文件,然后将这些文件进行“归并”,交给reduce任务。

合并(combine)和归并(merge)的区别:对于两个键值对<“a”,1>和<“a”,1>,如果合并,会得到<“a”,2>,即复用reduce的逻辑(也可以自己实现combiner类);如果归并,会得到<“a”,<1,1>>。combine为可选,可通过调用job.setCombinerClass(MyReduce.class)设置这一操作。

4、reduce阶段:

执行reduce任务。reduce数量由分区数决定,结果文件的数量也由此决定,且记录默认按key升序排列。reduce数量可通过mapred.reduce.tasks设置,或在代码中调用job.setNumReduceTasks(int n)方法。

<think>我们被要求解释MapReduce处理工作流程的大致步骤。根据引用[1]和引用[2]的内容,我们可以将流程几个主要阶段。注意,我们需要使用中文,并且按照用户的要求,在引用的地方标注引用标识。 MapReduce工作流程主要包括以下步骤: 1. **数据预处理与任务配**:在任务开始前,输入文件被割成多个片(InputSplit)。JobTracker(在Hadoop 1.x中)或ResourceManager(在Hadoop 2.x YARN中)为集群中的空闲节点配Map任务和Reduce任务。假设有M个Map任务和R个Reduce任务(R通常小于M)[^1]。 2. **Map阶段**:每个Map任务读取配给它的片,将输入数据转换为键值对(key-value pairs)。然后,用户定义的Map函数处理这些键值对,生成中间键值对。这些中间结果首先缓存在内存中,然后周期性地入Map任务所在节点的本地磁盘[^1]。 3. **Shuffle阶段(缓存文件定位与Reducer拉取文件)**:Map任务输出的中间结果被入本地磁盘后,其存储位置信息会报告给JobTracker(或ApplicationMaster)。然后,Reduce任务根据这些位置信息,从各个Map任务节点上拉取(fetch)与自己区对应的中间数据。注意,在Map端,数据会被区(partition)和排序(sort),在Reduce端,拉取的数据会进行归并排序(merge sort)[^1]。 4. **Reduce阶段**:Reduce任务将拉取到的中间数据按key进行组(相同key的值组成一个列表),然后对每个key调用用户定义的Reduce函数进行处理,生成最终的输出结果,并入到HDFS中[^1][^2]。特别地,如果涉及到连接操作(如join),则在这个阶段进行实际的连接(如笛卡尔乘积)[^2]。 5. **任务结束**:当所有的Map任务和Reduce任务都完成后,整个作业结束,并将结果反馈给用户[^1]。 为了更清晰地展示,我们可以用流程图表示: ```mermaid graph TD A[输入文件] --> B[数据片] B --> C[Map任务] C -->|输出中间结果| D[Shuffle阶段] D -->|区、排序、网络传输| E[Reduce任务] E --> F[输出最终结果] ``` 注意:在Hadoop 2.x及以后版本中,JobTracker被ResourceManager和ApplicationMaster取代,但基本流程相似。 §§相关问题§§ 1. MapReduce中Shuffle阶段的具体过程是怎样的? 2. 如何优化MapReduce作业的Shuffle阶段性能? 3. MapReduce和Spark在处理流程上的主要区别是什么? </think> ### MapReduce 处理工作流程的大致步骤 MapReduce 的核心工作流程可为以下六个关键阶段,以经典的 **WordCount**(词频统计)为例说明: #### 1. **输入片(Input Splitting)** 输入文件(如 `text.txt`)被自动切为多个 **逻辑片**(InputSplit)。例如一个 1GB 文本文件可能被切为 8 个 128MB 的片(默认 HDFS 块大小)。每个片由一个 MapTask 处理。 ```mermaid graph LR A[输入文件 text.txt] --> B[片1] A --> C[片2] A --> D[...] A --> E[片N] ``` #### 2. **Map 阶段** 每个 MapTask 处理一个片: - **读取数据**:逐行读取片内容 - **执行 map()**:对每行文本词,生成中间键值对 ```python # WordCount 示例 def map(line): for word in line.split(): emit(word, 1) # 输出如 ("apple",1), ("banana",1) ``` #### 3. **Shuffle 阶段(性能关键)** 此阶段包含核心操作: - **区(Partitioning)**:按 key 的哈希值配到 Reduce 区 $$partition = hash(key) \% R$$ (R 为 Reduce 任务数) - **排序与**:Map 端内存缓冲区满时,数据按 key 排序后入磁盘 - **跨节点传输**:ReduceTask 拉取属于自己的区数据[^1] #### 4. **Reduce 阶段** ReduceTask 执行: - **归并排序**:合并来自不同 Map 的相同 key 数据 - **执行 reduce()**:对相同 key 的值列表进行聚合 ```python # WordCount 示例 def reduce(key, values): total = sum(values) # 如 ("apple", [1,1,1]) → ("apple",3) emit(key, total) ``` #### 5. **输出入** 结果入 HDFS,每个 ReduceTask 生成一个输出文件(如 `part-r-00000`)[^1]。 #### 6. **任务结束** JobTracker 监控所有任务完成后,向用户返回执行结果。 ```mermaid graph TB A[输入片] --> B[Map阶段] B --> C[Shuffle阶段] C --> D[Reduce阶段] D --> E[输出结果] style C fill:#f9f,stroke:#333,stroke-width:2px ``` > **关键性能点**: > - Shuffle 阶段涉及磁盘 I/O、网络传输和排序,通常占用 30-70% 的时间 > - 数据倾斜(如某个 key 频次过高)会显著降低 Reduce 阶段效率[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值