2017-10-18 15 views
-1

J'ai un jeu de données qui est chargé de cassandra dans l'étincelle. Après avoir chargé cet ensemble de données, je vais supprimer certains éléments de cassandra, mais je veux que mon ensemble de données soit le premier pour le prochain calcul. J'ai utilisé persist(DISK_ONLY) pour le résoudre, mais il semble au mieux. Comment puis-je forcer une étincelle pour éviter le recalcul?Comment forcer une étincelle pour éviter le recalcul du jeu de données?

exemple:

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 cache d'allumage et la persistance est ainsi d'optimisation. Il n'y a aucune garantie sur eux. –

+0

Je suis d'accord, je n'ai jamais mentionné nulle part que DAG sautera cette étape de l'exécution. Mais ** RDD ne sera pas recalculé chaque fois que l'action appelée si rdd persiste ** à tout moment. – mrsrinivas

Répondre

2

Spark cache n'est pas destiné à être utilisé de cette façon. C'est une optimisation, et même avec le StorageLevels (DISK_ONLY_2) le plus conservateur, les données peuvent être perdues et recalculées en cas de panne ou de désaffectation du travailleur. Un système de fichiers fiable pourrait être une meilleure option, mais je soupçonne qu'il pourrait y avoir des cas de frontière, ce qui peut entraîner la perte de données.

Yo de garantir l'exactitude Je recommande fortement au moins d'écrire des données intermédiaires à un stockage persistant, comme le système de fichiers distribué, et en les lisant:

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