4

可以说我有大量的图形文件,每个图形都有大约500K的边缘。我一直在Apache Spark上处理这些图形文件,我想知道如何高效地并行化整个图形处理工作。因为现在,每个图形文件都是独立的,我正在寻找与文件并行的方式。因此,如果我有100个图形文件,而且有20个节点群集,我可以处理每个节点上的每个文件,因此每个节点将处理5个文件。现在,发生的事情就像单个图正在处理多个阶段,这导致了很多混洗。如何处理Apache Spark中群集节点之间独立处理的不同图形文件?

graphFile = "/mnt/bucket/edges" #This directory has 100 graph files each file with around 500K edges 

nodeFile = "/mnt/bucket/nodes" #This directory has node files 

graphData = sc.textFile(graphFile).map(lambda line: line.split(" ")).flatMap(lambda edge: [(int(edge[0]),int(edge[1]))]) 

graphDataFrame = sqlContext.createDataFrame(graphData, ['src', 'dst']).withColumn("relationship", lit('edges')) # Dataframe created so as to work with Graphframes 

nodeData = sc.textFile(nodeFile).map(lambda line: line.split("\s")).flatMap(lambda edge: [(int(edge[0]),)]) 

nodeDataFrame = sqlContext.createDataFrame(nodeData, ['id']) 

graphGraphFrame = GraphFrame(nodeDataFrame, graphDataFrame) 

connectedComponent = graphGraphFrame.connectedComponents() 

事情是它需要很多时间来处理甚至几个文件。我必须处理20K文件。每个文件都有800K的边缘。可能是如果可以计算出数据分区策略,以确保每个从属边缘将在单个节点上处理,则混洗将会更少。

或者有效解决这个问题的最好方法是什么?

+2

如果你想使用单机和单线程处理数据使用Spark有什么意义? – zero323

+1

我可能是错的。我只是想知道和困惑如何处理数据的火花。我为每个图形文件都创建了单独的RDD,当我运行这个工作时,它只是保持永远的状态。我正在8个节点群集上运行它。 – hsuk

+2

Spark的主要焦点是数据并行性,而核心引擎通用性足以用于某些任务并行性的变体,这通常是一种昂贵的矫枉过正。如果您认为可以在单个节点上处理单个图形,只需使用良好的本地库并使用您最喜欢的调度/管道管理工具并行化任务即可。 – zero323

回答

4

TL; DR Apache Spark并不适合这项工作。

Spark的主要范围是数据并行性,但您要查找的是任务并行性。从理论上讲,核心Spark引擎通用性足以实现有限的任务并行性,但实际上有更好的工具可用于这样的工作,它绝对不是像GraphX和GraphFrames这样的库的目标。

由于数据分布是这些库背后的核心假设,因此他们的算法使用消息传递或加入多级作业结构和混洗中反映的技术来实现。如果数据符合主内存(您可以使用优化的图处理库轻松处理单个节点上数百万条边的图),但这些技术在实践中完全没有用处。

考虑到一块,你已经证明代码,在核图形处理库像igraphNetworkX(更好地记录和更全面可惜内存饿了,稍微slowish)与GNU Parallel结合应该绰绰有余和更在实践中高效。对于更复杂的工作,您可以考虑使用Airflow或Luigi等全功能工作流程管理工具。

+0

你的意思是不幸的效率不高? – hsuk

+0

如果你的意思是Spark不是这个工作的正确工具,那么Spark可以有效处理图形算法的例子。我真的不明白为什么Spark不能成为这项工作的正确工具。 – hsuk

+0

如果上述连接组件功能正常工作,可以用哪种数据解释我。 – hsuk

相关问题