自从解决spark的问题:如何解决spark大量连续计算卡死的问题?,我得开始考虑如何更快!
4个rdd,都是十万左右的数据量,相互关联计算,共计算两百多次。每隔10个计算来一次checkpoint,执行3次,反正就是每次数据和计算量都一样,来对比checkpoint和localCheckpoint性能。
1.使用hive 保存中间结果,代替checkpoint
var table = "tabaleName"
dataset.write.mode(SaveMode.Overwrite).saveAsTable(table)
dataset = spark.table(table)
平均执行完耗时:3min50s
2.dataset=dataset.localCheckpoint()
平均执行完耗时:3min7s
注:没有跟着执行action算子,其实一个dataset也就执行了一次checkpoint
3.dataset=dataset.checkpoint()
平均执行完耗时:3min29s
注:没有跟着执行action算子,其实一个dataset也就执行了一次checkpoint
虽然官方说localcheckpoint可能会快但也有导致job失败的风险(Local checkpoints are written to executor storage and despite potentially faster they are unreliable and may compromise job completion),但这个快的优势,和忽略不计的风险,我还是选速度。
第一种方法很快,我觉得是因为及时执行了得原因,而checkpoint没有及时执行action算子,下面加上action算子试一下。
4.dataset=dataset.localCheckpoint();dataset.show();
平均执行完耗时:2min57s
确实更快
5.dataset=dataset.localCheckpoint();dataset.count();
平均执行完耗时:2min58s
和show算子差不多
猪说使用chache一起效果更佳,只用chache不用checkpoint肯定是会卡死的
6.dataset.persist();dataset=dataset.localCheckpoint();dataset.show();
dataset.persist()
var newDs=dataset.localCheckpoint()
newDs.show()
newDs
平均执行完耗时:3min4s
7.每隔5个计算执行一次checkpoint
平均执行完耗时:3min8s
没有什么作用
总结直接使用方案4,先localCheckPoint,再调用show action算子,基本上就最优了。