问题描述
broadcast
用于将对象运送到每个工作程序节点。该对象将在该节点上的所有分区之间共享(并且值/即对象对于集群中的每个节点都是相同的)。广播的目的是在工作节点上的许多不同任务/分区中使用相同数据时节省网络成本。
mapPartitions
相反,是RDD上可用的一种方法map
,仅在分区上像一样工作。是的,您可以定义新的对象,例如jdbc连接,该对象对于每个分区都是唯一的。但是,您不能在不同的分区之间共享它,在不同的节点之间共享就更少。
解决方法
在Spark中,我们使用广播变量使每台机器具有只读的变量副本。我们通常在闭包外部创建一个广播变量(例如闭包所需的查找表)以提高性能。
我们还有一个名为mapPartitions的火花转换运算符,该运算符试图实现同一目的(使用共享变量来提高性能)。例如,在mapPartitions中,我们可以为每个分区共享一个数据库连接。
那么这两者有什么区别?我们可以仅将其用于共享变量吗?