【问题标题】:Spark: Dangers of using PythonSpark:使用 Python 的危险
【发布时间】:2017-09-22 04:29:49
【问题描述】:

在“Spark:权威指南”一书中(目前为早期版本,文本可能会更改),作者建议不要将 Pyspark 用于 Spark 中的用户定义函数:

“启动这个 Python 进程很昂贵,但真正的成本是将数据序列化到 Python 中。这有两个原因,这是一个昂贵的计算,而且一旦数据进入 Python,Spark 无法管理worker。这意味着如果一个 worker 资源受限,你可能会导致它失败(因为 JVM 和 python 都在同一台机器上竞争内存)。"

我了解 Python 和 JVM 之间对工作节点资源的竞争可能是一个严重的问题。但这不也适用于司机吗?在这种情况下,根本就反对使用 Pyspark。谁能解释一下是什么让司机的情况有所不同?

【问题讨论】:

    标签: python scala apache-spark pyspark user-defined-functions


    【解决方案1】:

    如果有的话,这更像是一个反对使用 Python UDF 的论点,而不是一般的 PySpark,并且在较小程度上,可以对原生(在 JVM 上实现)UDF 提出类似的论点。

    您还应该注意,vectorized UDFs 在 Spark 路线图上,所以:

    真正的成本在于将数据序列化为 Python

    将来可能不再是问题。

    但这不也适用于司机吗?

    没那么多。虽然共享单个节点的资源始终是一个问题(想想附加服务的协同定位),但 UDF 的问题非常具体 - 相同的数据必须同时存储在两个不同的上下文中。

    例如,如果您选择使用 RDD API,则 JVM 主要服务于通信层,并且开销要小得多。因此,它是原生 Python 计算更自然的选择,尽管您可能会发现一些更适合的原生 Python 工具。

    【讨论】:

    • 是的,作者专门指的是 UDF,我试图在问题中指出这一点。至于您对 RDD API 的评论:当我们使用它时,我们仍然将相同的数据存储在两个不同的上下文中,不是吗?
    【解决方案2】:

    在您的驱动程序应用程序中,您不一定需要collect 大量记录。也许您只是在减少一些统计数据。

    这只是典型的行为:司机通常会处理统计结果。您的里程可能会有所不同。

    另一方面,Spark 应用程序通常使用执行程序来读取内存允许的尽可能多的数据并进行处理。所以内存管理几乎总是一个问题。

    我认为这就是这本书的不同之处。

    【讨论】:

    • 当我第一次读到书中的那一段时,我也有类似的想法。但正是这种争论经常导致决定使用更小的机器作为驱动程序。在我看来,这不是使用多少内存的问题(当然,这也很重要),而是我是否能够控制内存使用并防止集群中的所有机器成为资源受限的问题与否。
    猜你喜欢
    • 2011-07-27
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2017-12-25
    • 2021-07-24
    • 2013-03-21
    相关资源
    最近更新 更多