为什么Apache Spark的性能比本地集群上的R差?

时间:2015-06-11 12:54:38

标签: r performance sorting apache-spark

我在本地机器上比较R和Apache Spark的性能,R似乎做得更好。是因为我没有使用集群,还是我做错了什么?

创建数据(create_data.R):

options = commandArgs(trailingOnly = TRUE)
rows = as.numeric(options[1])

perday = 365 / (rows-1) * 6
dates = seq(as.Date('2010-01-01'), as.Date('2015-12-31'), by=perday)
rows = length(dates)
ids = sample(paste0("ID", seq(1:10000)), rows, replace=TRUE)
sales = rpois(rows,50)
categories = sample(paste("Category", sprintf("%02d",seq(1:10))), rows, replace=TRUE)
data = data.frame(dates, ids, sales, categories)

write.csv(data, "/home/phil/performance/data.csv", row.names=FALSE)

测试R(cut.R):

suppressMessages(suppressWarnings(require(dplyr, quietly=TRUE)))

data = read.csv("data.csv")
first_purchase = head(data[order(data$dates, data$ids),],1)

print(first_purchase)

测试Spark(cut.py):

from pyspark import SparkContext

sc = SparkContext("local")

rdd = sc.textFile("data.csv", 2)

# Get rid of header
header = rdd.take(1)[0]
rdd = rdd.filter(lambda line: line != header)

rdd = rdd.map(lambda line: line.split(","))
first_purchase = rdd.takeOrdered(1, lambda x: [x[0],x[1]])[0]
print(first_purchase)

运行完整测试(run_tests.sh):

echo "Creating data"
Rscript create_data.R 5000000
wc -l data.csv

echo "Testing R"
time Rscript cut.R

echo "Testing Spark"
time spark-submit cut.py

测试结果:

$ . run_test.sh
Creating data
5000001 data.csv
Testing R
          dates  ids sales  categories
1264 2010-01-01 ID10    60 Category 01

real    0m12.689s
user    0m12.498s
sys     0m0.187s
Testing Spark
[u'2010-01-01', u'"ID10"', u'60', u'"Category 01"']

real    0m17.029s
user    0m7.388s
sys     0m0.392s

我正在使用Windows 7作为主机系统的VirtualBox中的Ubuntu上运行它,如果这有所不同。

1 个答案:

答案 0 :(得分:1)

Spark是一个分布式计算框架,它的模型是分解工作(任务),其中这些任务是根据从RDD上定义的功能转换中的依赖关系派生的DAG进行调度,序列化和发布的。

即使在本地模式下,所有这些机器都会产生间接成本。与R相比,为单节点执行而设计的R将更快地工作并不出乎意料。

在群集上尝试相同的比较...哦......等待... R只在单个节点(but not for long anymore)中运行。