我如何处理rdd协同输出,最终导致Spark中的可用内存更大?

时间:2019-01-15 04:37:29

标签: scala apache-spark dataframe rdd

我的作业执行过程中创建的结构非常大:

(Key, (Iterable[Object], Iterable[Object]))

对于每个键,我需要找到两个可迭代对象的叉积,以创建另一个对象,然后尝试尝试找到记录链接。有成千上万个键,并且两个对象可迭代项最多为1000个元素。两个对象对形成一行,然后将其输入到ml模型中,然后再提取信息并将其简化。

我遇到的问题是该模型需要一个数据框,并且由于叉积完成后所有行的大小较大,所以大小合理的群集无法无迭代地一次处理全部数量。

我估计每个对象的平均大小为2-3KB,因此由2个对象组成的行将为4-6KB。在减少之前,最终输出将约为200-300bytes。

当前代码类似于:

val a = rdd[object]  
val b = rdd[object]

def f1 = for a; for b; yield c  

ideal 
def f2 = for a; for b; create c - then pass c into model and yield d


val c = a.cogroup(b)
        .flatMap(f2)
        .reducebykey

如果我使用f1运行仅使用rdds和iterables的函数的代码,则作业将按预期完成。

目前,函数f2的问题在于它仅适用于该行的1个实例,但是模型需要一个数据框,因此使用示例集并保存中间步骤,我做了a.cogroup(b).write.parquet,然后重新读回并通过模型。对于完整的数据集,我无法执行a.cogroup(b).write.parquet,因为数据太大。但是,最终结果应该是易于装入内存的内容,如在平面图中输入f1所示。

我当时想在将行传递到模型之前,我可以尝试并行化行(行到dataframe [row]),然后将1个对象的数据帧传递到模型中,然后以这种方式提取数据,庞大的数据量,并希望按预期使用模型(一次传递许多行),我希望有一个更好的方法。

关于如何构造代码以使数据适合内存的任何想法(如果我将整个数据组作为一个整体在cogroup之后看待如何分解呢?)
在什么时候我要对数据框的一个或多个数据框进行材质化?
我应该重新考虑使用cogroup吗? (由于界面可迭代而使用)

再次感谢您的时间。

0 个答案:

没有答案