【问题标题】:Why is collect in SparkR so slow?为什么 SparkR 中的 collect 这么慢?
【发布时间】:2023-03-26 23:47:01
【问题描述】:

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

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

诚然,parquet 文件被压缩,解压所需的时间可能是问题的一部分,但我发现互联网上的其他 cmets 关于 collect 方法特别慢,而且解释方式很少。

我在 sparklyr 中尝试过相同的操作,而且速度要快得多。不幸的是,sparklyr 无法像 SparkR 那样轻松地在连接和过滤器中执行日期路径,所以我一直使用 SparkR。此外,我不相信我可以同时使用这两个包(即使用 SparkR 调用运行查询,然后使用 sparklyr 访问这些 spark 对象)。

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

【问题讨论】:

    标签: r apache-spark sparkr


    【解决方案1】:

    @威尔

    我不知道下面的评论是否真的回答了你的问题,但 Spark 会进行惰性操作。在 Spark(或 SparkR)中完成的所有转换并没有真正创建任何数据,它们只是创建了一个要遵循的逻辑计划。

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

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

    【讨论】:

    • 500K 行的例子只是一个例子,取自 300M 行的表。在我的设置中需要 Spark 才能完成这项工作,但在 Spark 和 R 之间移动数据的速度很慢是一个主要的减速。
    【解决方案2】:

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

    【讨论】:

    • 感谢您的解释和链接。这似乎是 R 和 Spark 之间当前链接中的一个已知弱点,这在 Python 中不是一个问题(但仍然存在)。
    • 另外,刚刚验证了 SparkR 180 秒需要 sparklyr 9 秒。所以这里发生了一些奇怪的事情。
    • 很高兴知道。会看看。 Mb 协议中的新内容。
    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2016-09-28
    • 2020-02-08
    • 2012-07-17
    • 2011-11-07
    • 2015-08-24
    • 2013-08-06
    • 2014-07-16
    相关资源
    最近更新 更多