我需要为庞大的数据集找到连接的组件。(图形为无向(
一个明显的选择是MapReduce。但是我是MapReduce的新手,没有时间拿起它并自己编写代码。
我只是想知道是否有任何现有的API,因为它是社交网络分析中非常普遍的问题?
或者至少如果有人知道任何可靠的(经过试验和测试的(来源,至少我可以自己开始使用实施?
谢谢
我为自己写了博客:
http://codingwiththomas.blogspot.de/2011/04/graph-exploration-with-hadoop-mapreduce.html
但是MapReduce并不适合这些图分析的东西。为此,最好使用BSP(批量同步并行(,Apache Hama在Hadoop HDFS之上提供了一个很好的图形API。
我在这里用MapReduce编写了一个连接组件算法:(Mindist search(
https://github.com/thomasjungblut/tjungblut-graph/tree/master/src/de/jungblut/graph/mapreduce
Apache Hama的BSP版本也可以在这里找到:
https://github.com/thomasjungblut/tjungblut-graph/blob/master/src/de/jungblut/graph/bsp/MindistSearch.java
实现并不像MapReduce那样困难,而且至少快10倍。如果您有兴趣,请查看 TRUNK 中的最新版本并访问我们的邮件列表。
http://hama.apache.org/
http://apache.org/hama/mail-lists.html
我真的不知道是否有可用的 API,它具有查找强连接组件的方法。但是,我实现了BFS算法来查找从源节点到图中所有其他节点的距离(该图是一个有向图,大到6500万个节点(。
这个想法是在一次迭代中探索每个节点的邻居(距离为 1(,并将 reduce 的输出反馈回映射,直到距离收敛。映射从每个节点发出尽可能短的距离,并减少更新的节点与列表的最短距离。
我建议检查一下。此外,这可能会有所帮助。这两个链接将为您提供有关mapreduce范式中图形算法的基本概念(如果您已经不熟悉(。本质上,您需要扭曲算法以使用 DFS 而不是 BFS。
你可能想看看卡内基梅隆大学的Pegasus项目。它们使用MapReduce提供了一个高效而优雅的实现。它们还提供二进制文件、示例和非常详细的文档。
该实现本身基于U Kang在2009年提出的广义迭代矩阵-向量乘法(GIM-V(。
PEGASUS:PBA级图挖掘系统 - 实现和观察 U Kang, Charalampos E. Tsourakakis, Christos Faloutsos InIEEE数据挖掘国际会议(ICDM 2009(
编辑:官方实现实际上仅限于 21 亿个节点(节点 id 存储为整数(。我正在 github (https://github.com/placeiq/pegasus( 上创建一个分支来分享我的补丁和其他增强功能(例如。快速压缩(。
这是一个有点老的问题,但这里有你想要检查的东西。 我们在Spark平台上使用map-reduce实现了连接组件。
https://github.com/kwartile/connected-component
尝试 GraphScope 中内置的 WCC 算法,它完全适合您的需求。
GraphScope是一个分布式图形平台,具有许多现成的算法。
回到您的问题,可以通过3个步骤完成:
- 启动 GraphScope 集群
- 加载图形
- 在其上运行 WCC 并检索结果。
这是代码
import graphscope
sess = graphscope.session(num_workers=4)
graph = sess.g()
graph = graph.add_edges('/path/to/dataset')
result = graphscope.wcc(graph, src=0)
print(result.to_dataframe(selector={'id': 'v.id', 'distance': 'r'})
sess.close()
您可以参考本文来了解如何部署 graphscope,并参考本文来学习如何通过 helm 进行部署。