在数据集的情况下,我试图了解火花的执行情况。
对于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)