可以说我有大量的图形文件,每个图形都有大约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的边缘。可能是如果可以计算出数据分区策略,以确保每个从属边缘将在单个节点上处理,则混洗将会更少。
或者有效解决这个问题的最好方法是什么?
如果你想使用单机和单线程处理数据使用Spark有什么意义? – zero323
我可能是错的。我只是想知道和困惑如何处理数据的火花。我为每个图形文件都创建了单独的RDD,当我运行这个工作时,它只是保持永远的状态。我正在8个节点群集上运行它。 – hsuk
Spark的主要焦点是数据并行性,而核心引擎通用性足以用于某些任务并行性的变体,这通常是一种昂贵的矫枉过正。如果您认为可以在单个节点上处理单个图形,只需使用良好的本地库并使用您最喜欢的调度/管道管理工具并行化任务即可。 – zero323