Apache Spark:为什么许多小数据帧比几个大数据帧慢得多?

时间:2016-03-14 18:45:40

标签: scala apache-spark spark-dataframe bigdata

所以我有以下情况:

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

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

但我发现,在许多小型数据帧上收集/转换为json比在一个巨大的数据帧上更昂贵。 对于大数据帧大约需要6秒钟而所有小型数据帧需要至少20秒。首先,这似乎并不那么重要,但我想在这些10.000参数输入中至少有3000个这样做。

为什么会这样?它似乎不是计算上的差异,而是收集它一次与多次的差异。

1 个答案:

答案 0 :(得分:0)

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

让我们考虑n个元素的10个DataFrame和10个元素的一个。

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

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