spark中的存储

  • #存储架构

Spark是一种基于内存的运算框架。数据存储在worker节点中。对于每一个worker,worker Excutor有一个JVM,数据存储在JVM中。


  • #故障恢复

当计算引擎的进程损坏,Cache 丢失,Spark只能重新启动并计算恢复数据。


  • #Lineage(世代)

Lineage保证数据的Reliability。

  • 当数据E丢失后:
  1. 通过世代找到相应的之前数据,重新部署一个Job将数据重新计算。
  2. 将数据在底层文件系统中备份。

  • #数据流

计算数据在JVM的内存中存储一份,以保证较少的网络通信和读写。同时记录存储数据的世代(lineage),当数据丢失时,基于世代将job重新运行,得到相应数据。


  • #计算过程

Spark内部,单个executor进程内RDD的分片数据是用Iterator流式访问的。
Iterator的hasNext方法和next方法是由RDD lineage上各个transformation携带的闭包函数复合而成的。
该复合Iterator每访问一个元素,就对该元素应用相应的复合函数,得到的结果再流式地落地。空间复杂度为O(1)。


  • #持久化

spark.local.dir:可以设置Spark的暂存目录,包括映射输出文件和需要存储在磁盘上的RDDs。这个磁盘目录在系统上面访问速度越快越好。可以用逗号隔开来设置多个目录。默认值为’/tmp’。
org.apache.spark.storage.StorageLevel中5种持久化的级别.(result.persist(StorageLevel.DISK_ONLY)) 默认为MEMORY_ONLY

级别 空间 时间 内存 磁盘 备注
MEMORY_ONLY 使用 不使用 -
MEMORY_ONLY_SER 使用 不使用 -
MEMORY_AND_DISK 中等 部分 部分 如果数据在内存中放不下,则溢写到磁盘上
MEMORY_AND_DISK_SER 部分 部分 如果数据在内存中放不下,则溢写到磁盘上。在内存中存放序列化后的数据。
DISK_ONLY 部分 部分 -

  • #数据分享

在Spark中,如果job2需要Job1运算的数据,Job1首先需要将数据写入到HDFS的block中,会产生硬盘甚至跨网络的读写,同时在HDFS中默认数据需要写三份,因此造成性能的损失。

推荐文章