RDD关键性能考量之 内存管理

《Spark快速大数据分析》

8.4.2 关键性能考量   内存管理

内存对Spark来说哟几个不同的用途,理解并调优Spark的内存使用方法

可以帮助优化Spark应用。在各个执行器进程中,内存有一下所列集中用途。

RDD存储
当调用RDD的persist()或cache()方法时,这个RDD的分区会被存储到缓存区中。

Spark会根据spark.stroage.memoryFraction限制用来缓存的内存占整个JVM堆空间的比例大小。

如果超出限制,旧的分区数据会被移出内存。


数据混洗与聚合的缓存区

当进行数据混洗操作时,Spark会创建出一些中间缓存区来存储数据混洗的输出数据。

这些缓存区用来存储聚合操作的中间结果,以及数据混洗操作中直接输出的部分缓存数据。

Spark会尝试根据spark.shuffle.memoryFraction限定这种缓存区内存占总内存的比例。


用户代码

Spark可以执行任意的用户代码,所以用户的函数可以自行申请大量内存。

例如,一个用户应用分配了巨大的数组或者其他对象,那这些都会占用总的内存。

用户代码可以访问JVM堆空间中分配给RDD存储和数据混洗存储以为的全部剩余空间。

默认情况下Sparkhi使用60%的空间来存储RDD,20%存储数据混洗操作产生的数据,

剩下的20%留给用户程序。用户可以自行调节这些选项来追求更好的性能表现。如果用户代码

上分配了大量的对象,那么降低RDD存储和数据混洗存储所占用的空间可以有效避免内存不足的情况。

除了调整内存各区域比例,还可以为一些工作负载改进缓存行为的某些要素。Spark默认的cache()操作

以MEMORY_ONLY的存储等级持久化数据。这意味着如果缓存新的RDD分区时空间不够,旧的分区就会直接被删除。

当用到这些分区数据时,再进行重新计算。所以有时以MONORY_AND_DISK的存储等级调用persist()方法会获得更好的

效果,因为i在这种存储等级下,内存中放不下的旧的分区会被写入磁盘,当再次需要用到的时候再从磁盘上

读取回来。这样的代价有可能比重新计算各分区要低很多,也可以带来更稳定的性能表现。当RDD分区的重算代价很大时,

这种设置尤其有用。

对于默认缓存策略的另一个改进是缓存序列化后的对象而非直接缓存。可以通过MEMORY_ONLY_SER 或者 MEMORY_AND_DISK_SER

的存储等级来实现这一点。缓存序列化后的对象会使缓存过程变慢,因为序列化对象也会消耗一些代价,

不过这可以显著减少JVM的垃圾回收时间,因为很多独立的记录现在可以作为单个序列化的缓存而存储。

垃圾回收的代价与堆里的对象数目相关,而不是和数据的字节数相关。这种缓存方式会把大量的对象

序列化为一个巨大的缓存区对象。如果需要以对象的形式缓存大量数据,或者是注意到了长时间的垃圾回收暂停,

可以考虑配置这个选项。这些暂停时间可以在应用界面中显示的每个任务的垃圾回收时间那一栏看到。

时间: 2024-10-17 09:55:25

RDD关键性能考量之 内存管理的相关文章

RDD关键性能考量之 并行度

<Spark快速大数据分析> 8.4 关键性能考量 并行度 RDD的逻辑表示其实是一个对象的集合.在物理执行期间,RDD会被分为一系列的分区, 每个分区都是整个数据的子集.当Spark调度并运行任务时,Spark会为每个分区中的数据 创建出一个任务,该任务在默认情况下会需要集群中的一个计算节点来执行. Spark也会针对RDD直接自动推断出合适的并行度,这对于大多数用例来说已经足够了. 输入RDD一般会根据其底层的存储系统选择并行度.例如,从HDFS上读数据的输入RDD 会为数据在HDFS上的

RDD关键性能考量之 序列化格式

<Spark快速大数据分析> 8.4.2 关键性能考量  序列化格式 当Spark需要通过网络传输数据,或是将数据写到磁盘上时,Spark需要把数据序列化为二进制格式. 序列化会在数据进行混洗操作时发生,此时有可能需要通过网络传输大量数据. 默认情况下,Spark会使用Java内建的序列化库.Spark也支持使用第三方序列化库Kryo, 可以提供比Java的序列化工具更短的序列化时间和更高压缩比的二进制表示,但不能直接序列化全部 类型的对象.几乎所有的应用都在迁移到Kryo后获得了更好的性能.

iOS性能优化之内存管理:Analyze、Leaks、Allocations的使用和案例代码 -[转载]

最近研究代码质量检测问题,在网上找的相关资料咱是如下: 一. 一些相关概念 很多人应该比较了解这块内容了...可以权当复习复习... 1.内存空间的划分: 我们知道,一个进程占用的内存空间,包含5种不同的数据区:(1)BSS段:通常是存放未初始化的全局变量:(2)数据段:通常是存放已初始化的全局变量.(3)代码段:通常是存放程序执行代码.(4)堆:通常是用于存放进程运行中被动态分配的内存段,OC对象(所有继承自NSObject的对象)就存放在堆里.(5)栈:由编译器自动分配释放,存放函数的参数值

常用Actoin算子 与 内存管理

一.常用Actoin算子 (reduce .collect .count .take .saveAsTextFile . countByKey .foreach ) collect:从集群中将所有的计算结果获取到本地内存,然后展示 take:从集群中将一部分的计算结果获取到本地内存,然后展示 rdd.collect rdd.take(n) 二.内存管理 1.RDD内存持久化

[Android 性能优化系列]内存之提升篇--应用应该如何管理内存

应用应该如何管理内存 在软件开发的各个阶段,你都应该时候注意你的RAM消耗(即便是在括软件的设计阶段).这里有很多种途径,通过使用它们可以帮助你设计和写出更有效率的代码, 你应该在设计和实现应用的时候采用以下的这些技术来让降低应用的内存消耗. 尽可能少的使用服务 如果你的应用需要使用服务来进行后台操作,那么尽可能让他在的确需要工作的时候才进行工作.另外请确保当你的工作完成之后结束掉你的服务. 当你开启一个服务的时候,系统会在服务运行的时候保留它的进程,这会让这个进行变得非 常庞大,因为服务所消耗

Java性能剖析]Sun JVM内存管理和垃圾回收

内存管理和垃圾回收是JVM非常关键的点,对Java性能的剖析而言,了解内存管理和垃圾回收的基本策略非常重要.本篇对Sun JVM 6.0的内存管理和垃圾回收做大概的描述. 1.内存管理      在程序运行过程当中,会创建大量的对象,这些对象,大部分是短周期的对象,小部分是长周期的对象,对于短周期的对象,需要频繁地进行垃圾回收以保证无用对象尽早被释放掉,对于长周期对象,则不需要频率垃圾回收以确保无谓地垃圾扫描检测.为解决这种矛盾,Sun JVM的内存管理采用分代的策略.      1)年轻代(Y

王家林谈Spark性能优化第十季之全球独家揭秘Spark统一内存管理!

内容: 1.传统的Spark内存管理的问题: 2.Spark统一内存管理: 3. 展望: ==========传统的Spark内存管理的问题============ Spark内存分为三部分: Execution:Shuffles.Joins.Sort.Aggregations等等,默认情况下占用,spark.shuffle.memoryfraction默认是0.2: Storage:Persist(Canche).Large Task Result.Torrent类型的Broadcast等,默

[Android 性能优化系列]内存之基础篇--Android怎样管理内存

大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地址:http://developer.android.com/training/articles/memory.html 在接下来的一段时间里,我会每天翻译一部分关于性能提升的Android官方文档给大家 以下是本次的正文: ################ 随机訪问存储器(Ram) 无论在哪种软件

Android手机内存管理与性能优化

Android手机内存管理与性能优化&JNI.NDK高级编程(JNI.Dalvik.内存监测) 课程分类:Android 适合人群:中级 课时数量:34小节课时 用到技术:Dalvik,DDMS,File Explorer,Adapter和图片处理,查询数据库和Static关键字使用及线程,JNI和NDK等 涉及项目:Android手机内存管理与性能优化,玩转JNI与NDK手机编程 咨询qq:1840215592 Android手机内存管理与性能优化详细介绍:http://www.dwz.cn/