createDataFrame中的SparkR瓶颈?

时间:2015-10-01 12:55:51

标签: r apache-spark sparkr

我是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秒。我做错了吗?

1 个答案:

答案 0 :(得分:5)

你没有做任何特别错误的事情。这只是不同因素综合作用的结果:

  1. <md-toolbar style="background:indigo" layout="row" layout-align="space-between center"> ... </md-toolbar> 目前(Spark 1.5.1)实施的速度很慢。这是SPARK-8277中描述的已知问题。
  2. 目前的实施与createDataFrame并不合适。
  3. 基础R相对较慢。聪明的人说这是一个功能而不是一个bug,但它仍然需要考虑。
  4. 在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解决。