赞
踩
Spark的计算引擎主要包括执行内存和Shuffle两部分
执行内存主要包括执行内存、任务内存管理器(TaskMemoryManager)、内存消费者(MemoryCosumer)等内容。执行内存包括在JVM堆上进行分配的执行内存池(ExecutionMemoryPool)和在操作系统的内存中进行分配的Tungsten。内存管理器将提供API对执行内存和Tungsten进行管理(包括申请内存、释放内存等)。因为同一节点上能够运行多次任务尝试,所以需要每一次任务尝试都有单独的任务内存管理器为其服务。任务尝试通过任务内存管理器与内存管理器交互,以申请任务尝试所需要的执行内存,并在任务尝试结束后释放使用的执行内存。一次任务尝试过程中会有多个组件需要使用执行内存,这些组件统称为内存消费者。内存消费者多种多样,有对map任务的中间输出数据在JVM堆上进行缓存、聚合、溢出、持久化等处理的ExternalSorter,也有在操作系统内存中进行缓存、溢出、持久化处理的ShuffleExternalSorter,还有将key/value对存储到连续的内存块中的RowBasedKeyValueBatch。消费者需要的执行内存都是向任务内存管理器所申请的。从执行内存的角度来看,计算引擎的整体架构如下图所示:
下面先来看看MapReduce计算框架的Shuffle过程:
在早期Spark版本中,Shuffle如下图所示:
步骤如下:
Spark早期版本的Shuffle过程存在以下问题:
Hadoop MapReduce的Shuffle过程存在以下问题:
为了解决以上MapReduce和早期spark的Shuffle过程中的性能问题,目前Spark已经对Shuffle做了多种性能优化,主要解决方法如下:
经过以上优化,目前Spark实现的Shuffle的过程大致为:map任务在输出时会进行分区计算并生成数据文件和索引文件等步骤,可能还伴随有缓存、排序、聚合、溢出、合并等操作。reduce任务将map任务输出的Block划分为本地和远端的Block,对于远端的Block,需要使用ShuffleClient从远端节点下载,而对于 本地的BLock,只需要从本地的存储体系中读取即可。reduce任务读取到map任务输出的数据后,可能进行缓存 、排序、聚合、溢出、合并等操作,最终输出结果。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。