Dare To Think, Strive To Execute

How to Checkpoint

背景

  最近在写一个KShell 算法,使用的是跟pagerank一样的数据集twitter,算法在小数据集上都没有问题,但是在集群上每次算法跑到90%的时候都出现stackoverflow,虽然之前写pagerank有经验,设置了checkpoint,但是跑了几次仍然是老毛病。

  在侯哥的帮助下,我发现设置checkpoint也有没用的时候,RDD不仅有个checkpoint,可以将RDD的lineage 截断,也有个函数isCheckPointed()来检测该RDD是否checkpoint成功了么。现在记录下这个很容易出错的大坑,积点儿人品。

1
2
3
4
5
val g = loadEdgeFile(sc, edge_pt, n_partition)
g.edges.foreachPartition(_ => Unit)
g.vertices.foreachPartition(_ => Unit)
g.checkpoint()
println(s"is cp: ${g.isCheckpointed }")

  这样返回checkpoint没有成功,因为之前g已经被物化了。

1
2
3
4
5
val g = loadEdgeFile(sc, edge_pt, n_partition)
g.checkpoint()
//g.edges.foreachPartition(_ => Unit)
g.vertices.foreachPartition(_ => Unit)
println(s"is cp: ${g.isCheckpointed }")

  这样返回checkpoint仍然没有成功,因为之前g只在checkpoint之后物化了vertices,edges没有物化,所以整个图仍然没有物化。

  work的checkpoint是这样的:

1
2
3
4
5
val g = loadEdgeFile(sc, edge_pt, n_partition)
g.checkpoint()
//g.edges.foreachPartition(_ => Unit)
g.vertices.foreachPartition(_ => Unit)
println(s"is cp: ${g.isCheckpointed }")

  只有在checkpoint之后,物化vertices以及edges,整个图的checkpoint才会成功。

总结

  最后总结一下,对于普通RDD,要像成功checkpoint,需要之前没有物化,chekpoint后物化它,对于像grpahx 中grpah这样的数据,不仅仅要物化vertice,还要物化edges,物化triplets没用,至于为什么物化triplets不行,我也没找到合理的解释。