gpt4 book ai didi

java - Spark中如何只缓存部分RDD?

转载 作者:太空宇宙 更新时间:2023-11-04 10:19:37 26 4
gpt4 key购买 nike

我有一个PairRDD<Metadata, BigData> .

我想要执行两项操作:一项针对 RDD 中的所有数据然后仅对元数据执行另一个操作。

输入来自读取大量文件,我不想重复。

我知道最经典的做法是使用 cache()persist()在输入 RDD 上,以便将其保存在内存中:

JavaPairRDD<Metadata, Bigdata> inputRDD = expensiveSource();
JavaPairRDD<Metadata, Bigdata> cachedRDD = inputRDD.cache();
cachedRDD.foreach(doWorkOnAllData);
cachedRDD.keys().foreach(doWorkOnMetadata);

问题是输入太大以至于无法放入内存并且 cache()因此不执行任何操作。

我可以使用persist()将其缓存在磁盘上,但由于数据太大,保存和读取所有数据实际上会比读取原始源慢。

我可以使用MEMORY_SERDE获得一点空间,但这可能还不够,即使当我只对 0.1% 的数据感兴趣时序列化整个事情也显得很愚蠢。

我想要的是只缓存我的 PairRDD 的关键部分。我想我可以通过调用 cache() 来做到这一点关于keys() RDD :

JavaPairRDD<Metadata, Bigdata> inputRDD = expensiveSource();
JavaRDD<Metadata, Bigdata> cachedRDD = inputRDD.keys().cache();
inputRDD.foreach(doWorkOnAllData);
cachedRDD.foreach(doWorkOnMetadata);

但在这种情况下,它似乎没有缓存任何内容,只是返回加载源。

是否可以只将部分数据放入缓存?对元数据的操作小得离谱,但我必须在对整个数据进行操作之后再进行。

最佳答案

如果您调用 inputRDD.keys(),Spark 只会从缓存加载您的 RDD

您可以尝试的是:JavaRDD<Metadata> keys = inputRDD.keys().cache();缓存您的 JavaRDD<Metadata>

然后要制作你的缓存RDD:

JavaRDD<Metadata,Bigdata> cachedRDD = keys.join(JavaPairRDD<Bigdata>)

此外,如果您的 RDD 很大,第一次从缓存读取速度最慢,因为您必须保存 RDD,但下次读取它时,速度会更快。

关于java - Spark中如何只缓存部分RDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51313594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com