Spark的Shuffle及缓存机制

Spark的 Shuffle

Shuffle:将具有共同特征的数据经过排序或合并过程,整理到同一个分区的过程

Spark提供了两种Shuffle管理器,分别是:Hash Based Shuffle Manager和Sort Based Shuffle Manager

  • Hash Based Shuffle Manager(Spark1.0之前)

会产生大量的临时文件,文件数 = MapTask * ResultTask(相当于MapReduce中的ReduceTask)。文件数过多,会占用大量内存资源。内存中数据溢写到磁盘、会发生大量的磁盘IO。ResultTask通过网络从数百台服务器取同一分区数据,会占用大量网络带宽。但Hash Based Shuffle Manager也有优点,由于文件内数据不排序,运行效率远远大于Hadoop2.0

 

  • Sort Based Shuffle Manager

每个Sort Based Shuffle Manager 不会为每个ResultTask产生一个临时文件,而是一个MapTask产生一个临时文件和一个索引文件。这是Spark底层默认的Shuffle管理器。每个分区的数据形成一个文件段存入临时文件,临时文件内数据不排序,文件段会有一个与之对应的索引号存入索引文件,索引文件中相同分区编号的数据放在一起。然后分区编号按字典顺序依次往下排列。减少文件数量,可以避免文件同时读操作占用的大量内存消耗

 

Spark的缓存机制

默认情况下,RDD中分区数据使用完毕,数据就清除。若一个分区中的数据多次被子分区使用,或子分区数据丢失,都需要父分区重新计算。为了避免重复计算、提升程序性能,Spark中引入了持久化机制,即可以把分区数据缓存到磁盘,也可以持久化到磁盘。Spark可以使用cache()方法缓存分区中的数据,但cache方法只支持StorageLevel.MEMORY_ONLY这一个级别的缓存,

这个级别的缓存也是Spark默认的缓存机制。

若使用不同级别来缓存分区数据,可以使用persist()函数,在使用前需要导入包

import org.apache.spark.storage._

StorageLevel的类型

MEMORY_ONLY:反序列化对象的形式存储在内存,未缓存的对象不会缓存

MEMORY_AND_DISK:反序列化对象的形式存储在内存,未缓存的对象缓存在磁盘

MEMORY_ONLY_SER:序列化对象的形式存储在内存,未缓存的对象不会缓存

MEMORY_AND_DISK_SER:序列化对象的形式存储在内存,未缓存对象缓存在磁盘

MEMORY_ONLY_2:反序列化对象存储在集群内存中存储两份

MEMORY_AND_DISK_2:反序列化对象在集群内存中存储两份、内存空间达到阈值,存储在磁盘上

DISK_ONLY:数据只存储在磁盘上

OFF_HEAP:数据存储在JVM堆空间之外,不能运用JVM-GC回收机制

 

Spark CheckPoint机制

 

Spark Checkpoint机制的代码实现