我的Spark处理逻辑依赖于长期,昂贵的实例化实用程序对象来执行数据持久性操作。这些对象不仅可能不是Serializable
,而且在任何情况下分配它们的状态可能都是不切实际的,因为所述状态可能包括有状态的网络连接。
我想要做的是在每个执行程序中将这些对象本地实例化,或者在每个执行程序生成的线程中本地实例化。 (任何替代方案都是可以接受的,只要实例化不会发生在RDD中的每个元组上。)
有没有办法编写我的Spark驱动程序,以便它指示执行程序调用一个函数来本地实例化一个对象(并将其缓存在执行程序的本地JVM内存空间中),而不是在其中实例化它。然后驱动程序尝试序列化并将其分发给执行程序?
答案 0 :(得分:1)
可以在分区级别共享对象:
我试过这个:How to make Apache Spark mapPartition work correctly?
使numPartitions的重新分区与执行者数量的倍数相匹配。