Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark unpersist()有不同的策略吗?_Apache Spark_Caching_Persist - Fatal编程技术网

Apache spark Spark unpersist()有不同的策略吗?

Apache spark Spark unpersist()有不同的策略吗?,apache-spark,caching,persist,Apache Spark,Caching,Persist,只是在spark unpersist上做了一些实验,对它的实际功能感到困惑。我在谷歌上搜索了很多次,几乎所有的人都说不持久者会立即将RDD从excutor的记忆中驱逐出去。但是在这个测试中,我们可以看到它并不总是正确的。请参见下面的简单测试: private static int base = 0; public static Integer[] getInts(){ Integer[] res = new Integer[5]; for(int i=0;i<5;i++){

只是在spark unpersist上做了一些实验,对它的实际功能感到困惑。我在谷歌上搜索了很多次,几乎所有的人都说不持久者会立即将RDD从excutor的记忆中驱逐出去。但是在这个测试中,我们可以看到它并不总是正确的。请参见下面的简单测试:

private static int base = 0;
public static Integer[] getInts(){
    Integer[] res = new Integer[5];
    for(int i=0;i<5;i++){
        res[i] = base++;
    }
    System.out.println("number generated:" + res[0] + " to " + res[4] + "---------------------------------");
    return res;
}

public static void main( String[] args )
{
    SparkSession sparkSession = SparkSession.builder().appName("spark test").getOrCreate();
    JavaSparkContext spark = new JavaSparkContext(sparkSession.sparkContext());

    JavaRDD<Integer> first = spark.parallelize(Arrays.asList(getInts()));
    System.out.println("first: " + Arrays.toString(first.collect().toArray()));  // action
    first.unpersist();
    System.out.println("first is unpersisted");

    System.out.println("compute second ========================");
    JavaRDD<Integer> second = first.map(i -> {
        System.out.println("double " + i);
        return i*2;
    }).cache();  // transform
    System.out.println("second: " + Arrays.toString(second.collect().toArray()));  // action
    second.unpersist();

    System.out.println("compute third ========================");
    JavaRDD<Integer> third = second.map(i -> i+100);  // transform
    System.out.println("third: " + Arrays.toString(third.collect().toArray()));  // action
}
正如我们所看到的,非持久性“first”是无用的,它不会重新计算。 但不持久的“秒”将触发重新计算。 任何人都可以帮我弄清楚为什么非持久性“first”不会触发重新计算?如果我想强制将“第一个”从内存中删除,我该怎么做?parallelize或textFile API中是否有针对RDD的特殊功能?
谢谢

此行为与缓存和取消持久化无关。事实上,第一个甚至没有被坚持,尽管在这里它不会有太大的区别

并行化时,传递一个本地的非分布式对象。parallelize以值为参数,其生命周期完全超出Spark的范围。因此,一旦ParallelCollectionRDD被初始化,Spark根本没有理由重新计算它。如果您想分发不同的集合,只需创建一个新的RDD

还值得注意的是,unpersist可以在阻塞模式和非阻塞模式下调用,具体取决于阻塞参数

number generated:0 to 4---------------------------------
first: [0, 1, 2, 3, 4]
first is unpersisted
compute second ========================
double 0
double 1
double 2
double 3
double 4
second: [0, 2, 4, 6, 8]
compute third ========================
double 0
double 1
double 2
double 3
double 4
third: [100, 102, 104, 106, 108]