多数のグラフ ファイルがあり、各グラフに約 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()
問題は、いくつかのファイルでも処理するのに多くの時間がかかることです。そして、20,000 個のファイルを処理する必要があります。各ファイルには 800K のエッジがあります。すべての依存エッジが単一ノードで処理されることを保証するデータ パーティション戦略を理解できれば、シャッフルは少なくなるでしょう。
または、これを効率的に解決する最善の方法は何ですか?