我在写一个图形相关的程序Scala
用Spark
.数据集有400万个节点和400万个边缘(你可以将它视为一棵树),但是每次(a Iteration
),我只编辑它的一部分,即由给定节点生根的子树和节点在给定节点和根之间的路径中.
该Iteration
有依赖,这意味着i+1
Iteration
需求的结果来自何处i
.所以我需要将每个结果存储到Iteration
下一步.
我试图找到一种有效的更新方法RDD
,但到目前为止还没有任何线索.我发现PairRDD
有一个lookup
函数可以将计算时间减少O(N)
到O(M
),N
表示对象的总数RDD
并M
表示数量每个分区中的元素.
所以我想反正有我可以更新的对象RDD
有O(M)
?或者更理想的是,O(1)?(我在Spark的邮件列表中看到一封电子邮件说lookup
可以修改以实现O(1))
另一件事是,如果我可以实现O(M)
更新RDD
,我可以将分区增加到比我拥有的内核数量更大的数量并获得更好的性能吗?
作为功能数据结构,RDD是不可变的,并且RDD上的操作生成新的RDD.
结构的不变性并不一定意味着完全复制.持久性数据结构是一种常见的功能模式,其中对不可变结构的操作产生新结构,但先前版本被维护并经常被重用.
GraphX(Spark之上的'模块')是一个基于Spark的图形API,它使用了这样的概念:来自docs:
通过生成具有所需更改的新图来完成对图的值或结构的更改.请注意,原始图形的大部分(即,未受影响的结构,属性和指标)在新图形中重复使用,从而降低了此固有功能数据结构的成本.
它可能是解决手头问题的解决方案:http://spark.apache.org/docs/1.0.0/graphx-programming-guide.html