我是Spark,SparkR以及所有HDFS相关技术的新手。我最近安装了Spark 1.5.0并使用SparkR运行了一些简单的代码:
Sys.setenv(SPARK_HOME="/private/tmp/spark-1.5.0-bin-hadoop2.6")
.libPaths("/private/tmp/spark-1.5.0-bin-hadoop2.6/R/lib")
require('SparkR')
require('data.table')
sc <- sparkR.init(master="local")
sqlContext <- sparkRSQL.init(sc)
hiveContext <- sparkRHive.init(sc)
n = 1000
x = data.table(id = 1:n, val = rnorm(n))
Sys.time()
xs <- createDataFrame(sqlContext, x)
Sys.time()
代码立即执行。但是,当我将其更改为n = 1000000
时,大约需要4分钟(两次Sys.time()
次来电之间的时间)。当我在端口:4040的控制台中检查这些作业时,n = 1000
的作业持续时间为0.2秒,n = 1000000
的作业为0.3秒。我做错了吗?
答案 0 :(得分:5)
你没有做任何特别错误的事情。这只是不同因素综合作用的结果:
<md-toolbar style="background:indigo" layout="row" layout-align="space-between center">
...
</md-toolbar>
目前(Spark 1.5.1)实施的速度很慢。这是SPARK-8277中描述的已知问题。createDataFrame
并不合适。在SPARK-8277解决之前,您可以做的事情不多,但您可以尝试两种选择:
使用普通的data.table
代替data.frame
。使用航班数据集(227496行,14列):
data.table
与df <- read.csv("flights.csv")
microbenchmark::microbenchmark(createDataFrame(sqlContext, df), times=3)
## Unit: seconds
## expr min lq mean median
## createDataFrame(sqlContext, df) 96.41565 97.19515 99.08441 97.97465
## uq max neval
## 100.4188 102.8629 3
data.table
写入磁盘并使用dt <- data.table::fread("flights.csv")
microbenchmark::microbenchmark(createDataFrame(sqlContext, dt), times=3)
## Unit: seconds
## expr min lq mean median
## createDataFrame(sqlContext, dt) 378.8534 379.4482 381.2061 380.043
## uq max neval
## 382.3825 384.722 3
直接将数据加载到Spark DataFrame,而不与R直接交互。听起来很疯狂:
spark-csv
我不确定是否真的有必要将可以在R中处理的数据推送到Spark,但不要赘述。
修改强>:
此问题应由Spark 1.6.0中的SPARK-11086解决。