2017-10-18 107 views
-1

我有一个数据集是从卡桑德拉火花加载。加载这个数据集后,我将从cassandra中删除一些项目,但我希望我的数据集作为下一次计算的第一个数据集。我用persist(DISK_ONLY)来解决它,但它似乎尽力而为。 如何强制使用火花以避免重新计算?如何强制spark以避免数据集重新计算?

例如:

val dataset:Dataset[Int] = ??? // something from cassandra 
dataset.persist(StorageLevel.DISK_ONLY) // it's best effort 
dataset.count // = 2n 
dataset.persist(_ % 2 == 0).remove // remove from cassandra 
data.count // = n => I need orginal dataset here 
+0

@mrsrinivas火花缓存和持久性是最优化的方式。对他们没有保证。 –

+0

我同意,我从来没有提到任何地方DAG将跳过执行阶段。但是,如果rdd在任何阶段持续**,每次调用RDD时都不会重新计算RDD。 – mrsrinivas

回答

2

火花cache不旨在使用这种方式。这是一种优化,即使是最保守的((DISK_ONLY_2)),如果发生工人故障或退役,数据可能会丢失并重新计算。

Checkpoint到一个可靠的文件系统可能是一个更好的选择,但我怀疑可能会有一些边界情况下,这可能会导致数据丢失。

呦确保正确性我会强烈建议至少中间数据写入到永久存储,如分布式文件系统,并读:

dataset.write.format(...).save("persisted/location") 
... // Remove data from the source 
spark.read.format(...).load("persisted/location") //reading the same again