并行与分布式编程范式:MapReduce及相关技术解析
立即解锁
发布时间: 2025-08-29 10:37:49 阅读量: 8 订阅数: 17 AIGC 

### 并行与分布式编程范式:MapReduce及相关技术解析
#### 1. MapReduce流程与问题
MapReduce是一种强大的分布式计算模型,其流程包含多个关键步骤。在Reduce阶段,Reduce worker在得知所有Map worker的区域位置后,会通过远程过程调用从Map worker的相应区域读取数据。由于所有Reduce worker都会从所有Map worker读取数据,这会导致网络中出现全对全的通信,进而引发网络拥塞,这也是提升此类系统性能的主要瓶颈之一。为解决这一问题,有人提出了独立调度数据传输的数据传输模块。
Reduce阶段还包括排序和分组以及执行Reduce函数两个步骤:
- **排序和分组**:Reduce worker完成输入数据读取后,数据会先缓冲在本地磁盘。接着,Reduce worker会根据键对中间(键,值)对进行排序,然后将相同键的所有出现进行分组。这是因为Map worker产生的唯一键数量可能超过R个区域,且每个区域可能存在多个键。
- **Reduce函数**:Reduce worker会遍历分组后的(键,值)对,对于每个唯一键,将键和对应的值发送给Reduce函数。该函数处理输入数据,并将输出结果存储在用户程序的预定文件中。
为更清晰地展示MapReduce框架中相互关联的数据控制和控制流,下面给出其控制流的mermaid流程图:
```mermaid
graph LR
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
A(输入文件):::process --> B(拆分文件):::process
B --> C(分配Map任务):::process
C --> D(读取数据):::process
D --> E(执行Map函数):::process
E --> F(通信):::process
F --> G(排序和分组):::process
G --> H(执行Reduce函数):::process
H --> I(写入输出文件):::process
```
#### 2. 计算 - 数据亲和性
MapReduce软件框架最初由Google提出并实现,首次实现使用C语言编写,并利用Google文件系统(GFS)作为底层。GFS是一种分布式文件系统,它将文件划分为固定大小的块(chunks),并将这些块分布存储在集群节点上。
MapReduce库将输入数据(文件)拆分为固定大小的块,并理想情况下在每个块上并行执行Map函数。由于GFS已经将文件存储为一组块,MapReduce框架只需将包含Map函数的用户程序副本发送到节点上已存储的数据块即可。这体现了将计算发送到数据而不是将数据发送到计算的理念。需要注意的是,GFS的默认块大小为64 MB,与MapReduce框架相同。
#### 3. Twister与迭代式MapReduce
理解不同运行时的性能,并比较消息传递接口(MPI)和MapReduce非常重要。并行开销的两个主要来源是负载不平衡和通信(在某些情况下,通信等同于同步开销)。MapReduce的通信开销可能相当高,主要有以下两个原因:
- MapReduce通过文件进行读写,而MPI直接在节点之间通过网络传输信息。
- MPI不会在节点之间传输所有数据,而只是传输更新信息所需的量。我们可以将MPI流称为δ流,将MapReduce流称为全数据流。
为解决性能问题,可以进行以下两个重要更改:
- 在步骤之间流式传输信息,而不将中间步骤写入磁盘。
- 使用长时间运行的线程或处理器来通信δ(迭代之间)流。
这些更改将显著提高性能,但会降低容错能力,并且在支持动态变化(如可用节点数量)方面会变得更加困难。Twister编程范式就是基于这些理念,它区分了从不重新加载的静态数据和需要通信的动态δ流。以下是Twister与其他几种并行编程范式在K均值聚类算法上的性能对比表格:
| 编程范式 | 大数据集性能 | 小数据集性能 |
| ---- | ---- | ---- |
| MPI | 快 | 快 |
| Twister | 比传统MapReduce快很多 | 表现较好 |
| Hadoop | 比MPI慢10倍以上 | 更差 |
| DryadLINQ | 比MPI慢10倍以上 | 更差 |
#### 4. Hadoop库
Hadoop是Apache用Java实现的开源MapReduce框架,它使用Hadoop分布式文件系统(HDFS)作为底层,而不是GFS。Hadoop核心分为两个基本层:MapReduce引擎和HDFS。
##### 4.1 HDFS
HDFS是受GFS启发的分布式文件系统,用于在分布式计算系统上组织和存储文件数据。其具有以下特点:
- **架构**:采用主/从架构,包含一个NameNode作为主节点和多个DataNode作为工作节点(从节点)。存储文件时,HDFS将文件拆分为固定大小的块(如64 MB),并将这些块存储在DataNode上。NameNode负责确定块到DataNode的映射,并管理文件系统的元数据和命名空间。
- **容错性**:
- **块复制**:为可靠存储数据,HDFS会对文件块进行复制。默认情况下,复制因子为3,即每个块会有3个副本分布在整个集群中。
- **副本放置**:为平衡可靠性和通信成本,HDFS会采用一定的副本放置策略。例如,对于默认的复制因子3,一个副本会存储在原始数据所在的节点,一个副本存储在同一机架的不同节点,另一个副本存储在不同机架的节点。
- **心跳和块报告消息**:每个DataNode会定期向NameNode发送心跳和块报告消息。心跳消息表示DataNode正常运行,块报告消息包含DataNode上所有块的列表。
- **高吞吐量访问大数据集**:HDFS主要为批处理而非交互式处理设计,因此数据访问吞吐量比延迟更重要。由于运行在HDFS上的应用
0
0
复制全文
相关推荐






