如何了解Apache GraphX的pregel实现中的maxIterations

时间:2019-05-19 15:48:05

标签: apache-spark iteration spark-graphx

官方解释是 maxIterations 将用于非收敛算法。 我的问题是:如果我不知道,算法的收敛性如何设置maxIterations的值? 而且,如果有收敛算法,那么该值的含义是什么?

顺便说一句,我也对预凝胶的“重复”感到困惑。 代码如何执行计为迭代?

这是pregel源代码的一部分:

// Loop
var prevG: Graph[VD, ED] = null
var i = 0
while (activeMessages > 0 && i < maxIterations) {
  // Receive the messages and update the vertices.
  prevG = g
  g = g.joinVertices(messages)(vprog)
  graphCheckpointer.update(g)

  val oldMessages = messages
  // Send new messages, skipping edges where neither side received a message. We must cache
  // messages so it can be materialized on the next line, allowing us to uncache the previous
  // iteration.
  messages = GraphXUtils.mapReduceTriplets(
    g, sendMsg, mergeMsg, Some((oldMessages, activeDirection)))
  // The call to count() materializes `messages` and the vertices of `g`. This hides oldMessages
  // (depended on by the vertices of g) and the vertices of prevG (depended on by oldMessages
  // and the vertices of g).
  messageCheckpointer.update(messages.asInstanceOf[RDD[(VertexId, A)]])
  activeMessages = messages.count()

  logInfo("Pregel finished iteration " + i)

  // Unpersist the RDDs hidden by newly-materialized RDDs
  oldMessages.unpersist(blocking = false)
  prevG.unpersistVertices(blocking = false)
  prevG.edges.unpersist(blocking = false)
  // count the iteration
  i += 1
}

谢谢您的慷慨答谢:)

1 个答案:

答案 0 :(得分:0)

maxIterations用于确保算法终止。 请注意,Pregel只是一个范例,因此其收敛取决于您的算法( service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow write: if request.auth.uid == userId; allow read; match /{allSubcollections=**} { allow write: if request.auth.uid == userId; allow read; } } } } sendMessage)。这就是为什么我们确定算法会收敛时使用vertexProgram作为最大迭代次数的原因。

如果您不确定算法的终结点,最好根据经验测试进行设置。例如,如果您的算法是一种可以优化某些值的启发式算法,那么显而易见,最大值越大,越接近你是你的目标。在这里,您可以根据需要使用多少时间和资源来决定何时停止(例如100次迭代)。

最后,代码使用变量Int.MaxValue来计算迭代次数,并在每次迭代时递增。当i达到最大迭代次数时,甚至在没有消息交换时(算法收敛时),Pregel就会停止。