美文网首页
Spark持久化级别

Spark持久化级别

作者: Caucher | 来源:发表于2020-11-01 15:42 被阅读0次

    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)
    

    相关文章

      网友评论

          本文标题:Spark持久化级别

          本文链接:https://www.haomeiwen.com/subject/qvzyvktx.html