Spark列出所有缓存的RDD名称

时间:2016-07-21 15:39:35

标签: scala apache-spark dataframe rdd

我是Apache Spark的新手,我创建了几个RDD和DataFrames,缓存了它们,现在我想通过使用下面的命令来解决其中的一些问题

rddName.unpersist()

但我不记得他们的名字。我使用sc.getPersistentRDDs但输出不包含名称。我还使用浏览器查看缓存的rdds,但同样没有名称信息。我错过了什么吗?

4 个答案:

答案 0 :(得分:5)

PySparkers:getPersistentRDDs isn't yet implemented in Python,所以通过浸入Java来解决你的RDD:

for (id, rdd) in spark.sparkContext._jsc.getPersistentRDDs().items():
    rdd.unpersist()

答案 1 :(得分:4)

@Dikei的答案实际上是正确的,但我相信你要找的是scala> val rdd1 = sc.makeRDD(1 to 100) # rdd1: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[0] at makeRDD at <console>:27 scala> val rdd2 = sc.makeRDD(10 to 1000) # rdd2: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[1] at makeRDD at <console>:27 scala> rdd2.cache.setName("rdd_2") # res0: rdd2.type = rdd_2 ParallelCollectionRDD[1] at makeRDD at <console>:27 scala> sc.getPersistentRDDs # res1: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(1 -> rdd_2 ParallelCollectionRDD[1] at makeRDD at <console>:27) scala> rdd1.cache.setName("foo") # res2: rdd1.type = foo ParallelCollectionRDD[0] at makeRDD at <console>:27 scala> sc.getPersistentRDDs # res3: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(1 -> rdd_2 ParallelCollectionRDD[1] at makeRDD at <console>:27, 0 -> foo ParallelCollectionRDD[0] at makeRDD at <console>:27)

RDD

现在让我们添加另一个scala> rdd3.setName("bar") # res4: rdd3.type = bar ParallelCollectionRDD[2] at makeRDD at <console>:27 scala> sc.getPersistentRDDs # res5: scala.collection.Map[Int,org.apache.spark.rdd.RDD[_]] = Map(1 -> rdd_2 ParallelCollectionRDD[1] at makeRDD at <console>:27, 0 -> foo ParallelCollectionRDD[0] at makeRDD at <console>:27) 并为其命名:

Collectors#groupingBy

我们注意到它实际上并没有持久存在。

答案 2 :(得分:1)

执行此操作的标量通用方法...在Spark上下文中循环获取所有持久性RDD和unpersist

我将在驱动程序末尾使用它。

for ( (id,rdd) <- sparkSession.sparkContext.getPersistentRDDs ) {
      log.info("Unexpected cached RDD " + id)
      rdd.unpersist()
    }

这样做的Java通用方法...其中jsc是JavaSparkContext

 if (jsc != null) {
                Map<Integer, JavaRDD<?>> persistentRDDS = jsc.getPersistentRDDs();
                // using for-each loop for iteration over Map.entrySet()
                for (Map.Entry<Integer, JavaRDD<?>> entry : persistentRDDS.entrySet()) {
                    LOG.info("Key = " + entry.getKey() +
                            ", un persisting cached RDD = " + entry.getValue().unpersist());
                }

            }

Java中unpersist的另一种简短形式,没有rdd名称:

Map<Integer, JavaRDD<?>> persistentRDDS = jsc.getPersistentRDDs();
persistentRDDS.values().forEach(JavaRDD::unpersist);

答案 3 :(得分:0)

rrdName变量没有特殊含义。它只是对RDD的引用。例如,在以下代码中

val rrdName: RDD[Something]
val name2 = rrdName

name2rrdName是指向同一RDD的两个引用。致电name2.unpersist与致电rrdName.unpersist相同。

如果你想要unpersist一个RDD,你必须手动保留对它的引用。