【问题标题】:Apache Spark: Why are many small dataframes so much slower than few big ones?Apache Spark:为什么许多小型数据帧比少数大型数据帧慢得多?
【发布时间】:2016-06-29 23:11:36
【问题描述】:

所以我有以下情况:

我有一项服务,可以对数据框中的参数进行一些计算。例如,我正在执行 describe() 操作。我通过 http-post (Array[String]+schema) 获取了参数,并通过 sql 上下文中的 read.json 函数将它们读入。

我可以在一个具有 10.000 个参数的大数据帧中获取它,也可以在只有一个参数的 10.000 个小数据帧中获取它。每个都有大约 12.000 行带有时间戳。 最后,我需要收集数据帧以将其发送到不同的服务以进行进一步计算。由于输入的创建方式,它会更容易参数化。

但我发现,在许多小型数据帧上进行收集/转换为 json 比在一个巨大的数据帧上要昂贵得多。 对于大数据帧大约需要 6 秒,所有小数据帧至少需要 20 秒。一方面,这似乎并不那么重要,但我想在这 10.000 个参数输入中的至少 3000 个上执行此操作。

为什么会这样?似乎不是计算的区别,而是收集一次和多次收集的区别。

【问题讨论】:

  • "好像不是计算上的区别,而是收集一次和多次收集的区别。"。是的。

标签: scala apache-spark spark-dataframe bigdata


【解决方案1】:

调用 collect() 时,Spark 必须提交作业并将数据发送到一个节点。

让我们考虑 10 个包含 n 个元素的 DataFrame,一个包含 10n 个元素。

一大堆collect() -> 发送10n个数据,创建一个执行计划和一个作业 10个DataFrames -> 10*collect() -> 发送10*n个数据,需要生成10个执行计划,提交10个作业。

当然,这也取决于硬件和网络,即如果您可以在一个节点上拥有小型 DataFrame,那么它可能会比通过网络发送更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2016-10-03
    • 2017-01-25
    • 2017-04-01
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多