mapreduce的工作原理

MapReduce 是一种用于大规模数据集并行运算的编程模型,它主要包含 Map(映射)和 Reduce(化简)两个阶段,以下为你详细介绍其工作原理:

 整体流程

MapReduce 作业的整体执行流程可以分为输入、Map 阶段、Shuffle 和排序、Reduce 阶段、输出几个主要步骤。

 详细步骤及原理

 1. 输入

- 数据划分:待处理的大规模数据会被分割成多个固定大小的数据块(Input Split),这些数据块通常存储在 Hadoop 分布式文件系统(HDFS)中。每个数据块会被分配给一个 Map 任务进行处理,这样可以实现数据的并行处理。

- 格式解析:输入数据会根据指定的输入格式(如 TextInputFormat)被解析成键值对(Key - Value)形式,作为 Map 阶段的输入。

 2. Map 阶段

- 任务分配:集群中的多个节点会并行执行 Map 任务,每个 Map 任务处理一个输入数据块。

- 数据处理:Map 函数会对输入的键值对进行处理,将其转换为中间键值对。例如,在一个单词计数的例子中,输入的键值对可能是`<行号, 一行文本>`,经过 Map 函数处理后,会输出多个`<单词, 1>`的中间键值对。

- 本地缓存:Map 任务输出的中间键值对会被暂时存储在内存缓冲区中。当缓冲区达到一定阈值时,会将数据溢写到本地磁盘,形成一个溢写文件。

 3. Shuffle 和排序

- 分区:在溢写过程中,会根据键的哈希值将中间键值对进行分区(Partition),每个分区对应一个 Reduce 任务。这样可以保证具有相同键的键值对会被发送到同一个 Reduce 任务进行处理。

- 排序:每个分区内的键值对会按照键的字典序进行排序。如果有 Combiner 函数(可选),会在排序后对相同键的键值对进行本地合并,以减少数据传输量。

- 合并:当所有溢写文件都生成后,会将这些文件进行合并,形成一个大的分区文件,每个分区文件内的键值对都是有序的。

- 数据传输:Reduce 任务会从各个 Map 任务所在的节点上拉取属于自己分区的数据,这个过程称为数据拉取(Fetch)。

 4. Reduce 阶段

- 数据分组:Reduce 任务会将接收到的键值对按照键进行分组,将具有相同键的所有值聚合在一起。

- 数据处理:Reduce 函数会对分组后的键值对进行处理,将其合并为最终的结果。例如,在单词计数的例子中,Reduce 函数会将相同单词的计数相加,得到每个单词的总出现次数。

- 结果输出:Reduce 任务的输出结果会被存储到指定的输出文件系统中,通常也是 HDFS。

 5. 输出

- 结果存储:最终的处理结果会以文件的形式存储在输出文件系统中。输出文件的格式可以根据需要进行指定,如 TextOutputFormat 会将结果以文本形式存储。

 示例说明

以单词计数为例,输入是一系列文本文件,具体过程如下:

- 输入:将文本文件分割成多个数据块,解析成`<行号, 一行文本>`的键值对。

- Map 阶段:Map 函数将每行文本拆分成单词,输出`<单词, 1>`的中间键值对。

- Shuffle 和排序:根据单词的哈希值进行分区,对每个分区内的键值对按单词排序,然后将数据传输给对应的 Reduce 任务。

- Reduce 阶段:Reduce 函数将相同单词的计数相加,输出`<单词, 总计数>`的结果。

- 输出:将最终的单词计数结果存储到输出文件中。

你可能感兴趣的:(大数据,spark)