Java 如何使用RDD持久化和缓存?

Java 如何使用RDD持久化和缓存?,java,apache-spark,spark-streaming,Java,Apache Spark,Spark Streaming,请告诉我如何使用RDD方法Persist()和Cache(),这似乎适用于我通常用java编写的常规程序,比如sparkStreaming,它是DAG的持续执行,每次RDD的值都会得到更新,因此perist/Cache也会被再次调用&再次调用,并会导致覆盖该RDD 但是,正如下面的文档所示,这些方法似乎仅对交互式shell有用,或者与仅将所需的RDD存储在任何引用变量中相比,我是否可以在顺序程序中更有效地使用缓存/持久RDD scala> linesWithSpark.cache() r

请告诉我如何使用RDD方法Persist()和Cache(),这似乎适用于我通常用java编写的常规程序,比如sparkStreaming,它是DAG的持续执行,每次RDD的值都会得到更新,因此perist/Cache也会被再次调用&再次调用,并会导致覆盖该RDD

但是,正如下面的文档所示,这些方法似乎仅对交互式shell有用,或者与仅将所需的RDD存储在任何引用变量中相比,我是否可以在顺序程序中更有效地使用缓存/持久RDD

scala> linesWithSpark.cache()
res7: spark.RDD[String] = spark.FilteredRDD@17e51082

scala> linesWithSpark.count()
res8: Long = 19

scala> linesWithSpark.count()
res9: Long = 19
VS

在顺序火花流作业中,我认为这是非常相同的,不会被反复评估

JavaRDD sortedRDD =baseRDD.filter(f(x));

sortedRDD.count();
sortedRDD.saveAsNewHadoopAPIFile();
// Or Anything we want !   

如果您能帮助解决这个疑问,我将不胜感激。

Spark最重要的功能之一是跨操作在内存中持久化(或缓存)数据集。在持久化RDD时,每个节点将其计算的任何分区存储在内存中,并在该数据集(或从该数据集派生的数据集)上的其他操作中重用这些分区。这使得未来的行动更快(通常超过10倍)。缓存是迭代算法和快速交互使用的关键工具。 可以使用RDD上的persist()或cache()方法将其标记为持久化。第一次在操作中计算它时,它将保存在节点上的内存中。Spark的缓存是容错的——如果RDD的任何分区丢失,它将使用最初创建它的转换自动重新计算。 cache()方法是使用默认存储级别的缩写,默认存储级别为StorageLevel.MEMORY_ONLY(将反序列化对象存储在内存中)


它什么也不做。缓存也是一种惰性操作。文件仍未读取。但是现在RDD说“读取这个文件,然后缓存内容”。如果随后第一次运行linesWithSpark.count,将加载、缓存和计数该文件。如果再次调用linesWithSpark.count,该操作将使用缓存。它将只从缓存中获取数据并计算行数。

缓存和持久化都用于保存Spark RDD、Dataframe和Dataset。但是,不同之处在于,RDD
cache()
方法默认将其保存到内存(仅内存),而
persist()
方法用于将其存储到用户定义的存储级别

持久化数据集时,每个节点将其分区数据存储在内存中,并在该数据集上的其他操作中重用它们。Spark在节点上的持久化数据是容错的,这意味着如果数据集的任何分区丢失,它将使用创建它的原始转换自动重新计算

Dataset类中的Spark
cache()
方法在内部调用
persist()
方法,该方法依次使用sparkSession.sharedState.cacheManager.cacheQuery缓存DataFrame或Dataset的结果集

 import spark.implicits._

val columns = Seq("Seqno","Quote")
  val data = Seq(("1", "Be the change that you wish to see in the world"),
    ("2", "Everyone thinks of changing the world, but no one thinks of changing himself."),
    ("3", "The purpose of our lives is to be happy."))
  val df = data.toDF(columns:_*)

  val dfCache = df.cache()
  dfCache.show(false)
Spark
persist
有两个签名第一个签名不接受任何参数,默认情况下将其保存到内存和磁盘存储级别,第二个签名将StorageLevel作为参数存储到不同的存储级别

val dfPersist = df.persist()
dfPersist.show(false)
使用第二个签名,您可以将数据帧/数据集保存到以下存储级别之一:仅内存、仅内存和磁盘、仅内存和磁盘、仅内存和磁盘、仅磁盘、仅内存和磁盘2、内存和磁盘2

val dfPersist = df.persist(StorageLevel.MEMORY_ONLY)
dfPersist.show(false)

如果有帮助,请告诉我。

在pyspark v 2.1.1中,我认为需要分配缓存。e、 g.
linesWithSpark=linesWithSpark.cache()
。上面给出的示例没有加速重复计数。
val dfPersist = df.persist(StorageLevel.MEMORY_ONLY)
dfPersist.show(false)