所以我有以下情况:
我有一个服务,我可以对数据帧中的参数进行一些计算。例如,我正在执行 describe() 操作。我通过和http-post(Array[String]+schema)获取参数,并通过sql上下文上的read.json函数读取它们。
我可以在一个具有 10.000 个参数的大数据帧中获取它,也可以在只有一个参数的 10.000 个小数据帧中获取它。每个都有大约 12.000 行带有时间戳。最后,我需要收集数据帧以将其发送到其他服务以进行进一步计算。由于创建输入的方式,参数方面会更容易。
但是我发现,在许多小数据帧上收集/转换为json比在一个大型数据帧上要昂贵得多。对于大数据帧大约需要 6 秒,所有小数据帧至少需要 20 秒。一方面,这似乎并不那么重要,但我想在这 3000 个参数输入中的至少 10.000 个上执行此操作。
为什么会这样?这似乎不是计算的差异,而是收集一次与多次的区别。
当你调用 collect() 时,Spark 必须提交作业并将数据发送到一个节点。
让我们考虑 10 个包含 n 个元素的数据帧和一个包含 10n 个元素的数据帧。
发送一个大的 collect() -> 10n 个数据,创建一个执行计划和一个作业10 个数据帧 -> 10*collect() ->发送 10*n 个数据,需要生成 10 个执行计划并提交 10 个作业。
当然,这也取决于硬件和网络,即,如果你可以在一个节点上拥有小的数据帧,那么它可能比通过网络发送更快。