D. *_*ler 7 memory caching memory-management apache-spark rdd
我正在构建一个Spark应用程序,我必须缓存大约15 GB的CSV文件.我UnifiedMemoryManager在这里阅读了Spark 1.6中引入的新内容:
https://0x0fff.com/spark-memory-management/
者之间的不同之User Memory和Spark Memory(其被再次分裂成Storage and Execution Memory).正如我所说,Spark Memory可以灵活地执行(shuffle,sort等)和存储(缓存)东西 - 如果需要更多内存,它可以从其他部分使用它(如果还没有完全使用).这个假设是否正确?
用户内存描述如下:
用户记忆.这是分配Spark Memory后剩余的内存池,完全取决于您喜欢的方式使用它.您可以在那里存储将在RDD转换中使用的数据结构.例如,您可以通过使用mapPartitions转换维护散列表来重写Spark聚合,以便运行此聚合,这将消耗所谓的用户内存.[...]再一次,这是用户存储器,它完全取决于你将存储在这个RAM中的内容以及如何,Spark完全没有考虑你在那里做什么以及你是否尊重这个边界.不遵守代码中的此边界可能会导致OOM错误.
如何访问这部分内存或者如何通过Spark管理?
为了我的目的,我只需要有足够的存储空间(因为我不做洗牌,加入等事情)?那么,我可以将spark.memory.storageFraction属性设置为1.0吗?
对我来说最重要的问题是,用户记忆怎么样?为什么它,特别是我上面描述的目的?
当我改变程序使用一些自己的类时,使用内存是否有区别,例如,RDD<MyOwnRepresentationClass>而不是RDD<String>?
这是我的代码片段(Livy Client在基准测试应用程序中多次调用它.我使用Spark 1.6.2和Kryo序列化.
JavaRDD<String> inputRDD = sc.textFile(inputFile);
// Filter out invalid values
JavaRDD<String> cachedRDD = inputRDD.filter(new Function<String, Boolean>() {
@Override
public Boolean call(String row) throws Exception {
String[] parts = row.split(";");
// Some filtering stuff
return hasFailure;
}
}).persist(StorageLevel.MEMORY_ONLY_SER());
Run Code Online (Sandbox Code Playgroud)
统一内存管理器
1) on HEAP:对象在JVM堆上分配并由GC绑定。
2)OFF HEAP:对象通过序列化的方式分配在JVM之外的内存中,由应用程序管理,不受GC的约束。这种内存管理方式可以避免频繁的GC,但缺点是你必须自己编写内存分配和内存释放的逻辑。
在堆上:
Storage Memory:主要用于存储Spark缓存数据,如RDD缓存、Broadcast变量、Unroll数据等。
Execution Memory/shuffle memory:主要用于存储Shuffle、Join、Sort、Aggregation等计算过程中的临时数据。
用户内存:主要用于存储RDD转换操作所需的数据,例如RDD依赖关系的信息。
预留内存:该内存是为系统预留的,用于存储Spark的内部对象。
OFF HEAP 内存: - 1) 存储内存(随机内存) 2) 执行内存
| 归档时间: |
|
| 查看次数: |
1621 次 |
| 最近记录: |