如果对Hadoop的shuffle机制有所了解的人都知道,map所产生的中间数据在送给reduce进行处理之前是要经过排序的。具体过程实际上是快速排序,堆排序和归并排序的完美结合。
首先,当map函数处理完输入数据之后,会将中间数据存在本机的一个或者几个文件当中,并且针对这些文件内部的记录进行一次快速排序,这里的排序是升序排序。在map任务将所有的中间数据写放本地文件并进行快速排序之后,系统会对这些排好序的文件做一次归并排序,并将排好序的结果输出到一个大的文件当中。这段代码是在MapTask的内部类MapOutputBuffer中实现的,其中归并排序是调用了Merge类的merge方法,具体过程下面将会详细叙述。
当map阶段完成后,系统会启动reduce过程。reduce过程会把这些由map输出的中间文件拷贝到本地。然后生成一个或者几个Segment类的实例,以下我们称这些实例为segment。Segment类封装了这些中间数据的操作,比如读取记录等。在reduce端,这些中间数据可以存在内存中,也可以存在硬盘中。同时,系统还会启动两个merge(归并)线程,一个针对内存中的segment进行归并,一个针对硬盘中的segment进行归并。merge过程实际上就是调用了Merge的merge方法。
Merge类的merge方法生成了一个MergeQueue类实例,并且调用了该类的merge方法。MergeQueue类是PriorityQueue类的一个子类,同时实现了RawKeyValueIterator接口。PriorityQueue类实际是一个小根堆,而MergeQueue的merge方法实际上就是将segment对象存储进父类的数据结构中,并且建立一个小根堆的过程。因此,hadoop的归并和排序不是两个分开的过程,,而是一个过程。在将segment归并的同时进行了排序。
需要注意的是,这里针对segment排序的过程是以segment为单位的,而不是以segment中存储的记录(record)为单位的。而这里排序过程中对两个segment对象的比较是对segment中存储的第一个记录的键的比较。也就是说假设有两个segment,一个叫a,一个叫b,a<b仅仅是因为a的第一个记录的键小于b的第一个记录的键。具体的比较方法由用户实义的comparator类实义。具体的比较过程在MergeQueue类中的lessThan方法中定义。
现在,我们已经得到了一个以segment为单位,以segment中第一记录的键为比较依据的小根堆,至此在系统中所谓的sort阶段就已经结束了。
接下来,系统会不停的从这个小根堆里取出位于根节点的segment的第一个记录交给reduce函数处理。注意,因为该小根堆是以每一个segment的第一个记录的键为排序依据的,所以根节点的第一个记录的键一定是所有segment中第一个记录的键的最小值。由于segment存储的是map输出的数据,而这些数据在传送给reduce之前已经经过排序(升序),所以,每个segment的第一个记录的键一定是该segment中所有键的最小值。从而根segment的第一个记录的键一定是所有记录的键的最小值。这里实际就是利用了归并排序。在从根segment中取出第一个记录之后,系统还会对该小根堆进行调整,以保证小根堆的性质。
以上是shuffle过程中排序的完整过程。虽然在hadoop的shuffle过程中有一个明确的sort阶段,但是实际上可以看出中间数据的排序是贯穿于整个shuffle阶段的。
-----------------------------------------------------------------------------------
原文:http://blog.csdn.net/riverm/article/details/6883606
相关推荐
- Shuffle阶段:中间键值对按照键排序,并分发到不同的Reduce任务。 - Reduce阶段:Reduce函数处理每个键的所有中间值,生成最终结果。 4. YARN(Yet Another Resource Negotiator): 在Hadoop 2.x版本中,YARN...
《Hadoop MapReduce实战手册》是一本专注于大数据处理技术的专著,主要针对Apache Hadoop中的MapReduce框架进行了深入的探讨。MapReduce是Hadoop生态系统中的核心组件之一,用于处理和生成大规模数据集。该书旨在...
Sort过程则是在Shuffle过程中对中间结果进行排序,以确保相同键的值能够被同一个Reduce任务处理。 ### 海量数据存储和计算平台的调试器研究 针对海量数据存储和计算平台的特点,研究高效可靠的调试器对于提高数据...
然而,这种方法可能会导致大量的中间数据,从而影响性能。因此,优化表关联算法是非常必要的。 #### Hadoop计算平台和Hadoop数据仓库的区别 - **Hadoop计算平台**:侧重于处理非结构化和半结构化数据,适用于大规模...
根据提供的文件信息,本文将深入解析《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》这本书中的关键知识点,主要包括Hadoop的核心组件——MapReduce的设计理念、架构组成及其具体的实现原理。 ### Hadoop...
中间结果通过shuffle和sort阶段进行排序和分组,最后由reduce函数处理。 4. **Hadoop源码解析** Hadoop源代码中,`org.apache.hadoop.mapreduce`包是MapReduce的核心,包含Job、Task、Mapper和Reducer等关键类。`...
3. **Shuffle 过程源码**:深入研究 Shuffle 阶段的具体实现细节,包括数据分区、排序和合并等步骤。 4. **自定义分区器**:实现自定义分区器,控制数据如何分配给 Reduce 任务。 5. **Combine 及 MapJoin**: - **...
2. Shuffle阶段:中间键值对根据键排序,并将相同键的值聚集在一起。 3. Reduce阶段:Reduce函数接收每个键的所有值,执行聚合操作,生成最终结果。 四、Hadoop 3.3.6新特性与改进 1. YARN(Yet Another Resource ...
这涉及到如何优化MapReduce的Map和Reduce任务分配,以及如何通过Shuffle阶段确保数据的正确排序和分发。此外,由于NP问题的复杂性,还需要探索高效的数据分区策略和近似算法,以在有限计算资源下找到接近最优解的...
- **Shuffle阶段**:对Map阶段产生的中间结果进行排序、合并等操作。 - **Reduce阶段**:根据Shuffle阶段处理后的结果,进行最终的数据聚合操作。 - **优化技巧**: - **Combiner使用**:可以在Map阶段提前做局部...
接着,中间结果通过shuffle和sort过程进行排序,确保相同键的值会被聚集在一起。最后,reduce函数接收这些键值对,进行聚合操作,生成最终结果。 【推测执行算法】 Hadoop中的推测执行算法是为了解决节点故障或...
在Hadoop 3.X的技术体系中,MapReduce是一个核心组件,用于实现大规模数据集的并行运算。 4.1 MapReduce概述 MapReduce是一种编程模型,最初由Google提出,用于处理和生成大数据集。对于Hadoop来说,MapReduce模型...
这些键值对随后通过shuffle过程,按照键的排序规则进行分区和排序,准备进入Reduce阶段。 Reduce阶段则负责聚合Mapper产生的中间结果,通常用于汇总、统计或过滤数据。Reducer接收来自多个Mapper的相同键的所有值,...
此外,还需要了解Shuffle和Sort过程,这是MapReduce内在的排序和分区机制,确保了Reduce阶段的数据正确性。 在解答这样的模拟题时,你需要根据题目要求,先分析数据集train1.csv,理解其结构和内容,然后利用...
3. **Shuffle与Sort**:中间结果根据键进行排序,准备进入Reduce阶段。 4. **Reduce阶段**:对同一用户的所有边进行聚合,可以采用 Louvain 方法或者 Girvan-Newman算法等社区检测算法,找出具有高内部连通性和低...
《深入解析MapReduce架构设计与实现原理》是针对Hadoop技术的一本专业指南,尤其侧重于MapReduce这一核心组件的深度剖析。MapReduce是Google提出的一种分布式计算模型,被广泛应用于大数据处理领域,如日志分析、...
- **Shuffle阶段**:将Map任务产生的中间结果按照键值进行排序和分区,为Reduce阶段做准备。 - **Reduce阶段**:对经过Shuffle后的数据进行聚合操作,最终产生结果输出。 #### 四、总结 通过上述分析可以看出,...