Я использую Spark / GraphFrames из Python и из R. Когда я вызываю PageRank на небольшом графике из Python, он работает намного медленнее, чем с R. Почему он намного медленнее с Python, учитывая, что как Python, так и R вызываете одни и те же библиотеки?
Я постараюсь продемонстрировать проблему ниже.
Spark / GraphFrames включает примеры графиков, такие как друзья, как описано на эту ссылку. Это очень маленький ориентированный граф с 6 узлами и 8 ребрами (обратите внимание, что этот пример отличается от других версий GraphFrames).
Когда я запускаю следующий фрагмент кода с R, вычисление PageRank почти не занимает времени:
library(graphframes)
library(sparklyr)
library(dplyr)
nodes <- read.csv('nodes.csv')
edges <- read.csv('edges.csv')
sc <- spark_connect(master = "local", version = "2.1.1")
nodes_tbl <- copy_to(sc, nodes)
edges_tbl <- copy_to(sc, edges)
graph <- gf_graphframe(nodes_tbl, edges_tbl)
ranks <- gf_pagerank(graph, reset_probability = 0.15, tol = 0.01)
print(ranks$vertices)
results <- as.data.frame(ranks$vertices)
results <- arrange(results, id)
results$pagerank <- results$pagerank / sum(results$pagerank)
print(results)
Когда я запускаю аналог с PySpark, это занимает от 10 до 30 минут:
from pyspark.sql import SparkSession
from graphframes.examples import Graphs
if __name__ == '__main__':
sc = SparkSession.builder.master("local").getOrCreate()
g = Graphs(sc).friends()
results = g.pageRank(resetProbability=0.15, tol=0.01)
results.vertices.select("id", "pagerank").show()
results.edges.select("src", "dst", "weight").show()
Я пробовал разные версии Spark и GraphFrames для Python, чтобы они соответствовали настройкам R.
sparklyr
кодовому наборуsc.conf.set("spark.sql.shuffle.partitions", 1)
в начале вашего кода Python - он не будет масштабироваться, но он будет работать быстро на таком маленьком графике (например, более высокий параллелизм не всегда лучше) - person zero323   schedule 05.10.2018spark.sql.shuffle.partitions
. Большое спасибо! - person joel314   schedule 05.10.2018PageRank
будет фактически вызван, вероятно, вindexedEdges
.PageRank
реализован с использованием более старого API, поэтому эти настройки не повлияют на него. - person zero323   schedule 05.10.2018