【发布时间】:2017-10-01 01:55:45
【问题描述】:
我正在构建一个 Spark 应用程序,我必须在其中缓存大约 15 GB 的 CSV 文件。我在这里了解了 Spark 1.6 中引入的新 UnifiedMemoryManager:
https://0x0fff.com/spark-memory-management/
作者在User Memory 和Spark Memory 之间有所不同(又分为Storage and Execution Memory)。据我了解,Spark Memory 可以灵活地执行(随机播放、排序等)和存储(缓存)内容 - 如果需要更多内存,它可以从另一部分使用它(如果尚未完全使用)。这个假设正确吗?
用户内存是这样描述的:
用户内存。这是分配 Spark Memory 后剩余的内存池,完全取决于您以您喜欢的方式使用它。您可以在那里存储您自己的数据结构,用于 RDD 转换。例如,您可以通过使用 mapPartitions 转换维护哈希表来重写 Spark 聚合以运行此聚合,这将消耗所谓的用户内存。 [...] 再次,这是用户内存,它完全取决于您将在此 RAM 中存储什么以及如何存储,Spark 完全不考虑您在那里做什么以及您是否尊重此边界。在您的代码中不遵守此边界可能会导致 OOM 错误。
我如何访问这部分内存或 Spark 如何管理这部分内存?
为了我的目的,我只需要有足够的存储内存(因为我不做随机播放、加入等操作)?那么,我可以将spark.memory.storageFraction 属性设置为1.0 吗?
对我来说最重要的问题是,用户内存呢?为什么呢,特别是为了我上面描述的目的?
当我将程序更改为使用一些自己的类时,使用内存是否有区别,例如RDD<MyOwnRepresentationClass> 而不是 RDD<String>?
这是我的代码 sn-p(在基准应用程序中从 Livy Client 多次调用它。我正在使用带有 Kryo 序列化的 Spark 1.6.2。
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());
【问题讨论】:
标签: caching apache-spark memory memory-management rdd