spark|spark调优(三):持久化减少二次查询( 二 )


  • 如果使用MEMORY_ONLY级别时发生了内存溢出 , 那么建议尝试使用MEMORY_ONLY_SER级别 。 该级别会将RDD数据序列化后再保存在内存中 , 此时每个partition仅仅是一个字节数组而已 , 大大减少了对象数量 , 并降低了内存占用 。 这种级别比MEMORY_ONLY多出来的性能开销 , 主要就是序列化与反序列化的开销 。 但是后续算子可以基于纯内存进行操作 , 因此性能总体还是比较高的 。 此外 , 可能发生的问题同上 , 如果RDD中的数据量过多的话 , 还是可能会导致OOM内存溢出的异常 。
  • 如果纯内存的级别都无法使用 , 那么建议使用MEMORY_AND_DISK_SER策略 , 而不是MEMORY_AND_DISK策略 。 因为既然到了这一步 , 就说明RDD的数据量很大 , 内存无法完全放下 。 序列化后的数据比较少 , 可以节省内存和磁盘的空间开销 。 同时该策略会优先尽量尝试将数据缓存在内存中 , 内存缓存不下才会写入磁盘 。
  • 【spark|spark调优(三):持久化减少二次查询】通常不建议使用DISK_ONLY和后缀为_2的级别:因为完全基于磁盘文件进行数据的读写 , 会导致性能急剧降低 , 有时还不如重新计算一次所有RDD 。 后缀为_2的级别 , 必须将所有数据都复制一份副本 , 并发送到其他节点上 , 数据复制以及网络传输会导致较大的性能开销 , 除非是要求作业的高可用性 , 否则不建议使用 。