多くのグラフファイルがあり、各グラフには約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()
2つのファイルでも処理するには時間がかかります。そして私は20Kファイルのように処理しなければなりません。各ファイルには800Kのエッジがあります。すべての従属エッジが単一ノードで処理されることを確実にするデータパーティション戦略を把握できれば、シャッフルは少なくなります。
これを効率的に解決するにはどうすればよいですか?
シングルマシンとシングルスレッドを使用してデータを処理する場合、Sparkを使用するポイントは何ですか? – zero323
私は間違っているかもしれません。私はスパークがデータをどのように扱うのか不思議で混乱しています。私はすべてのグラフファイルに対して別々のRDDを作成しています。私がそのジョブを実行すると、これまでのステージングはそのままです。私は8ノードクラスタでそれを実行しています。 – hsuk
主なSparkの焦点はデータの並列処理であり、コアエンジンはタスクの並列処理のいくつかのバリエーションで使用するのに十分な汎用性を備えていますが、通常は高価な過度の負荷です。単一のノードで個々のグラフを処理できると仮定した場合は、適切なローカルライブラリを使用し、お気に入りのスケジューリング/パイプライン管理ツールを使用してタスクを並列化するだけです。 – zero323