Spark持久化级别

2020-11-01  本文已影响0人  Caucher

Spark相对于MR的一个先进点就是可以基于内存的高速运算,在Spark任务中,将那些多次复用的rdd进行缓存,可以有效的提升运算效率。

Spark的StorageLevel共有7个缓存级别:

  1. DISK_ONLY:缓存入硬盘。这个级别主要是讲那些庞大的Rdd,之后仍需使用但暂时不用的,放进磁盘,腾出Executor内存。
  2. DISK_ONLY_2:多一个缓存副本。
  3. MEMORY_ONLY:只使用内存进行缓存。这个级别最为常用,对于马上用到的高频rdd,推荐使用。
  4. MEMORY_ONLY_2:多一个缓存副本。
  5. MEMORY_AND_DISK:先使用内存,多出来的溢出到磁盘,对于高频的大rdd可以使用。
  6. MEMORY_AND_DISK_2:多一个缓存副本。
  7. OFF_HEAP:除了内存、磁盘,还可以存储在OFF_HEAP。

总的来说,StorageLevel就只有几个选项,Disk, Memory, offHeap, deserialized, replication

其中序列化可以把rdd变成字节数组,缩小存储开销,减少GC负担,但序列化无可避免的增加了一部分cpu开销,需要权衡使用。
OffHeap之后有空单独开个专题讲一下。

下面附上Pyspark源码。

class StorageLevel(object):

    """
    Flags for controlling the storage of an RDD. Each StorageLevel records whether to use memory,
    whether to drop the RDD to disk if it falls out of memory, whether to keep the data in memory
    in a JAVA-specific serialized format, and whether to replicate the RDD partitions on multiple
    nodes. Also contains static constants for some commonly used storage levels, MEMORY_ONLY.
    Since the data is always serialized on the Python side, all the constants use the serialized
    formats.
    """

    def __init__(self, useDisk, useMemory, useOffHeap, deserialized, replication=1):
        self.useDisk = useDisk
        self.useMemory = useMemory
        self.useOffHeap = useOffHeap
        self.deserialized = deserialized
        self.replication = replication

    def __repr__(self):
        return "StorageLevel(%s, %s, %s, %s, %s)" % (
            self.useDisk, self.useMemory, self.useOffHeap, self.deserialized, self.replication)

    def __str__(self):
        result = ""
        result += "Disk " if self.useDisk else ""
        result += "Memory " if self.useMemory else ""
        result += "OffHeap " if self.useOffHeap else ""
        result += "Deserialized " if self.deserialized else "Serialized "
        result += "%sx Replicated" % self.replication
        return result

StorageLevel.DISK_ONLY = StorageLevel(True, False, False, False)
StorageLevel.DISK_ONLY_2 = StorageLevel(True, False, False, False, 2)
StorageLevel.MEMORY_ONLY = StorageLevel(False, True, False, False)
StorageLevel.MEMORY_ONLY_2 = StorageLevel(False, True, False, False, 2)
StorageLevel.MEMORY_AND_DISK = StorageLevel(True, True, False, False)
StorageLevel.MEMORY_AND_DISK_2 = StorageLevel(True, True, False, False, 2)
StorageLevel.OFF_HEAP = StorageLevel(True, True, True, False, 1)
上一篇下一篇

猜你喜欢

热点阅读