提升内存中MapReduce内存效率的优化方案
1. 背景引入
在大数据时代,内存计算是一个新兴概念。目前,关于内存计算的研究主要集中在硬件架构和系统软件方面。当新的硬件引入传统架构时,需要对原有的上层系统软件进行适当修改。
Spark作为一个分布式计算平台,吸收了内存计算的精髓,即最大化内存速度以匹配CPU速度,并且理想情况下能容忍RDD谱系中的数据丢失。不过,它本质上还是一个类似Hadoop的MapReduce框架。
MapReduce框架包含映射(map)、洗牌(shuffle)和归约(reduce)三个阶段。洗牌阶段常被映射和归约阶段掩盖。映射阶段从文件系统(如HDFS)读取数据并将其转换为键值对;归约阶段处理相似键的值;洗牌阶段又分为洗牌写入和洗牌获取,洗牌写入是映射阶段洗牌获取的准备阶段,洗牌获取则旨在将映射任务生成的数据以多对多的方式传输到归约任务,常作为归约阶段的一部分。
早期的Hadoop和Spark中,映射任务直接将输出数据写入磁盘,会创建大量的洗牌文件,导致随机I/O增多和性能下降。为减少文件数量,Hadoop创建大的内存缓冲区来缓存分区数据,但归约阶段仍需大量磁盘I/O操作。而Spark引入了洗牌文件合并机制,仅创建C×R个洗牌文件(C为分配给Spark应用的CPU核心数),便于利用底层文件系统的强局部性优势,且很多应用无需对中间数据排序。在洗牌获取阶段,Spark直接将获取的数据存储在内存中进行聚合,避免了一些Hadoop中不可避免的磁盘I/O操作。
2. 研究动机
尽管Spark引入洗牌文件合并机制后,洗牌文件数量减少、性能提升,但基于哈希的洗牌在分区数量达到数千时仍会导致性能下降。Spa
超级会员免费看
订阅专栏 解锁全文
8万+

被折叠的 条评论
为什么被折叠?



