【发布时间】:2019-03-10 19:57:50
【问题描述】:
我使用来自 Python 和 R 的 Spark/GraphFrames。当我从 Python 对一个小图调用 PageRank 时,它比使用 R 慢很多。为什么使用 Python 会慢得多,考虑到两者Python 和 R 调用相同的库?
我将尝试在下面演示这个问题。
Spark/GraphFrames 包括图形示例,例如 friends,如 this link 中所述。这是一个非常小的有向图,有 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 for Python 以与 R 的设置保持一致。
【问题讨论】:
-
可能是因为代码不完全等效。特别是这些将导致不同数量的分区,并进一步升级到下游。参见例如Spark iteration time increasing exponentially when using join。如果您想让它在某种程度上等同于 Python 代码开头的
sparklyr代码集sc.conf.set("spark.sql.shuffle.partitions", 1)- 它不会扩展,但它会在如此小的图形上快速运行(如 higher parallelism is not always better) -
谢谢你,我想你回答了我的问题。我确实应该补充一点,Python 代码能够在非常大的实例上成功运行(我没有尝试使用 R 的大型实例)。我的印象是它与并行性有关,但我不知道
spark.sql.shuffle.partitions参数。非常感谢! -
乐于助人。我现在没有时间追踪它并找到确切的罪魁祸首,但如果您想进一步调查它,必须在实际调用
PageRank之前引入问题,可能在indexedEdges中。PageRank使用较旧的 API 实现,因此不受此设置的影响。
标签: r apache-spark pyspark sparklyr graphframes