在“Spark:The definitive guide”一书中(目前提前发布,文本可能会发生变化),作者建议不要在Spark中使用Pyspark来实现用户定义的功能:
“启动这个Python过程是昂贵的,但真正的成本是将数据序列化为Python。这是昂贵的两个原因,这是一个昂贵的计算,但一旦数据进入Python,Spark无法管理内存这意味着如果工作人员受资源限制,你可能会导致工作者失败(因为JVM和python都在同一台机器上竞争内存)。“
据我所知,Python和JVM之间的工作节点资源竞争可能是一个严重的问题。但这不也适用于司机吗?在这种情况下,根本不反对使用Pyspark。有谁能解释一下驱动程序的情况有何不同?
答案 0 :(得分:1)
如果有的话,这更多地反对使用Python UDF而不是PySpark,并且在较小程度上,可以针对本机(在JVM上实现)UDF进行类似的论证。
您还应注意,vectorized UDFs位于Spark路线图中,因此:
实际成本是将数据序列化为Python
将来可能不再受到关注。
但是,这也不适用于司机?
不是那么多。虽然共享单个节点的资源始终是一个问题(考虑附加服务的共址),但UDF的问题非常具体 - 同一数据必须同时存储在两个不同的上下文中。
例如,如果您选择使用RDD API,则JVM主要用作通信层,而且开销要小得多。因此,对于本机Python计算来说,它是更自然的选择,尽管你可能会找到一些更适合的原生Python工具。
答案 1 :(得分:0)
在您的驱动程序应用程序中,您不一定需要collect
一大堆记录。也许你只是在减少一些统计数据。
这只是典型行为:司机通常会处理统计结果。您的里程可能会有所不同。
另一方面,Spark应用程序通常使用执行程序读入与其内存允许和处理的数据一样多的数据。所以内存管理几乎总是一个问题。
我认为这是本书的区别所在。