spark调优-持久化策略选择
来源:互联网 发布:mac docker ycm 编辑:程序博客网 时间:2024/06/06 00:36
# RDD的持久化策略:
cache、persist、checkpoint三种策略(持久化的单位是partition)
1、cache是persist的一个简化版,会将rdd中的数据持久化到内存中
cache = persists(StorageLevel.MEMORY_ONLY) 不进行序列化
特点:
- cache的返回值 必须赋值给一个新的RDD变量, 在其他的job中直接使用这个RDD变量就可以
- cache是一个懒执行(其他两个也是懒执行),必须有action类的算子触发(也就是说,实现缓存要先触发一次)
- cache算子的后面不能立即添加action类算子
var RDD= RDD.cache.foreach X 错误的,这样RDD 的结果就是遍历后的
2、persist手动指定持久化级别
3、checkpoint
- checkpoint会另启 一个job持久化到HDFS上 (安全性)、依赖关系会被切断。
- 如果RDD转换很多,可以使用checkpoint。
- 当使用checkpoint的时候可以先cache一把,然后再用checkpoint,这时候就会从内存中写入HDFS上(要快一些)
persist持久化级别:
1、默认情况下,性能最高的当然是MEMORY_ONLY,但前提是你的内存必须足够足够大
可以绰绰有余地存放下整个RDD的所有数据。因为不进行序列化与反序列化操作,就避免了这部分的性能开销;对这个RDD的后续算子操作,都是基于纯内存中的数据的操作,不需要从磁盘文件中读取数据,性能也很高;而且不需要复制一份数据副本,并远程传送到其他节点上。但是这里必须要注意的是,在实际的生产环境中,恐怕能够直接用这种策略的场景还是有限的,如果RDD中数据比较多时(比如几十亿),直接用这种持久化级别,会导致JVM的OOM内存溢出异常。
2、如果使用MEMORY_ONLY级别时发生了内存溢出,那么建议尝试使用MEMORY_ONLY_SER级别。(序列化后,降低了内存占用)
该级别会将RDD数据序列化后再保存在内存中,此时每个partition仅仅是一个字节数组而已,大大减少了对象数量,并降低了内存占用。这种级别比MEMORY_ONLY多出来的性能开销,主要就是序列化与反序列化的开销。但是后续算子可以基于纯内存进行操作,因此性能总体还是比较高的。此外,可能发生的问题同上,如果RDD中的数据量过多的话,还是可能会导致OOM内存溢出的异常。
3、如果纯内存的级别都无法使用,那么建议使用MEMORY_AND_DISK_SER策略
而不是MEMORY_AND_DISK策略。因为既然到了这一步,就说明RDD的数据量很大,内存无法完全放下。序列化后的数据比较少,可以节省内存和磁盘的空间开销。同时该策略会优先尽量尝试将数据缓存在内存中,内存缓存不下才会写入磁盘。
4、通常不建议使用DISK_ONLY和后缀为_2的级别
因为完全基于磁盘文件进行数据的读写,会导致性能急剧降低,有时还不如重新计算一次所有RDD。后缀为_2的级别,必须将所有数据都复制一份副本,并发送到其他节点上,数据复制以及网络传输会导致较大的性能开销,除非是要求作业的高可用性,否则不建议使用。
0 0
- spark调优-持久化策略选择
- Spark RDD持久化策略
- Spark算子选择策略
- redis持久化策略
- Redis 持久化策略
- Redis 持久化策略
- Spark RDD 持久化
- Spark的持久化
- Spark缓存策略说明及选择
- [Spark]Spark RDD 指南五 持久化
- Spark-rdd的持久化
- Spark PG6. RDD 持久化
- Spark的持久化简记
- spark持久化(缓存)
- spark的持久化存储
- spark中的RDD持久化
- WebLogic的Session持久化策略
- Hibernate的持久化对象加载策略
- TensorFlow0.8源码阅读 -- 代码目录结构讲解
- TCP、UDP、IP 协议分析
- (原创)性能测试年后就业分析
- 用JDK生成HTTPS证书
- 程序设计的50条感想
- spark调优-持久化策略选择
- Linux系统的日志
- 【一图流】_02_一张图看懂 Android 进程间通信(IPC)Binder机制:
- virtualenv 的使用
- Android自定义圆形渐变进度条(续)--加动画
- QT读取位置时发生访问冲突
- 记录开发过程中的一些小问题
- tcmalloc内存池
- svn命令简介及生成补丁脚本