Spark存储级别

存储级别(Storage Level)详解

Spark的存储级别决定了数据在内存和磁盘中的存储方式,以及是否对数据进行序列化。存储级别主要用于RDD或DataFrame/Dataset的cache()和persist()操作。

存储级别分类

Spark提供了以下几种存储级别:

  1. MEMORY_ONLY

    • 数据完全存储在内存中。如果内存不足,部分数据会被丢弃(不会写入磁盘)。
    • 数据未被序列化,存储在内存中的数据是对象格式。
    • 适用场景 :内存充足 且需要快速访问数据时,适合计算密集型任务。
  2. MEMORY_AND_DISK

    • 数据优先存储在内存中。如果内存不足,溢出的数据会写入磁盘。
    • 数据未被序列化,存储在内存中的数据是对象格式。
    • 适用场景:内存不足以存储所有数据,但仍希望尽量使用内存。
  3. MEMORY_ONLY_SER

    • 数据完全存储在内存中 ,但会进行序列化以减少内存占用。
    • 序列化后的数据无法直接操作,需要反序列化。
    • 适用场景 :内存有限 ,且对数据访问速度要求不高。
  4. MEMORY_AND_DISK_SER

    • 数据优先存储在内存中,且会进行序列化。如果内存不足,溢出的数据写入磁盘。
    • 适用场景 :内存有限 ,且需要支持数据溢出到磁盘。
  5. DISK_ONLY

    • 数据完全存储在磁盘中,不使用内存。
    • 适用场景 :内存非常有限,或者数据量非常大,无法存储在内存中。
  6. OFF_HEAP

    • 数据存储在堆外内存中(需要启用堆外内存支持)。
    • 适用场景 :需要减少GC(垃圾回收)开销。
存储级别选择策略

选择存储级别时需要考虑以下因素:

  1. 数据量大小:

    • 如果数据量较小且内存充足,可以选择MEMORY_ONLY,以获得最快的访问速度。
    • 如果数据量较大且内存不足,可以选择MEMORY_AND_DISK。
  2. 内存资源:

    • 如果内存资源有限,可以选择序列化存储级别(如MEMORY_ONLY_SER或MEMORY_AND_DISK_SER),以减少内存占用。
  3. 数据访问频率:

    • 如果数据需要频繁访问,优先选择内存存储(如MEMORY_ONLY或MEMORY_AND_DISK)。
    • 如果数据只需要偶尔访问,可以选择DISK_ONLY。
  4. 性能需求:

    • 对性能要求高时,尽量使用内存存储。
    • 如果性能要求较低,可以选择磁盘存储。
  5. 垃圾回收(GC)开销:

    • 如果GC开销较大,可以考虑使用OFF_HEAP存储级别。
存储级别的使用方法

Spark中可以通过persist()或cache()方法设置存储级别:

  • cache():

    • 默认存储级别为MEMORY_AND_DISK。

    • 示例:

      scala 复制代码
      val rdd = sc.textFile("data.txt").cache()
  • persist():

    • 可以显式指定存储级别。

    • 示例:

      scala 复制代码
      val rdd = sc.textFile("data.txt").persist(StorageLevel.MEMORY_AND_DISK_SER)
存储级别的注意事项
  1. 内存不足时的行为:

    • 如果选择MEMORY_ONLY,内存不足时数据会丢失,导致重新计算。
    • 如果选择MEMORY_AND_DISK,内存不足时数据会写入磁盘,避免丢失。
  2. 序列化的影响:

    • 序列化可以减少内存占用,但会增加CPU开销(反序列化需要时间)。
    • 如果性能要求较高且内存充足,尽量避免序列化。
  3. 磁盘存储的影响:

    • 磁盘存储会增加I/O开销,影响性能。
    • 如果数据量较大且内存不足,可以选择磁盘存储。

总结

存储级别的选择需要根据具体场景权衡性能和资源使用:

  • 内存充足 :MEMORY_ONLY > MEMORY_AND_DISK
  • 内存有限 :MEMORY_AND_DISK_SER > DISK_ONLY
  • 数据量大 :MEMORY_AND_DISK > DISK_ONLY
  • GC开销大 :考虑使用OFF_HEAP
相关推荐
大大大大晴天11 小时前
每天认识一个组件:Apache Spark
大数据
七夜zippoe16 小时前
Agent 上线第一天就炸了:6 个生产事故的根因分析与修复记录
大数据·ai·agent·根因分析·修复记录
字节跳动数据平台18 小时前
不重拍,也能换道具、换商品、换画风?短剧转漫、电商换款新解法来了
大数据
武子康18 小时前
攻击动作做对了,游戏规则就对了吗?H3-World 与三条控制路线的分工
大数据·人工智能·agent
Lansonli19 小时前
大数据Spark(八十七):Spark-Submit 参数详解
大数据·分布式·spark
cc57250265320 小时前
数据科学与大数据技术专业考证清单有哪些?
大数据
qq_4523962320 小时前
第二篇:《CommitLog + ConsumeQueue:一条日志解决 Kafka 多分区随机写的难题》
分布式·kafka
Alluxio2 天前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
喵个咪2 天前
GoWind Admin 拆解:BI 大屏设计器——schema 即 JSON、resolver 注入与三张快照表的口径谱系
大数据·后端·go
武子康2 天前
H3-World 的 11.3 小时训练数据,是怎样对齐成动作监督的?
大数据·人工智能·深度学习