为什么在SparkR中收集这么慢?

时间:2016-09-19 15:23:05

标签: r apache-spark sparkr

我有一个500K行火花DataFrame,它位于一个镶木地板文件中。我在Spark(RStudio和R 3.3.1)中使用spark 2.0.0和SparkR软件包,所有软件包都运行在具有4个内核和8GB内存的本地计算机上。

为了便于构建我可以在R中工作的数据集,我使用collect()方法将spark DataFrame引入R.这样做大约需要3分钟,这比它需要的时间长得多使用data.table包读取等效大小的CSV文件。

不可否认,镶木地板文件是压缩的,减压所需的时间可能是问题的一部分,但我在互联网上发现其他关于收集方法的评论特别慢,而且解释方式也很少。

我在sparklyr中尝试过相同的操作,而且速度要快得多。不幸的是,sparklyr没有像SparkR一样容易在连接和过滤器内部进行日期路径,因此我不得不使用SparkR。另外,我不相信我可以同时使用这两个包(即使用SparkR调用运行查询,然后使用sparklyr访问这些spark对象)。

有没有人有类似的经验,对SparkR的collect()方法和/或任何解决方案相对缓慢的解释?

2 个答案:

答案 0 :(得分:2)

@Will

我不知道以下评论是否真的回答了你的问题,但Spark做了懒惰的操作。在Spark(或SparkR)中完成的所有转换并不真正创建任何数据,只是创建了一个逻辑计划。

当您运行像collect这样的Actions时,它必须直接从源RDD获取数据(假设您没有缓存或持久化数据)。

如果您的数据不够大并且可以轻松地由本地R处理,那么就不需要使用SparkR。其他解决方案可以缓存您的数据以供频繁使用。

答案 1 :(得分:2)

简短:序列化/反序列化非常慢。 请参阅我的博客http://dsnotes.com/articles/r-read-hdfs上的帖子 然而,它在sparkR和sparklyr中应该同样慢。