text Spark StorageLevel选择-cache,持久化
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了text Spark StorageLevel选择-cache,持久化相关的知识,希望对你有一定的参考价值。
## 参考链接
- [Spark document: RDD Persistence](https://spark.apache.org/docs/latest/rdd-programming-guide.html)
## Storage Level
下面仅列出常用选项:
- **MEMORY\_ONLY**: rdd操作的默认存储等级\(注意dataframe是MEMORY\_AND\_DISK\). 会将**deserialized**形式的rdd存储在内存中, 如果内存容不下, 部分partition会在**每次被请求的时候compute on the fly**.
- **MEMORY\_AND\_DISK**: 和上面不同的是, 如果容不下, spill到磁盘中, 每次使用的时候从磁盘加载. 一般不推荐使用, 因为一般情况下重新计算要比从硬盘加载要快.
- **MEMORY\_ONLY\_SER\(Java and scala\)**: 存储**serialized**形式, 省内存, 但是读取的时候会耗费更多的cpu, 需要搭配高性能的serializer\(\例如kryo\)来使用.
- **MEMORY\_ONLY\_2**: 和MEMORY\_ONLY不同的是, 多一个replica, 这样在failover的时候可以直接恢复, 无需重新计算丢失的partition.
## 最佳实践
- 如果内存足够, 那么使用`MEMORY_ONLY`性能最佳
- 如果要性能和内存的折中, 那么使用`MEMORY_ONLY_SER`和kyro serializer.
## StorageLevel在PySpark中的表现
> PySpark中所有的cache都是通过pickle库序列化的.
所以**不要被提供的level欺骗了**, 请自动在所有级别后面加上`SER`关键字.
## 杂项总结
- 即使是不显式调用`unpersist()`, spark也会按照LRU来管理cache
- 即使是不显示调用`cache()`或者`persist()`, spark也会将一些中间结果存储在磁盘中, 直到对应的rdd不再使用为止, 这是为了防止万一有需要的时候的重算开销.
参考链接: https://stackoverflow.com/questions/49294727/why-spark-cached-rdd-spill-to-disk
问题描述:
从spark ui上看executor memory有很多剩余, 例如800M/11G, 但是看storage, cache的dataframe还是会输出到磁盘上. 只有内存超级大的时候才会全部存储在storage上.
原因:
Spark中, cache操作实际上是调用的persist(default_storage_level)
- 对于rdd调用cache而言, default_storage_level是MEMORY_ONLY
\!h - 对于dataframe调用cache而言, default_storage_level是MEMORY_AND_DISK, 所以要通过手动调用persist(StorageLevel.MEMORY_ONLY)来保证dataframe全部缓存在内存中.
from pyspark.storagelevel import StorageLevel
df.persist(StorageLevel.MEMORY_ONLY)
以上是关于text Spark StorageLevel选择-cache,持久化的主要内容,如果未能解决你的问题,请参考以下文章
Spark原始码系列分布式缓存
Spark:MEMORY_ONLY_SER_2 - 奇怪的内存行为
CacheTest
spark
使用两个 RDD apache spark
Stream整合Flume