为什么我在Spark Dataset执行中找不到跳过的阶段

时间:2019-02-24 02:13:42

标签: apache-spark

在数据集的情况下,我试图了解火花的执行情况。

对于RDD,我在下面的Spark Docs中找到了

  

随机播放还会在磁盘上生成大量中间文件。从Spark 1.3开始,将保留这些文件,直到不再使用相应的RDD并进行垃圾回收为止。这样做是为了在重新计算沿袭时不需要重新创建随机文件。

我尝试使用RDD和Dataset运行类似的东西,以防我在RDD中获得Dataset执行的情况下没有跳过的阶段。我是否需要在代码中做任何提示以保存随机播放。我的意思是我想要数据集应该在作业之间共享随机播放文件。如果我将数据集转换为RDD,然后再次返回到数据集,则可以看到跳过的阶段(我正在使用spark 2.3)

Dataset<Long> rangeDs = session.range(0L, 2000000L);
Dataset<Tuple2<Long,Long>> rangePairDsGbk =  rangeDs.groupByKey(new 
MapFunction<Long, Long>(){

private static final long serialVersionUID = 1L;

@Override
public Long call(Long value) throws Exception {
    return value;
}
}, Encoders.LONG()).reduceGroups(new ReduceFunction<Long>() {

private static final long serialVersionUID = 1L;

@Override
public Long call(Long v1, Long v2) throws Exception {
    return 1L;
}
});
rangePairDsGbk.count(); //Full Re-Computation
rangePairDsGbk.count();//Full Re-Computation (why this job is doing Full Re- 
computation)

JavaRDD<Long> rangeRdd = session.range(0L, 2000000L).toJavaRDD();
JavaPairRDD<Long, Long> rangePairRddRbk = rangeRdd.mapToPair(new 
PairFunction<Long, Long, Long>() {

private static final long serialVersionUID = 1L;

@Override
public Tuple2<Long, Long> call(Long t) throws Exception {
    return new Tuple2<Long, Long>(t, t);
}
}).reduceByKey(new Function2<Long, Long, Long>() {

private static final long serialVersionUID = 1L;

@Override
public Long call(Long v1, Long v2) throws Exception {
    return 1L;
}
}, 200);
rangePairRddRbk.count();//Full Re-Computation
rangePairRddRbk.count();//Partial Re-Computation (Only Shuffle Read as 
Expected)

0 个答案:

没有答案