以下文字来自Learning Spark
的第3章传递函数时要注意的一个问题是无意中 序列化包含函数的对象。当你通过 作为对象成员的函数,或包含对其的引用 对象中的字段(例如,self.field),Spark发送整个对象 工作节点,可能比信息位大得多 你需要(见例3-19)。有时这也会导致你的 程序失败,如果你的类包含Python不能的对象 弄清楚如何发泡。
请解释一下作者试图传达的信息。
答案 0 :(得分:1)
分布式系统中的工作者没有共享内存,因此每个工作者必须拥有运行代码可能需要的所有函数,数据等的副本。因此,当您进行应该分发的调用时,您应该尝试通过确保不复制工作人员并不真正需要的东西来减少这种开销。
在此示例中,rdd.filter
是一个矢量化(功能)操作,可以分布在多个工作人员中。它需要一个参数 - 一个函数。作者警告你,如果该函数引用任何对象的字段(属性)(self
是内部术语对象用来引用自己,那么你基本上引用将调用filter
的对象在自己的方法里面的方法),整个对象(实例)将被复制到worker,而不仅仅是一个轻量级的函数。并且该对象可以包含许多引用大量数据的属性。