派斯帕克。内存不足问题。如何确保表被覆盖

我目前尝试了解 Spark 计算的过程以及对内存消耗的影响。


我正在 Zeppelin 中使用 Spark 2.3.2 和 Python 2.7。


基本上在下面的循环中,我正在创建集合。我正在使用 sci-kit-learn 构建机器学习模型,并且在 sci-kit-learn 计算之后我正在对 pyspark-dataframes 进行大量数据帧操作。对于每个 i 我得到一个表 rsmeMaeStep,其中有 8 行和 10 列,带有小字符串或双精度值。rsmeMaeAll 只是将单个分析加在一起,并且有 8*26 =208 行和 10 列 i=26。


for i in range(26):

    df_features_train, df_features_validation = randomizer(dataFiltered)

    rsmeMaeStep, rsmeMaeAll = rsmeMaeAnalysis(rsmeMaeAll,df_features_train,df_features_test)

    print(i)

我对代码做了一些时间分析。对于 i=1,i=10 需要 17 秒:对于 i =26,需要 2:40 分钟,需要 6:42。(即 10 或 26 个循环的 9.4 或 23.6 倍长。)到目前为止,一切都符合预期。我在下一步中遇到问题。下面的代码应该只是对 8 到 206 行的简单聚合。对于 i=1 需要 32 秒,对于 i=7 4:43(长 8.8 倍)但是对于 i=26 我在 47 分钟后有 0% 或者它失败并显示内存不足消息。


rsmeMae = rsmeMaeAll.select('set','setting','sme').orderBy('set','setting')

import pyspark.sql.functions as f

rsmeMaeAverage = rsmeMae.groupBy('setting','set').agg(f.count(('setting')).alias('nrOfRand'), f.round(f.mean('sme'),2).alias('rsme'),f.round(f.stddev('sme'),2).alias('sigmaRsme')).orderBy('set','setting')

z.show(rsmeMaeAverage)

基于我认为所有表都应该在每个循环中被覆盖的逻辑。每个循环中,只有小的 rsmeMaeAll 应该增加一点。但它仍然是一张很小的桌子。


但 Spark 的行为可能有所不同。


据我了解情况,第一步的sk-learn代码是在第一步中执行的。如果我确实正确理解了 spark 延迟评估,那么当我想打印结果时,我的代码中的 pySpark 操作就会开始执行。因此,Spark 可能会将所有循环的所有表都保存在内存中。那正确吗?


如果我是对的,我将需要在每个循环结束时直接计算 pySpark 代码的代码。


我该怎么做?


如果我这样做会在下一个循环中触发覆盖表,还是每次循环都会增加内存消耗?我是否需要从内存中主动删除表以及如何删除?


编辑:我刚刚整合


rsmeMaeStep.collect()

rsmeMaeAll.collect()

进入循环以确保 pyspark 计算立即完成。但是第一个循环用了 55 秒。第 7 个循环用了 10 多分钟,49 分钟后它在第 8 个循环的 rsmeMaeAll.collect() 处崩溃。随着错误消息:


Py4JJavaError:调用 o13488.collectToPython 时出错。:java.lang.OutOfMemoryError: Java 堆空间


我真的不明白每个循环时间的指数增长。在我至少能够运行 10 个循环之前。那里发生了什么?


喵喔喔
浏览 91回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python