假设我有大量的图形文件,每个图形有大约 500K 边。我一直在 Apache Spark 上处理这些图形文件,我想知道如何有效地并行化整个图形处理作业。因为现在,每个图形文件都独立于任何其他文件,我正在寻找文件的并行性。所以,如果我有 100 个图形文件,我有 20 个节点集群,我是否可以在每个节点上处理每个文件,所以每个节点将处理 5 个文件。现在,正在发生的事情就像是在多个阶段中处理单个图,这导致了很多洗牌。
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 边。可能是如果可以找出数据分区策略以确保每个相关边都将在单个节点上处理,那么洗牌将会减少。
或者有效解决这个问题的最佳方法是什么?